JavaEE 6 プロジェクトで JMS (トピック) を使用したいと考えています。トピックのパブリッシャーとサブスクライバーとして同時に機能するクラスが 1 つあります。次のコードは、クラスの最も重要な部分を示しています。
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();
}
}
}
私の質問は、これがそのようなクラスを設計する良い方法であるかどうかです。私のアイデアは、サブスクライブとパブリッシュの両方で 1 つの接続とセッションを共有することでした。しかし、オブジェクトが不要になるまで接続、セッション、サブスクライバー、およびパブリッシャーを閉じないため、これがオーバーヘッドまたはブロッキングにつながる可能性があるのではないかと心配しています。私がオンラインで見つけたすべての例は、メッセージが送受信された後にすべてを直接閉じます...
前もって感謝します!