In asynchronen JMS-message-handling, sobald onMessage() aufgerufen wird, wird die Nachricht aus der Warteschlange gelöscht
Voraussetzung: ich möchte die Nachrichten bleiben in der Warteschlange bis onMessage()
erfolgreich ausgeführt. Wenn jede exception, die auftreten, während der Ausführung von onMessage()
und wenn es nicht behandeln, dann die Nachricht übermittelt, um Zuhörer.
Ich bin mit Glassfish v2 als application server. Ich bin mit OpenMQConnectionFactory und JmsTemplate zu senden-Nachricht in der Warteschlange.
Bitte beachten Sie, dass ich bin nicht mit MDB.
<bean id="openMQConnectionFactory"
class="com.is.br.util.OpenMqConnectionFactoryBean">
<property name="imqAddressList" value="mq://localhost:7676" />
<property name="imqDefaultUsername" value="admin" />
<property name="imqDefaultPassword" value="admin" />
</bean>
Versuchte ich AUTO_ACKNOWLEDGE als acknowledge-Modus, aber im Hörer als Ausnahme-Nachricht wird nicht übermittelt.
MessageProducer.java
public void sendMessage(final String responseStream) {
System.out.println("Enter into IsJmsProducer.sendMessage method");
try {
MessageCreator creator = new MessageCreator() {
public Message createMessage(Session session) {
ObjectMessage message = null;
try {
message = session.createObjectMessage(responseStream);
} catch (Exception e) {
System.out.println("Unable create a JMSMessage");
}
return message;
}
};
System.out.println("Sending message to destination: " + this.destination.toString());
this.jmsTemplate.setSessionAcknowledgeMode(Session.AUTO_ACKNOWLEDGE);
this.jmsTemplate.send(this.destination, creator);
System.out.println("SendMessage to queue successfully.");
} catch (Exception ex) {
System.out.println("SendMessage to queue Fail." + ex);
}
System.out.println("Exit from IsJmsProducer.sendMessage method");
}
SampleJMSConsumer.java
public class SampleJMSConsumer implements MessageListener {
@Override
public void onMessage(Message message) {
throw new RuntimeException();
}
}
Dann habe ich versucht mit this.jmsTemplate.setSessionAcknowledgeMode(Session.CLIENT_ACKNOWLEDGE);
und in den Hörer rief ich message.acknowledge();
und in catch
block rief ich session.recover()
noch Nachricht nicht wieder.
SampleJMSConsumer.java
public class SampleJMSConsumer implements MessageListener {
@Override
public void onMessage(Message message) {
ObjectMessage objectMessage = (ObjectMessage) message;
Object object;
try {
object = objectMessage.getObject();
if (object instanceof String) {
System.out.println("Message received - " + object.toString());
throw new JMSException("JMS exception");
}
message.acknowledge();
} catch (JMSException e) {
session.recover();
}
}
}
Wenn ich das Programm im debug-Modus und ich Nachricht in der Warteschlange im broker-admin-Konsole, ich bin in der Lage, um zu sehen, die Anzahl der Nachrichten, aber sobald onMessage() aufgerufen, die Anzahl der Nachrichten zu reduzieren. Das bedeutet, dass die Nachricht konsumiert wird und aus der Warteschlange gelöscht. Ist, die Nachricht zu betrachten, da "ausgeliefert"?
Bitte helfen Sie mir zu verstehen, warum die Nachricht nicht wieder als Ausnahme auftreten?
Vielen Dank im Voraus.
InformationsquelleAutor Ashwini | 2012-07-16
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich denke, dies ist by design, geliefert, wenn onmessage aufgerufen wird. Wenn Sie möchten, etwas über die Ausnahme, die Sie möglicherweise behandeln mit try catch.
Übernehmen die Nachricht wurde in die Warteschlange mal wieder, Sie wouls wahrscheinlich treffen die gleiche Ausnahme, wenn Sie verbraucht sowieso.
Ack-Mechanismen sollte imo über die Sicherstellung der korrekten Lieferung. Vielleicht, was Sie nach ist eine reject-Mechanismus, wo Sie Fragen, die prpoducerside zum senden einer neuen Nachricht?
InformationsquelleAutor Aksel Willgert
Client Erkennen ist für Sie geeignet. In Ihrem onMessage () - Methode, wenn die Verarbeitung vorbei ist, müssen Sie rufen Sie Erklären andernfalls, wenn es eine Ausnahme, dann Sie don ' T call Acknowledge().
Sitzung.Recovery() Stoppt und startet die Nachrichtenübermittlung. Die Zustellung der Nachricht werden aus den letzten unbestätigten Meldung.
Keine, Nachricht nicht entfernt werden, bis Sie rufen Sie Bestätigen() in der onMessage-Methode bei der Verwendung von CLIENT_ACKNOWLEDGE Sitzung. Ich schlage vor, Sie Lesen wieder mit Ihrem test.
InformationsquelleAutor Shashi
Ich würde vorschlagen, um zu überprüfen, was ist die default-session-Modus für OpenMQ. Es könnte passieren, dass, sobald Sie geöffnet eine Verbindung, Sie können es nicht ändern, so dass angegeben werden muss bei der Verbindung openin.
InformationsquelleAutor Edmondo1984
Sitzung erstellt, in der Verbraucher sollte die session-Modus zu AUTO_ACK /DUPS_OK_ACK. Sie haben noch nicht geteilt-code für das starten der Verbraucher. Sie setzen session-Modus, in Produzenten -, nicht aber Verbraucher.
InformationsquelleAutor Amrish Pandey