java - Jms在swing应用程序中发送消息时的最佳实践?

标签 java queue jms activemq

在我的 java swing 应用程序中,我实现了一个与 jms 服务器通信的 jms 客户端。这工作得很好。

当前,当我的应用程序启动时,我创建一个连接和一个 session :

ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory
connection = connectionFactory.createConnection();
connection.start();
session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);

接下来,当我需要向主题发送消息时,我创建一个主题(用于将消息发送到)、一个临时队列(用于接收回复)、一个生产者(用于发送消息)和一个消费者(用于实际读取)回复):

Destination destination = session.createTopic ...
MessageProducer producer = session.createProducer ...
Destination tempDest = session.createTemporaryQueue(); 
MessageConsumer responseConsumer = session.createConsumer(tempDest);
producer.send(msg);

我想知道这种情况下的最佳做法是什么?

当我需要发送消息时,我可以简单地创建所有内容吗?或者最好将 Destination、MessageProducer、MessageConsumer 保存在某处并重新使用它。当我决定重新使用这些对象时,有什么特别需要注意的吗?

最佳答案

您应该重用您能够重用的对象。

该连接可能会被整个应用程序重复使用,因为它是线程安全的。

session 对象不是线程安全的,在这种情况下,您应该坚持每个线程一个 session 。

你可以作弊。使用 org.apache.activemq.pool.PooledConnectionFactory ,它将设置一个 session 、连接和生产者池。

您仍然需要编写connection.createSession(..)和session.close(),但这只是从池中获取和释放对象。

如果您对并发性有细粒度的控制,那么实际重用对象可能会更容易,但这种情况很少发生。

关于java - Jms在swing应用程序中发送消息时的最佳实践?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14773852/

相关文章:

java - 使用 SimpleDateFormat 在 Java 中无法解析时间

c++ - 在 STL 列表中找到一对,其中只有第一个元素是已知的

java - 无法使用 Spring 向 RabbitMQ 发送消息

java - 在 WAR 文件 (JEE5) 中打包 1 个 WebService 和 2 个 MDB

java - Selenium - 页面对象工厂 - 重新加载后引用同一页面上的元素

java - 如何克隆循环链表

java - 将 String[] 作为参数传递无效

c# - 实现自定义通用列表/队列/堆栈组合的有效方法

java - ActiveMq 队列与服务器

java - 没有回复监听器的 Spring Integration JMS 网关