【问题标题】:JMS Connection/ConnectionFactory references with HornetQ使用 HornetQ 的 JMS Connection/ConnectionFactory 引用
【发布时间】:2011-12-25 17:56:45
【问题描述】:

我正在开发一个较旧的应用程序并将其 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 hornetq jboss-messaging


    【解决方案1】:

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

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

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

    所以你应该这样做:

    connection = cf.createConnection(...);

    session = connection.createSession(...);

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-02-12
      • 2014-04-23
      • 2015-07-19
      • 2012-10-29
      • 2015-07-01
      • 2019-05-28
      • 1970-01-01
      • 2020-10-20
      相关资源
      最近更新 更多