1

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 つの接続とセッションを共有することでした。しかし、オブジェクトが不要になるまで接続、セッション、サブスクライバー、およびパブリッシャーを閉じないため、これがオーバーヘッドまたはブロッキングにつながる可能性があるのではないかと心配しています。私がオンラインで見つけたすべての例は、メッセージが送受信された後にすべてを直接閉じます...

前もって感謝します!

4

1 に答える 1

0

クラスを一度にサブスクライバーとパブリッシャーにしたいのはなぜですか?

メッセージング システムを使用するときはいつでも、両方の役割を果たしますが、なぜ同じトピックに対してそれを行うのでしょうか? 自分のメッセージを受け取りたくないはずです。

したがって、トピックの目的は、アプリケーション内の複数の部分または複数のアプリケーション間で使用されることです。1 つはトピックにメッセージを配置し、他のアプリケーションは購読したメッセージを受信します。

また、これは例で見たことも説明しています。メッセージ処理は 1 回限りのものであるため、後で接続を閉じることができます。

ところで、この質問は「java-ee 6」エリア内で行うので、メッセージ駆動型 Bean を使用して、トピック構成にアノテーションを付けて、インフラストラクチャ部分をアプリケーション サーバーに任せることはできませんか?

于 2013-03-13T12:25:11.577 に答える