6

私のアプリケーションはJboss7.1.1で実行されています。1分ごとに実行されるスケジューラーがあり、DLQにメッセージがあるかどうかを確認し、DBでいくつかの更新を行う必要があります。

事前定義されたカスタムDLQをリッスンするメッセージコンシューマーを作成しました。問題は、カスタムDLQにメッセージがあることを確認できますが、consumer.receiveNoWait()常にnullを返すことです。

コンシューマーを作成するためのコードは次のとおりです。

/*this is running fine and creating the consumer*/
public DestinationHandlerImpl(ConnectionFactory connectionFactory,
    Destination destination, boolean useTransaction, int delMode,
    boolean isProducer) throws JMSException {
    connection = connectionFactory.createConnection();
    consumer = session.createConsumer(destination);
}

メッセージを消費するコードは次のとおりです(1分ごとに実行されます)。

/*this always return null, event when there are messages in the queue*/
public <T extends BaseEvent> T recieveMessage()
        throws JMSException {

    Message message = consumer.receiveNoWait(); // ----> always return null!!!

    if (message != null && !(message instanceof ObjectMessage)) {
        throw new IllegalArgumentException(
                "message object has to be of type ObjectMessage");
    }

    // Extract the object from the message
    return message == null ? null : (T) ((ObjectMessage) message).getObject();

}

デバッグモードを使用しましたが、コンシューマーの宛先プロパティが正しいキューに設定されていることがわかります。何が間違っているのでしょうか。

4

2 に答える 2

12

それを見つけました、私connection.start()は消費を始める前に追加する必要がありました。

public <T extends BaseEvent> T recieveMessage()
    throws JMSException {

    connection.start(); // --->**added this line**
    Message message = consumer.receiveNoWait(); 

    if (message != null && !(message instanceof ObjectMessage)) {
        throw new IllegalArgumentException(
            "message object has to be of type ObjectMessage");
    }

    // Extract the object from the message
    return message == null ? null : (T) ((ObjectMessage) message).getObject();
}
于 2012-08-01T14:32:29.200 に答える
2

私もその問題を抱えていましたconnection.start()!私にとって実用的な解決策:

;receive(long timeout)の代わりに使用してくださいreceiveNoWait()

Obs .:単純なテストケースではタイムアウトが正常に機能したため、1000ミリ秒ですが、本番環境では念のため、10000ミリ秒で構成しています。私の場合、メッセージを繰り返しながら、受信すると停止しnull(メッセージがなくなる)、その最後の呼び出しで、receive(10000)は完全に10秒間待機します(明らかに)。そのパフォーマンスの問題を軽減するには、非同期アプローチを使用する必要がありました。


編集:また、実装(jbm)によっては、一部のメッセージがプリフェッチされ(消費されるように事前に選択され)、配信ステータスであるためメッセージが使用できなくなる場合があります。

于 2013-07-23T13:59:11.733 に答える