たとえば、外部エンドポイントの障害などの理由でメッセージを処理できない場合は、メッセージを再配信する必要があります。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個の「不良」メッセージで十分です。
メッセージを再配信する場合に接続を解除する方法はありますか?