【问题标题】:Jms in a swing application best practices when sending message?jms在swing应用中发送消息时的最佳实践?
【发布时间】:2013-01-24 07:04:13
【问题描述】:

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

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

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 保存在某处并重新使用它会更好。当我决定重新使用这些对象时,有什么特别需要注意的吗?

【问题讨论】:

    标签: java queue jms activemq


    【解决方案1】:

    你应该重复使用你能够重复使用的对象。

    由于它是线程安全的,因此该连接可能会重新用于您的整个应用程序。

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

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

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

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

    【讨论】:

    • 感谢您的输入Petter,它非常有用。尤其是关于线程安全和连接池的事情。
    猜你喜欢
    • 2015-02-04
    • 1970-01-01
    • 1970-01-01
    • 2012-12-05
    • 2011-03-07
    • 1970-01-01
    • 2017-09-10
    • 2012-03-13
    • 2012-10-01
    相关资源
    最近更新 更多