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