Hi, testing some failover scenarios etc...

When we call cache.getAsync() and the state of the cluster is not active.
It seems to block.

I implemented a cache repository as follows and using Vertx.io. It seems to
block at the cacheOperation.apply(cache)

So when I call myRepo.get(myKey) which underneath applies the
cache.getAsync() function it blocks.

public class IgniteCacheRepository<K,V> implements CacheRepository<K,V> {
    public final long DEFAULT_OPERATION_TIMEOUT = 1000;
    private final TimeUnit DEFAULT_TIMEOUT_UNIT = TimeUnit.MILLISECONDS;

    private Vertx vertx;
    private IgniteCache<K, V> cache;

    public IgniteCacheRepository(Vertx vertx, IgniteCache<K, V> cache) {
        this.vertx = vertx;
        this.cache = cache;
    }

    @Override
    public Future<Void> put(K key, V value) {
        return executeAsync(cache -> cache.putAsync(key, value),
DEFAULT_OPERATION_TIMEOUT, DEFAULT_TIMEOUT_UNIT);
    }

    @Override
    public Future<V> get(K key) {
        return executeAsync(cache -> cache.getAsync(key),
DEFAULT_OPERATION_TIMEOUT, DEFAULT_TIMEOUT_UNIT);
    }

    @Override
    public <T> Future<T> invoke(K key, EntryProcessor<K, V, T>
processor, Object... arguments) {
        return executeAsync(cache -> cache.invokeAsync(key, processor,
arguments), DEFAULT_OPERATION_TIMEOUT, DEFAULT_TIMEOUT_UNIT);
    }

    @Override
    public <T> T cache() {
        return (T) cache;
    }

    /**
     * Adapt Ignite async operation to vertx futures.
     *
     * @param cacheOperation The ignite operation to execute async.
     * @return The value from the cache operation.
     */
    private <T> Future<T> executeAsync(Function<IgniteCache<K, V>,
IgniteFuture<T>> cacheOperation, long timeout, TimeUnit unit) {
        Future<T> future = Future.future();

        try {
            IgniteFuture<T> value = cacheOperation.apply(cache);

            value.listenAsync(result -> {
                try {
                    future.complete(result.get(timeout, unit));
                } catch(Exception ex) {
                    future.fail(ex);
                }
            }, 
VertxIgniteExecutorAdapter.getOrCreate(vertx.getOrCreateContext()));
        } catch(Exception ex) {
            // Catch some RuntimeException that can be thrown by Ignite cache.
            future.fail(ex);
        }

        return future;
    }
}

Reply via email to