Hazelcast - QueueListener - 多线程或 MDB

Hazelcast - QueueListener - multithreading or MDB

我正在为我的应用使用 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());
        }

    }

Hazelcast IQueue 不支持异步接口。无论如何,异步访问不会更快。 MDB 需要 JMS,这是纯开销。 你真正需要的是多线程执行器。您可以使用默认执行程序:

    private final ExecutorService execService = ForkJoinPool.commonPool();