使用HornetQ的JMS连接/连接工厂引用

使用HornetQ的JMS连接/连接工厂引用,jms,hornetq,jboss-messaging,Jms,Hornetq,Jboss Messaging,我正在开发一个较旧的应用程序,并将其JMS系统从JBoss Messaging升级到HornetQ,在此过程中,我遇到了一些似乎与此应用程序如何使用和管理JMS连接有关的问题。这是我第一次大规模接触JMS(除了简单的玩具用法),所以我想知道当前的习惯用法是否。。。是正确的,愚蠢的,还是完全错误的 以下是当前系统的工作原理 static QueueConnection connection; static boolean isConnected; static void sendSomeMess

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


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

消息系统应该是异步的

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

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

所以你应该这样做:

连接=cf.createConnection(…)

session=connection.createSession(…)

producer=session.createProducer(…)


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

消息系统应该是异步的

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

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

所以你应该这样做:

连接=cf.createConnection(…)

session=connection.createSession(…)

producer=session.createProducer(…)

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