有关处理以下方案的模式的建议:
将事件分派给消费者的单个线程。每个事件与消费者之间存在1:1(根据事件/消费者ID匹配将每个事件分派给单个消费者)。
消费者以不同的速度处理事件,并且可以使用可配置的批量大小消耗事件(例如,消费者一次可以消耗20个事件)。
生产者线程应始终能够将事件分派给能够使用的消费者。每个使用者维护一个已消耗的事件队列(可能是批处理的)并在其自己的线程上处理这些事件,因此从生产者到消费者的切换是异步的。
如果没有消费者可以在任何时间点消费,那么调度线程会发生什么?
yield()
它wait()
&强迫消费者致电notify()
sleep()
一段固定时间任何理由更喜欢一个而不是另一个?
一些专业人士缺点:
还有其他考虑吗?
答案 0 :(得分:4)
您应该考虑的另一种方法是将其写入BlockingQueue
。让队列管理在没有监听器的情况下发送的请求。
更好:写一个Broker
拥有BlockingQueue
并保持List
Consumers
。当Broker
发送新的List
时,让Consumers
通知Producer
Event
。
自JDK 1.0开始,我将使用Java Bean中内置的PropertyChangeListener
和EventObject
在内存中执行此操作。
答案 1 :(得分:1)
a)你可以选择yield
但是根据环境的好坏,这可能基本上变成了无操作。因此,这基本上与旋转具有相同的结果。
b)睡眠是一个简单的选择,但是你应该想出睡多久。执行sleep(0)
也无济于事,因为它与执行(a)
通知的力量更复杂,但您可以完全控制流量。
答案 2 :(得分:0)
看看JMS。 JMS旨在处理这种用例。
在您的方案中,全面的JMS安装可能过度 - 您没有提供足够的信息。