2012-07-26 8 views
17

He intentado googlear esto, pero no he tenido éxito. Si estoy usando AUTO_ACKNOWLEDGE, y tengo un cliente de consumo escrito en Java, ¿cuándo se reconoce el mensaje? Estoy usando un MessageListener que contiene un método onMessage. ¿El acuse de recibo se devuelve al servidor antes del onMessage o después de que se haya completado el onMessage o en algún otro punto? ¡Gracias de antemano por cualquier ayuda que alguien pueda proporcionar!JMS AUTO_ACKNOWLEDGE ¿cuándo se confirma?

Respuesta

19

Compruebe esto one.

Con el modo AUTO_ACKNOWLEDGE, la confirmación es siempre lo último que ocurre implícitamente después de que el manejador onMessage() regrese. El cliente que recibe los mensajes puede obtener un control más preciso sobre la entrega de mensajes garantizados al especificar el modo CLIENT_ACKNOWLEDGE en la sesión de consumo.

El uso de CLIENT_ACKNOWLEDGE permite que la aplicación controle cuando se envía el acuse de recibo. Por ejemplo, una aplicación puede acusar recibo de un mensaje -aliviando así al proveedor JMS de su deber- y realizar un procesamiento adicional de los datos representados por el mensaje. La clave para esto es el método acknowledge() en el objeto Message, como se muestra en el Listado 1.

El método acknowledge() informa al proveedor de JMS que el mensaje ha sido recibido con éxito por el consumidor. Este método arroja una excepción al cliente si ocurre una falla del proveedor durante el proceso de reconocimiento. La falla del proveedor da como resultado que el mensaje sea retenido por el servidor JMS para su reentrega.

+6

¿Qué ocurre si se produce una excepción durante el procesamiento de 'onMessage()'? ¿Se volverá a entregar el mensaje si se establece 'AUTO_ACKNOWLEDGE'? – Geek

+2

@Geek - Si se lanza una excepción enReceive o en el JMSListener, el acuse de recibo no se envía y se volverá a entregar – GameSalutes

+0

Si se reciben mensajes de forma síncrona con AUTO_ACKNOWLEDGE, el mensaje se confirma al llamar al método consumer.receive – Wecherowski

5

CLIENT_ACKNOWLEDGE
Con este modo de acuse de recibo, el cliente reconoce un mensaje consumido llamando al método de reconocimiento del mensaje.

Session session = connection.createSession(false, Session.CLIENT_ACKNOWLEDGE); 
... 
msg = (TextMessage) consumer.receive(); 
//acknowledge 
msg.acknowledge(); 

AUTO_ACKNOWLEDGE
Con este modo de confirmación, la sesión reconoce automáticamente la recepción de un cliente de un mensaje o bien cuando la sesión ha regresado con éxito de una llamada para recibir o cuando la escucha de mensajes de la sesión ha llamado a proceso el mensaje vuelve exitosamente.

Session session = connection.createSession(false,Session.AUTO_ACKNOWLEDGE); 

source
Best example