Hazelcast - QueueListener - 多线程或 MDB
Posted
技术标签:
【中文标题】Hazelcast - QueueListener - 多线程或 MDB【英文标题】:Hazelcast - QueueListener - multithreading or MDB 【发布时间】:2020-11-06 15:43:18 【问题描述】:我正在为我的应用程序使用 hazel cast IMGD。我使用队列进行内部通信。我在队列中添加了一个项目侦听器,效果很好。每当队列收到消息时,侦听器就会唤醒并完成所需的处理。
问题是它的单线程。有时,处理一条消息需要 30 秒,而队列中的消息只需要等到前一条消息完成处理即可。我被告知使用 Java 执行器服务来拥有一个线程池并为每个线程添加一个项目侦听器,以便可以同时处理多个消息。
有没有更好的方法呢?可能是配置某种 MDB 或使处理异步,以便我的侦听器可以更快地处理消息
@PostConstruct
public void init()
logger.info(LogFormatter.format(BG_GUID, "Starting up GridMapper Queue reader"));
HazelcastInstance hazelcastInstance = dc.getInstance();
queue = hazelcastInstance.getQueue(FactoryConstants.QUEUE_GRIDMAPPER);
queue.addItemListener(new Listener(), true);
class Listener implements ItemListener<QueueMessage>
@Override
public void itemAdded(ItemEvent<QueueMessage> item)
try
QueueMessage message = queue.take();
processor.process(message.getJobId());
catch (Exception ex)
logger.error(LogFormatter.format(BG_GUID, ex));
@Override
public void itemRemoved(ItemEvent<QueueMessage> item)
logger.info("Item removed: " + item.getItem().getJobId());
【问题讨论】:
【参考方案1】:Hazelcast IQueue
不支持异步接口。无论如何,异步访问不会更快。 MDB 需要 JMS,这是纯粹的开销。
你真正需要的是多线程执行器。您可以使用默认执行器:
private final ExecutorService execService = ForkJoinPool.commonPool();
【讨论】:
以上是关于Hazelcast - QueueListener - 多线程或 MDB的主要内容,如果未能解决你的问题,请参考以下文章