10

指定された JMSCorrelationID に一致するメッセージのみを受信する Java (JRE /JDK / J2EE 1.4) で JMS キューリスナーをインスタンス化するにはどうすればよいですか? ピックアップしようとしているメッセージは、トピックではなくキューに公開されていますが、必要に応じて変更できます。

メッセージをキューに入れるために現在使用しているコードは次のとおりです。

/**
 * publishResponseToQueue publishes Requests to the Queue.
 *
 * @param   jmsQueueFactory             -Name of the queue-connection-factory
 * @param   jmsQueue                    -The queue name for the request
 * @param   response                     -A response object that needs to be published
 * 
 * @throws  ServiceLocatorException     -An exception if a request message
 *                                      could not be published to the Topic
 */
private void publishResponseToQueue( String jmsQueueFactory,
                                    String jmsQueue,
                                    Response response )
        throws ServiceLocatorException {

    if ( logger.isInfoEnabled() ) {
        logger.info( "Begin publishRequestToQueue: " +
                         jmsQueueFactory + "," + jmsQueue + "," + response );
    }
    logger.assertLog( jmsQueue != null && !jmsQueue.equals(""),
                      "jmsQueue cannot be null" );
    logger.assertLog( jmsQueueFactory != null && !jmsQueueFactory.equals(""),
                      "jmsQueueFactory cannot be null" );
    logger.assertLog( response != null, "Request cannot be null" );

    try {

        Queue queue = (Queue)_context.lookup( jmsQueue );

        QueueConnectionFactory factory = (QueueConnectionFactory)
            _context.lookup( jmsQueueFactory );

        QueueConnection connection = factory.createQueueConnection();
        connection.start();
        QueueSession session = connection.createQueueSession( false,
                                    QueueSession.AUTO_ACKNOWLEDGE );

        ObjectMessage objectMessage = session.createObjectMessage();

        objectMessage.setJMSCorrelationID(response.getID());

        objectMessage.setObject( response );

        session.createSender( queue ).send( objectMessage );

        session.close();
        connection.close();

    } catch ( Exception e ) {
        //XC3.2  Added/Modified BEGIN
        logger.error( "ServiceLocator.publishResponseToQueue - Could not publish the " +
                      "Response to the Queue - " + e.getMessage() );
        throw new ServiceLocatorException( "ServiceLocator.publishResponseToQueue " +
                                           "- Could not publish the " +
                      "Response to the Queue - " + e.getMessage() );
        //XC3.2  Added/Modified END
    }

    if ( logger.isInfoEnabled() ) {
        logger.info( "End publishResponseToQueue: " +
                         jmsQueueFactory + "," + jmsQueue + response );
    }

}  // end of publishResponseToQueue method 
4

4 に答える 4

11

キュー接続のセットアップは同じですが、QueueSession を取得したら、レシーバーを作成するときにセレクターを設定します。

    QueueReceiver receiver = session.createReceiver(myQueue, "JMSCorrelationID='theid'");

それから

receiver.receive()

また

receiver.setListener(myListener);
于 2008-09-29T15:25:14.443 に答える
5

ところで、あなたが尋ねた実際の質問ではありませんが、JMS 経由でリクエスト応答を実装しようとしている場合は、この記事を読むことをお勧めします。なぜなら、JMS API は想像よりもかなり複雑であり、これを効率的に行うことはそれよりもはるかに難しいからです。見えます。

特に、JMS を効率的に使用するには、単一のメッセージなどのコンシューマーを作成しないようにする必要があります。

また、JMS API は正しく効率的に使用するのが非常に複雑であるため (特にプーリング、トランザクション、および並行処理を使用する場合) 、JMS 用の Apache Camel の Spring Remoting 実装を使用するなどして、ミドルウェアをアプリケーション コードから隠すことをお勧めします。

于 2008-09-29T16:10:32.227 に答える
0
String filter = "JMSCorrelationID = '" + msg.getJMSMessageID() + "'";
QueueReceiver receiver = session.createReceiver(queue, filter);

ここで、受信者JMSCorrelationIDは に等しいメッセージを取得しますMessageID。これは、リクエスト/レスポンス パラダイムで非常に役立ちます。

または、これを任意の値に直接設定できます。

QueueReceiver receiver = session.createReceiver(queue,  "JMSCorrelationID ='"+id+"'";);

あなたができるよりも、receiver.receive(2000);またはreceiver.setMessageListener(this);

于 2013-10-21T22:19:07.650 に答える