Ich brauche eine Nachricht erneut zuzustellen, wenn sie nicht verarbeitet werden kann, zum Beispiel wegen einer externen Endpunkt Versagen. Also ich bin mit folgenden MDB-Konfiguration (es wert zu erwähnen, dass ich OpenMQ (Glassfish 4.1) bin mit):MDB onMessage() hält die Verbindung bei übermittelst Nachricht
@MessageDriven(mappedName = "MyQueue", name = "MyQueue", activationConfig = {
@ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"),
@ActivationConfigProperty(propertyName = "endpointExceptionRedeliveryAttempts", propertyValue = "10"),
@ActivationConfigProperty(propertyName = "endpointExceptionRedeliveryInterval", propertyValue = "30000")})
Hier ist onMessage() -Methode:
@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();
}
}
Um ein zu Nachricht ist es auch möglich, eine Transaktion rückgängig zu machen, fehlt jedoch OpenMQ die Eigenschaft für Neulieferung Intervall, so dass es nicht Suiten mich:
https://github.com/javaee/openmq/issues/220
https://github.com/javaee/openmq/issues/23
https://github.com/javaee/openmq/issues/134
Alles in allem funktioniert Nachlieferung in Ordnung, außer einem Moment: wenn Nachricht nachgeliefert werden soll, mdb die Verbindung nicht lösen und hält es für endpointExceptionRedeliveryInterval * endpointExceptionRedeliveryAttempts, in meinem Fall 5 Minuten . Da die Standardwerte für maxPoolSize 32 sind, reichen 32 "schlechte" Nachrichten aus, um die MDB zu blockieren.
Gibt es ist Möglichkeit, die Verbindung im Fall einer Nachricht übermittelt zu veröffentlichen?