2

我刚刚开始获取知识并使用 JMS(activemq)。伪代码如下所示

// 1. TopicConnectionFactory tcf = (TopicConnectionFactory) ctx.lookup("XXConnFactory");

// 2. TopicConnection connection = tcf.createTopicConnection();

// 3. TopicSession topicSession = connection.createTopicSession(false, Session.AUTO_ACKNOWLEDGE);

然后使用 topicSession 我创建发布者并调用 publish() 方法。

问题是,我什么时候初始化 TopicConnection/TopicSession。是否就像我可以初始化一次 TopicConnection 并使用相同的连接来为每个呼叫获取会话?

基本上我想知道哪些可以实例化一次,哪些应该为每次调用实例化。

4

3 回答 3

1
  • 通常管理与 JMS 提供者的TopicConnectionTCP 连接。所以通常一个连接就足够了。
  • TopicSession是一个单线程上下文(用于管理事务),因此在每个线程的基础上都需要它。它很轻。

您可以在 Javadoc 中找到更多详细信息:

来自 Javadoc 的引用Connection

JMS 客户端通常会创建一个连接、一个或多个会话以及许多消息生产者和消费者。

于 2013-09-27T07:52:52.577 回答
1

基本上我想知道哪些可以实例化一次,哪些应该为每次调用实例化。

要回答这个问题,您可以根据需要多次进行初始化。只要您正确释放每个会话并正确关闭连接,这不是问题。

但是从性能的角度来看,应该怎么做呢?

好吧,答案取决于您与队列交互的频率。假设您想偶尔执行一次对队列/主题的读/写,将所有初始化代码放在一个方法中,该方法将初始化会话,读/写数据并关闭它。

但是说,你必须经常执行读/写,初始化会话并将引用保存在实例变量中是个好主意,然后你的方法将简单地使用这个会话来放置数据。

将操作保持在 try-catch 中以捕获任何异常(在所有情况下)。并使用 finally 块关闭会话/连接。

在所有读写结束后,通过 finally 块关闭会话和连接。

于 2013-09-27T08:54:43.627 回答
0

如果您只想创建一个连接,只需调用以下评论一次即可。

       Context ctx  = new InitialContext();

        // lookup the topic connection factory
        TopicConnectionFactory connFactory = (TopicConnectionFactory) ctx
                .lookup("/RemoteConnectionFactory");

        // lookup the topic object
        Topic topic = (Topic) ctx.lookup("java:/"+prop.TOPIC);

        // create a topic connection
        TopicConnection topicConn = connFactory.createTopicConnection(prop.USERPUB,prop.PASSPUB);

          //create topic session
         TopicSession topicSession = topicConn.createTopicSession(true, Session.AUTO_ACKNOWLEDGE);

         //create topic publisher
         MessageProducer topicPublisher = topicSession.createPublisher(topic);
         topicPublisher.setDeliveryMode(DeliveryMode.PERSISTENT);

每次要向主题发布新消息时调用。// 创建消息 message = topicSession.createTextMessage(); message.setText(this.publishMsg);

        // publish the messages
        Long timeLng = System.currentTimeMillis();
        message.setJMSCorrelationID(timeLng.toString());
        topicPublisher.send(message);
        topicSession.commit();

如果要创建新主题,请使用主题名称调用以下内容

       MessageProducer topicPublisher = topicSession.createPublisher(topic);
       topicPublisher.setDeliveryMode(DeliveryMode.PERSISTENT);
于 2014-07-24T11:25:13.310 回答