1

我正在开发一个较旧的应用程序并将其 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 连接的单个托管引用是可接受的习惯用法,是否应该缓存连接工厂?是否应该为每条新消息重新创建它们?

重用连接工厂但每次都使用新连接对我来说有意义吗?

4

1 回答 1

1

消息系统应该是异步的......

因此,您应该在应用程序的整个生命周期中保持连接打开。

JMS 目前对您必须创建的对象有点冗长,因此您必须创建一个连接和一个会话。

所以你应该这样做:

连接 = cf.createConnection(...);

session = connection.createSession(...);

生产者 = session.createProducer(...);

会话和生产者应始终在线程中使用。作为一个会话代表一个线程的使用。(只要它是同步的,您就可以在多个线程中重用它)

于 2011-11-11T03:25:38.213 回答