0

次のコードスニペット(スタンドアロンJavaアプリケーション)は、同じクライアントがメッセージリスナーを使用して実装されている場合(Glassfish 3.1を使用)、キューでメッセージを検出することはありません。

ctx = new InitialContext();
connectionFactory = (ConnectionFactory) ctx.lookup("foo.Factory");

partsQueue = (Queue) ctx.lookup("foo.PartsQueue");

conn = connectionFactory.createConnection();
session = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);
consumer = session.createConsumer(partsQueue);

conn.start();

Message msg = null;
int cnt = -1;
do {
    cnt++;
    msg = consumer.receiveNoWait();
} while (msg != null);

        System.out.println("cnt: " + cnt);

コンシューマーの作成後に次のコードを使用すると、リスナーはメッセージを見つけて正常に消費します。

listener = new AssemblerListener(this);
consumer.setMessageListener(listener);
System.out.println("waiting for msgs...");
conn.start();

前述のように、スタンドアロンのJavaクライアントでは、MDBで同期的に何かを実行しようとはしていません。何か案は?ここで同期読み取りが機能しない理由のヒントは見つかりませんでした。この場合、異なるフィルターを使用して2つのメッセージを読み取る必要があるため、メッセージリスナーを使用することは最善のオプションではありません。

4

2 に答える 2

3

これは私がメッセージを受け取る方法です:

    ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory(url);

    // Getting JMS connection from the server
    ConnectionFactory connectionFactory= activeMQConnectionFactory;

    Connection connection = connectionFactory.createConnection();

    // Creating session for sending messages
    Session session = connection.createSession(false,Session.CLIENT_ACKNOWLEDGE);


    // Getting the queue 'TESTQUEUE'
    Destination destination = session.createQueue("queue_name");

    // MessageConsumer is used for receiving (consuming) messages

    MessageConsumer consumer = session.createConsumer(destination);

    connection.start();        

    // Here we receive the message.
    // By default this call is blocking, which means it will wait
    // for a message to arrive on the queue.
    Message message= consumer.receive(500);
    while(message!= null)
    {

        // There are many types of Message and TextMessage
        // is just one of them. Producer sent us a TextMessage
        // so we must cast to it to get access to its .getText()
        // method.
        if (message instanceof TextMessage) 
        {
            TextMessage textMessage = (TextMessage) message;
       //     BytesMessage Byte

            System.out.println("Received message '"+ textMessage.getText() + "'");
        }           
        message = consumer.receive(1);
      }
于 2012-12-12T13:34:52.693 に答える
0

consumer.receiveNoWait()nullその時点でキューが空だった場合に返します。コードが null になった場合、コードはメッセージを再度受信しようとしません。

ループを続けるかconsumer.receive()、メッセージが利用可能になるまでブロックする which を使用する必要があります

于 2012-12-12T13:29:39.403 に答える