JMS Connection/ConnectionFactory references with HornetQ
我正在开发一个较旧的应用程序并将其 JMS 系统从 JBoss Messaging 升级到 HornetQ,在此过程中我遇到了一些似乎与该应用程序如何使用和管理有关的问题JMS 连接。这是我第一次大规模接触 JMS(除了简单的玩具使用),所以我想知道当前的成语是……正确、愚蠢还是完全错误?
这是当前系统的工作原理。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | 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(...);
生产者 = session.createProducer(...);
会话和生产者应该始终在一个线程中使用。作为一个会话代表一个线程的使用。 (只要是同步的,您就可以在多个线程中重复使用它)