我正在研究一个较旧的应用程序并将它的JMS系统从JBoss Messaging升级到HornetQ,在这个过程中我遇到了一些似乎与该应用程序如何使用和管理JMS连接有关的陷阱。这是我第一次大规模接触JMS(除了简单的玩具使用),所以我想知道当前的习语是......是正确的,愚蠢的还是错误的?
以下是当前系统的工作原理。
static QueueConnection connection;
static boolean isConnected;
static void sendSomeMessage(Object sendMe) {
if(!isConnected) connect();
}
static void connect() {
// jndi lookup for connection factory
connection = factory.createQueueConnection();
// lambdas in java pseudo code, woot!
connection.onException => disconnect();
connection.start();
isConnected = true;
}
static void disconnect() {
connection.close()
isConnected = false;
}
这样做的要点是,连接被一遍又一遍地用于发送错误之前发送的每条消息,当发生错误时,连接最终会被关闭并重新创建。
我见过的每个例子总是为每条消息创建一个新的连接工厂和一个新的连接,但这些例子并不是大系统的例子,它们只是一个“如何做”的例子。
如果连接工厂被缓存,是否将JMS连接的单个托管引用保持为可接受的习惯用法?是否应该为每条新消息重新创建它们?
重用连接工厂但每次都使用新连接是有意义的吗?
答案 0 :(得分:1)
消息系统应该是异步的......
因此,您应该在应用程序的整个生命周期内保持连接打开。
JMS目前对您必须创建的对象有点冗长,因此您必须创建连接和会话。
所以你应该这样做:
connection = cf.createConnection(...);
session = connection.createSession(...);
producer = session.createProducer(...);
会话和生产者应始终在一个线程中使用。由于会话代表线程使用。 (只要它已同步,您就可以在多个线程中重复使用它)