我想在我的JavaEE 6项目中使用JMS(Topic)。我有一个课程,它同时充当主题的出版商和订阅者。以下代码显示了该类中最重要的部分。
public class MessageHandler implements MessageListener {
private static TopicConnectionFactory factory;
private static Topic topic;
private TopicSubscriber subscriber;
private TopicPublisher publisher;
public MessageHandler() throws NamingException, JMSException {
if (factory == null) {
Context context = new InitialContext();
factory = (TopicConnectionFactory) new InitialContext()
.lookup("jms/myfactory");
topic = (Topic) context.lookup("jms/mytopic");
}
TopicConnection connection = factory.createTopicConnection();
connection.start();
TopicSession session = connection
.createTopicSession(false, Session.AUTO_ACKNOWLEDGE);
subscriber = session.createSubscriber(topic);
}
@Override
public void onMessage(Message message) {
try {
ObjectMessage msg = (ObjectMessage) message;
Object someO= msg.getObject();
System.out.println(this + " receives "+someO);
} catch (JMSException e) {
e.printStackTrace();
}
}
public void sendMessage(Object someO) {
try {
ObjectMessage msg = session.createObjectMessage();
msg.setObject(someO);
publisher = session.createPublisher(topic);
publisher.publish(msg);
publisher.close();
} catch (JMSException e) {
e.printStackTrace();
}
}
}
我的问题是,如果这是设计这样一个班级的好方法。我的想法是为订阅和发布共享一个连接和会话。但是我担心这会导致一些开销或阻塞,因为我不会关闭连接,会话,订阅者和发布者,直到不再需要该对象为止。我在网上找到的所有示例都会在发送或接收消息后直接关闭所有内容...
提前致谢!
答案 0 :(得分:0)
为什么您希望该课程立即成为订阅者和发布者?
每当使用消息传递系统时,您可能同时充当两者,但为什么要为同一主题执行此操作,您肯定不希望收到自己的消息?
因此,主题的目的是在应用程序的几个部分之间或几个应用程序之间使用 - 一个是在主题中放置一条消息,另一个是接收他们订阅的消息。
这也解释了你在例子中看到的内容 - 消息处理是一次性的事情,因此可以在之后关闭连接。
顺便说一下,既然你在“java-ee 6”区域内提出这个问题 - 你不能使用消息驱动的bean,注释你的主题配置并让应用服务器为你做基础设施部分吗?