2

ローカルホスト Jboss サーバーのキュー名にメッセージを送信することに成功しました。送信したメッセージReceiverQueueを取得する方法、またはキューにメッセージがある場合はキューにメッセージがあるかどうかを確認する方法を教えてください。または、これを行うための最良の方法について何らかの説明を得ることができますか。ありがとうございました

動作する送受信チュートリアルも受け入れられます。キューに送信してそのキューからメッセージを受信するだけで、受け入れられる回答が得られます。

私は春を使用しています。

Bean インジェクションでアプリケーションコンテキストを使用してそれを行うソリューションが必要です..

4

4 に答える 4

5

標準のJMSAPIステップ:
1。サーバーのアクセス詳細を使用してjavax.naming.Contextを作成します

context = new InitialContext(environment)

2.コンテキストでjavax.jms.QueueConnectionFactoryを検索します。工場名はJMSサーバーに固有です

factory = (QueueConnectionFactory)context.lookup(factoryName)

3.javax.jms.QueueConnectionを作成します

connection = factory.createQueueConnection(...)

4.javax.jms.QueueSessionを作成します

session = connection.createQueueSession(...)

5.コンテキストでjavax.jms.Queueを検索します

queue = (Queue) context.lookup(qJndiName)

今までは送信と同じです...
6。セッションでjavax.jms.QueueReceiverを作成します

receiver = session.createReceiver(queue)

7. JMS APIは、メッセージを取得する2つの方法を提供します。7.aいずれかのメソッド
でメッセージを待機します 。7.bクラスにjavax.jms.MessageListenerを実装し、リスナーとして登録します。receiver.receive()

receiver.setMessageListener(this)

JMS APIはonMessage()、新しいメッセージが到着するたびにメソッドを呼び出します。8
.リスナーを開始することを忘れないでください。

connection.start()

9.コンテキストを閉じます(同じプログラムから複数のJMSサーバーにアクセスする場合は非常に重要です)。

context.close()

上記は、スタンドアロンアプリケーションの典型的なソリューションです。EJB環境では、メッセージ駆動型Beanを使用する必要があります。それらのinoはhttp://java.sun.com/javaee/6/docs/tutorial/doc/gipko.htmlにあり、チュートリアルはhttp://schuchert.wikispaces.com/EJB3+Tutorial+5+にあります。 -+ Message + Driven + Beans

これがあなたが求めた実際の例です:

import java.util.Hashtable;
import javax.naming.*;
import javax.jms.*;

public class JMSJNDISample implements MessageListener {

    public static final String JNDI_URL = "jnp://localhost:1099";
    public static final String JNDI_CONTEXT_FACTORY = "org.jnp.interfaces.NamingContextFactory";
    public static final String JMS_USER = null;
    public static final String JMS_PASSWORD = null;
    public static final String JMS_CONNECTION_FACTORY = "MyConnectionFactory";
    public static final String QUEUE_JNDI_NAME = "ReceiverQueue";

    QueueConnection qConn = null;
    QueueSession qSession = null;
    QueueSender qSender = null;
    QueueReceiver qReceiver = null;

    public JMSJNDISample () {
    }


    public void init() throws JMSException, NamingException {
        // Set up JNDI Context
        Hashtable env = new Hashtable();
        env.put(Context.INITIAL_CONTEXT_FACTORY, JNDI_CONTEXT_FACTORY);
        env.put(Context.PROVIDER_URL, JNDI_URL);
        if (JMS_USER != null)
            env.put(Context.SECURITY_PRINCIPAL, JMS_USER);
        if (JMS_PASSWORD != null)
            env.put(Context.SECURITY_CREDENTIALS, JMS_PASSWORD);
        Context jndiContext = new InitialContext(env);

        // Lookup queue connection factory
        QueueConnectionFactory cFactory = (QueueConnectionFactory)jndiContext.lookup(JMS_CONNECTION_FACTORY);

        // Create Connection
        if (JMS_USER == null || JMS_PASSWORD == null)
            qConn = cFactory.createQueueConnection();
        else {
            qConn = cFactory.createQueueConnection(JMS_USER, JMS_PASSWORD);
        }

        // Create Session
        qSession = qConn.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);

