2017-06-07 4 views
1

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?

Antwort

1

Dies ist das erwartete Verhalten gemäß JMS-Spezifikation, und ich denke nicht, dass es eine Möglichkeit geben kann, das Verbindungsobjekt freizugeben, während eine Art der Nachrichtenverarbeitung im Gange ist. Lesen Sie JMS-Spezifikationen here und unten ist relevant, außer von „4.3.5 Schließen einer Verbindung“:

Wenn eine oder mehrere der Botschaft der Sitzung Verbindung Hörer wird Verarbeitung einer Nachricht an dem Punkt Verbindung nahe aufgerufen wird, alle Einrichtungen dieser Verbindung und ihre Sitzungen müssen für diese Listener verfügbar bleiben, bis sie die Kontrolle an den JMS-Provider zurückgeben.

Wenn der Verbindungsabschluß aufgerufen wird, sollte er nicht zurückkehren, bis die Nachricht ordnungsgemäß beendet wurde. Dies bedeutet, dass alle Nachrichten Listener, die möglicherweise ausgeführt wurden zurückgegeben wurden und alle ausstehende empfangen zurückgegeben haben.

Ich bin nicht sicher, warum Sie so hohe Zahlen für Wiederholungsmechanismus, 10 Versuche, sind zu groß, zu gehen, maximal Ich habe gesehen, bis jetzt 3 mal verwenden möchten, ich glaube, Sie können versuchen Sie es erneut versuchen anpassen Mechanismusnummern, oder kann eine andere Verbindung haben, die für die erneute Zustellung bestimmt ist.

Verwandte Themen