2013-09-27 82 views
0

我刚开始获得知识并使用JMS(activemq)。伪代码如下所示我应该多久实例一次JMS主题连接和会话

// 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初始化一次,并使用相同的连接为每个调用获取会话?

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

回答

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

你可以找到在Javadoc中更多的细节:

Connection的Javadoc引述:

一个JMS客户端通常创建一个连接n,一个或多个会话,以及一些消息制作者和消费者。

1

基本上我想知道哪些可以一次实例化和 应该被实例化的每个电话。

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

但是从绩效角度来看,应该怎样呢?

那么,答案取决于你与队列交互的频率。假设你想在一段时间内执行一次读/写队列/主题,将所有初始化代码放入一个方法中,这会初始化会话,读/写数据并关闭它。

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

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

毕竟读写结束后,通过finally块关闭会话和连接。

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); 
以下
相关问题