目前我正在开发一个独立的 Java 应用程序,该应用程序连接到 Websphere MQ 以发送和接收消息。
流程处于异步模式,我们使用 MessageListener
类实现,以便在消息准备好时从队列中检索消息。使用监听器初始化消费者的代码如下:
if(connection == null)
connection = getJmsConnection();
try {
session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
if (isTopic) {
destination = session.createTopic(destinationName);
} else {
destination = session.createQueue(destinationName);
}
consumer = session.createConsumer(destination);
consumer.setMessageListener(listener);
} catch (JMSException e) {
e.printStackTrace();
}
getJmsConnection()
方法将从池中返回一个连接,该连接是使用 Apache Commons Pool 库实现的。
我的问题是,只要程序正在运行,从池中分配给监听器的连接是否会处于 Activity 状态并绑定(bind)到该监听器?或者连接是间歇性使用的并且可以被其他进程重用?我们的想法是让发送和接收进程重用池中的连接,但我不确定 MessageListener
如何处理分配给它们的连接。
谢谢。
最佳答案
这里的关键对象是 session 而不是连接;该 session 将在此处执行主要的消息消费工作(异步或其他方式)。
建议尝试尽可能广泛地共享连接。临时目标的范围仅限于连接级别。所以使用池化是一个好主意;完全有可能分享这种联系。
但是我也想说,可能值得考虑合并 session 。使用此处的代码,将创建一个新 session ,每次通过该代码,这意味着将创建一个到 WebSphere MQ 队列管理器的新连接。目前尚不清楚其范围有多大,但如果迅速关闭,它可能会成为瓶颈。
关于java - 消息监听器中的 JMS 连接池,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27140595/