Эффективно поток из очереди Redisson в другую - PullRequest
0 голосов
/ 06 декабря 2018

Предположим, что распределенная очередь

BlockingQueue<RequestInfo> queueA; // from redisson

, и я выполняю queueA.take в цикле и создаю новый Runnable с использованием объекта RequestInfo и передаю его в ExecutorService с потоками X.Но даже если я использую ограниченный BlockingQueue только размера 1, будет элемент, ожидающий свободного потока, который потенциально может быть обработан с другого компьютера.

Т.е. требуется, чтобы он выполнял только queueA.take если один из потоков X простаивает.

В моем первом подходе я использовал Semaphore, ограниченный X. Это сработало, но это немного странно, так как дублирует ограничение ExecutorService.

Второй подход, который я могу себе представить, это ExecutorService с SynchronousQueue:

new ThreadPoolExecutor(X, X, 0, TimeUnit.MILLISECONDS, new SynchronousQueue<>());

Может ли это работать и есть ли лучшие возможности?

Или я могукаким-то образом создать очередь из Runnable s в Redisson и использовать ее непосредственно в ThreadPoolExecutor?(Де) сериализация будет трудной в тех случаях, я думаю, хотя у меня есть все классы, требуемые в Runnable, доступные при десериализации.

Обновление: похоже, что в Redisson есть «распределенные службы»это могло бы помочь здесь, но они не обязательно более эффективны, так как также используются две очереди, и неясно, можно ли перегружать ExecutorService, поскольку они используют простую неограниченную BlockingQueue в примерах.

Обновление: решение сSynchronousQueue, похоже, не работает

...