2017-06-07 4 views
1

たとえば、外部エンドポイントの障害などの理由でメッセージを処理できない場合は、メッセージを再配信する必要があります。MDB onMessage()は、メッセージを再配信する場合に接続を保持します。

ここ
@MessageDriven(mappedName = "MyQueue", name = "MyQueue", activationConfig = { 
@ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"), 
@ActivationConfigProperty(propertyName = "endpointExceptionRedeliveryAttempts", propertyValue = "10"), 
@ActivationConfigProperty(propertyName = "endpointExceptionRedeliveryInterval", propertyValue = "30000")}) 

は、onMessage()メソッドです::

@Override 
    @TransactionAttribute(TransactionAttributeType.REQUIRED) 
    public void onMessage (Message message) 
    { 
    try 
    { 
     //some processing here 
    } 
    catch (JMSException jmsException) 
    { 
     logger.log (Level.SEVERE, "Exception processing notification message", jmsException); 
    } 
    catch (BackingStoreException e) 
    { 
     // because of throwing RuntimeException, the message is going to be redelivered according to mdb configuration params(interval and attempts count) 
     throw new RuntimeException(); 
    } 
    } 

ためには、再配信するだから私は、次のMDBの設定を使用しています(価値は、それは私がopenMQ(Glassfishの4.1)を使用していることは言うまでもあり)メッセージには、トランザクションをロールバックすることも可能ですが、しかしopenMQは再配信間隔のプロパティを欠いので、それはないのスイートをしてくれ:

https://github.com/javaee/openmq/issues/220

0すべてのすべてで

https://github.com/javaee/openmq/issues/134

、再配信は一瞬のほかに、正常に動作します:メッセージが再配信されようとしている場合、MDBは接続を解除し、endpointExceptionRedeliveryInterval * endpointExceptionRedeliveryAttemptsのためにそれを保持していない、私の場合は5分。したがって、maxPoolSizeのデフォルト値が32であるため、mdbをブロックするには32個の「不良」メッセージで十分です。

メッセージを再配信する場合に接続を解除する方法はありますか?

答えて

1

これはJMS仕様による予想される動作であり、何らかのメッセージ処理が進行中に接続オブジェクトを解放する方法がないとは思われません。 JMS仕様にhereを読み、以下の「4.3.5が接続を閉じる」から除い関連性がある:接続のセッションのメッセージリスナーの1つまたは複数が 接続クローズが呼び出された時点でメッセージを処理している場合

を、すべての 接続の機能とそのセッションは、JMSプロバイダに制御を戻すまで、リスナーに対して の利用可能な状態を維持する必要があります。

接続クローズが呼び出されたときは、メッセージ が正常にシャットダウンされるまで返されません。これは、実行中の可能性のあるすべてのメッセージ リスナーが返され、すべて の保留中の受信者が返されたことを意味します。

私はあなたが再試行メカニズムのために、このような高い数字を使用したい理由はわからないが、10の試みがために行くには余りにも大きいです、私が今まで見てきた最大値は3回ですが、私はあなたの再試行を調整しようとすることができると思います機構番号、または再配送専用の別の接続を持つかもしれません。

関連する問題