我刚开始获取知识并使用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初始化一次并使用相同的连接为每次调用获取会话?
基本上我想知道哪些可以实例化一次,哪些应该为每次调用实例化。
答案 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);