我应该多久实例化一次JMS主题连接和会话

时间:2013-09-27 07:39:48

标签: java jms message-queue messaging jms-topic

我刚开始获取知识并使用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初始化一次并使用相同的连接为每次调用获取会话?

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

3 个答案:

答案 0 :(得分:1)

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

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

来自Connection的Javadoc的引用:

  

JMS客户端通常会创建一个连接,一个或多个会话以及许多消息生成者和使用者。

答案 1 :(得分:1)

  

基本上我想知道哪些可以实例化一次哪个   应该为每次通话实例化。

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

但从表现的角度来看,应该是什么样的方式?

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

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

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

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

答案 2 :(得分: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);