1

動的に追加されたキューの場所をリッスンする単純なメッセージ駆動型 Bean を作成する必要があります。これを実装する方法をいくつか試しましたが、どれもうまくいきませんでした。esb および Java メッセージ キューを使用するアプリケーションがあり、実行時に構成ファイルからキューの場所を読み取ろうとしています。したがって、メッセージ駆動型 Bean にリッスンするキューを伝えます。これが可能かどうかもわかりません。

メッセージリスナーも実装しようとしましたが、ejb モジュールを使用する必要があり、ejb モジュールは main メソッドをサポートしていないため、独自のコンテナー (メッセージ駆動型 Bean など) が必要です。main メソッドの代わりに何を使用すればよいかわかりません。同じ目標を達成するために。クライアントとサービス間の非同期通信を実現する必要があるため、セッション Bean を使用できません。

また、クライアント アプリケーションを使用しようとしましたが (これはオプションの 1 つではありません)、maven プロジェクトは、netbeans でこのタイプのアプリケーションのデバッグおよび実行機能をサポートしていません。

この問題の解決策を知っている人はいますか、少なくともアイデアはありますか?

4

1 に答える 1

1

これは最善の解決策ではないかもしれませんが、次のようなステートフル セッション Bean を使用して JMS メッセージを非同期に受信および処理することは可能です。

package com.example.statefuljms;

import javax.annotation.Resource;
import javax.ejb.Local;
import javax.ejb.Stateful;
import javax.jms.ConnectionFactory;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.Queue;
import javax.jms.QueueConnection;
import javax.jms.QueueReceiver;
import javax.jms.QueueSession;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;

@Stateful
@Local(MessageReceiverLocal.class)
public class MessageReceiver implements MessageReceiverLocal, MessageListener {
    @Resource(mappedName = "ConnectionFactory")
    private ConnectionFactory connectionFactory;

    private QueueConnection connection;

    @Override
    public void start(String queueName) throws JMSException, NamingException {
        Context initialContext = new InitialContext();

        connection = (QueueConnection) connectionFactory.createConnection();
        QueueSession session = (QueueSession) connection.createSession(false,
                Session.AUTO_ACKNOWLEDGE);
        Queue queue = (Queue) initialContext.lookup(queueName);
        QueueReceiver receiver = session.createReceiver(queue);
        receiver.setMessageListener(this);
        connection.start();
    }

    @Remove
    @Override
    public void stop() throws JMSException {
        connection.stop();
        connection.close();
    }

    @Override
    public void onMessage(Message message) {
        // handle message here
    }

}

シングルトンを使用してテストします。

package com.example.statefuljms;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.ejb.EJB;
import javax.ejb.Singleton;
import javax.ejb.Startup;
import javax.jms.JMSException;
import javax.naming.NamingException;

@Startup
@Singleton
public class Test {
    @EJB
    private MessageReceiverLocal messageReceiver;

    @PostConstruct
    public void run() {
        messageReceiver.start("/queue/myQueue");
    }

    @PreDestroy
    public void cleanup() {
        messageReceiver.stop();
    }
}
于 2013-04-20T05:36:02.513 に答える