public PreferCurrentEventLoopGroup(EventLoopGroup delegate) { this.delegate = delegate; for (final EventExecutor child : delegate) { child.submit(new Runnable() { @Override public void run() { if (child instanceof EventLoop) { self.set((EventLoop) child); } } }); // Since this is an optimization, there is no need for us to wait for this task to finish. } }
@Override public <T> Future<T> submit(Callable<T> task) { return next().submit(task); }
@Override public Future<?> submit(Runnable task) { return next().submit(task); }
@Override public <T> Future<T> submit(Runnable task, T result) { return next().submit(task, result); }
/** This is just for use in unit-testing. */ public void waitForEachEventLoop() throws InterruptedException, ExecutionException { for (EventExecutor exec : serverGroup.clientToProxyWorkerPool) { exec.submit(() -> { // Do nothing. }).get(); } }
@Override public Future<?> submit(Runnable task) { return next().submit(task); }
@Override public <T> Future<T> submit(Runnable task, T result) { return next().submit(task, result); }
@Override public <T> Future<T> submit(Callable<T> task) { return next().submit(task); }
@Override public Future<?> submit(Runnable task) { return next().submit(task); }
@Override public <T> Future<T> submit(Runnable task, T result) { return next().submit(task, result); }
@Override public <T> Future<T> submit(Callable<T> task) { return next().submit(task); }
@Override public void close() { if (executor.inEventLoop()) { close0(); } else { executor.submit(new Runnable() { @Override public void run() { close0(); } }).awaitUninterruptibly(); } }
/** This is just for use in unit-testing. */ public void waitForEachEventLoop() throws InterruptedException, ExecutionException { for (EventExecutor exec : serverGroup.clientToProxyWorkerPool) { exec.submit(() -> { // Do nothing. }).get(); } }
@Override public void close() { if (executor.inEventLoop()) { close0(); } else { executor.submit(new Runnable() { @Override public void run() { close0(); } }).awaitUninterruptibly(); } }
@Override public void close() { if (executor.inEventLoop()) { close0(); } else { executor.submit(new Runnable() { @Override public void run() { close0(); } }).awaitUninterruptibly(); } }
PreferCurrentEventLoopHolder(PreferCurrentEventLoopGroup eventLoopGroup, final IdleConnectionsHolderFactory<W, R> holderFactory) { final ArrayList<IdleConnectionsHolder<W, R>> _allElHolders = new ArrayList<>(); allElHolders = _allElHolders; for (final EventExecutor child : eventLoopGroup) { final IdleConnectionsHolder<W, R> newHolder = holderFactory.call(); allElHolders.add(newHolder); child.submit(new Runnable() { @Override public void run() { perElHolder.set(newHolder); } }); } Observable<PooledConnection<R, W>> pollOverAllHolders = Observable.empty(); Observable<PooledConnection<R, W>> peekOverAllHolders = Observable.empty(); for (IdleConnectionsHolder<W, R> anElHolder : allElHolders) { pollOverAllHolders = pollOverAllHolders.concatWith(anElHolder.poll()); peekOverAllHolders = peekOverAllHolders.concatWith(anElHolder.peek()); } pollObservable = pollOverAllHolders; peekObservable = peekOverAllHolders; }
@Test(timeout = 60000) public void testNextInEventloop() throws Exception { final PreferCurrentEventLoopGroup group = new PreferCurrentEventLoopGroup(new NioEventLoopGroup(4)); for (EventExecutor child : group) { Future<Boolean> future = child.submit(new Callable<Boolean>() { @Override public Boolean call() throws Exception { return group.next().inEventLoop(); } }); assertTrue("Current eventloop was not preferred.", future.get(1, TimeUnit.MINUTES)); } } }
@Override public Future<?> submit(Runnable task) { return next().submit(task); }
@Override public <T> Future<T> submit(Runnable task, T result) { return next().submit(task, result); }