        // Lookup Queue
        Queue queue = (Queue) jndiContext.lookup(QUEUE_JNDI_NAME);

        // Create Queue Sender
        qSender = qSession.createSender(queue);

        // Create Queue Receiver
        qReceiver = qSession.createReceiver(queue);
        qReceiver.setMessageListener(this);

        // Start receiving messages
        qConn.start();

        // Close JNDI context
        jndiContext.close();
    }


    public void sendMessage (String str) throws JMSException {
        TextMessage msg = qSession.createTextMessage(str);
        qSender.send(msg);
    }


    public void onMessage (Message message) {
        try {
            if (message instanceof TextMessage) {
                TextMessage textMessage = (TextMessage)message;
                System.out.println("Text Message Received: "+textMessage.getText());
            } else {
                System.out.println(message.getJMSType()+" Message Received");
            }
        } catch (JMSException je) {
            je.printStackTrace();
        }
    }


    public void destroy() throws JMSException {
        if (qSender != null) qSender.close();
        if (qReceiver != null) qReceiver.close();
        if (qSession != null) qSession.close();
        if (qConn != null) qConn.close();
    }


    public static void main(String args[]) {
        try {
            JMSJNDISample sample = new JMSJNDISample();
            // Initialize connetion
            sample.init();
            // Send Message
            sample.sendMessage("Hello World");
            // Wait 2 sec for answer
            Thread.sleep(2000);
            // Disconnect
            sample.destroy();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
于 2010-03-19T16:44:33.970 に答える
2

MessageDrivenBeanにそのキューをリッスンさせる以外に?

編集:ペイロードを作成するためだけにスプリングを使用していますよね?JMSはJavaEE仕様です。実際にメッセージを送受信するためにSpringを使用する必要はありません。キューなどにメッセージがあるかどうかを手動で確認する必要もありません。MDB(MessageDrivenBean)を次のように設定するだけです。

@MessageDriven(activationConfig = {
      @ActivationConfigProperty(
          propertyName = "destinationType", propertyValue = "javax.jms.Queue"),
      @ActivationConfigProperty(
          propertyName = "destination", propertyValue = "queue/myqueue")
     })
public class MyMessageDrivenBean implements MessageListener {
     public void onMessage(Message message) {
         ObjectMessage objMsg = (ObjectMessage) message;
         Payload payload = (Payload)objMsg.getObject();
         //do stuff
}

}

次に、いくつかのJMSメッセージを送信します。

@Stateless
public class QueuerBean implements QueuerLocal {

    @Resource(mappedName = "java:/JmsXA")
    private ConnectionFactory jmsConnectionFactory;
    @Resource(mappedName = "queue/myqueue")
    private Queue queue;

    private void queue(MyPayload payload) {
        try {
            Connection connect = jmsConnectionFactory.createConnection();
            Session session = connect.createSession(false,
                Session.DUPS_OK_ACKNOWLEDGE);
            MessageProducer producer = session.createProducer(queue);
            // create a JMS message and send it
            ObjectMessage objMsg = session.createObjectMessage(payload);
            producer.send(objMsg);
            producer.close();
            session.close();
            connect.close();
        } catch (JMSException e) {
            log.error("Bad thing happened", e);
        }
    }
}

キューは注釈によって構成されます。メッセージが送信されると、JBossは自動的にMDBをトリガーします。

于 2010-03-19T16:40:25.767 に答える
1

Spring でメッセージ駆動型 POJO をセットアップする方法を示す例を次に示します。すでに Spring を使用している場合は、このイディオムに従うことをお勧めします。

キューにあるメッセージの数を確認する部分については、コードではなく、JBOSS の管理コンソールを使用する必要があると思います。

于 2010-03-23T01:51:09.343 に答える
0

HermesJMS ( http://www.hermesjms.com/confluence/display/HJMS/Home ) などのツールを使用して、キュー マネージャーとキューを検査することもお勧めします。これは優れたデバッグ ツールです。

于 2010-03-27T02:06:48.343 に答える