从Redisson队列高效地流到另一个

时间:2018-12-06 17:03:56

标签: queue redisson

假定分布式队列

BlockingQueue<RequestInfo> queueA; // from redisson

,然后我循环执行queueA.take,并使用Runnable对象创建一个新的RequestInfo并将其馈入带有X线程的ExecutorService中。但是,即使我使用大小仅为1的有界BlockingQueue,在本地也会有一个项目在等待一个空闲线程,该线程可能会从其他计算机上进行处理。

即要求是仅在X个线程之一处于空闲状态时才执行queueA.take

在我的第一种方法中,我使用了一个限制为X的Semaphore。虽然可行,但由于它重复了ExecutorService的限制,因此感觉有点奇怪。

我可以想象的第二种方法是将ExecutorServiceSynchronousQueue一起使用:

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

这行得通吗,还有更好的可能性吗?

或者我可以以某种方式在Redisson中创建Runnable的队列并直接在ThreadPoolExecutor中使用它吗?我想在这些情况下很难进行反序列化,尽管反序列化时我拥有了Runnable所需的所有类。

更新:似乎有"distributed services" in Redisson可以在这里提供帮助,但是它们并不一定要效率更高,因为还使用了两个队列,还不清楚ExecutorService是否可以重载,因为它们使用了一个简单的无边界BlockingQueue在示例中。

更新:使用SynchronousQueue的解决方案似乎不起作用

0 个答案:

没有答案