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的主要内容,如果未能解决你的问题,请参考以下文章

Hazelcast集群服务——Hazelcast介绍

Hazelcast分布式计算的demo

Hazelcast是什么

使用 SmartFoxServer 实现 Hazelcast

Hazelcast 正在使用大量 JVM 线程

hazelcast.xml的默认配置文件