2011-07-22 17 views
11

Necesito establecer la prioridad del mensaje para que los mensajes de prioridad alta se consuman antes que los receptores de baja prioridad.La prioridad del mensaje JMS no funciona en el mensaje

Primero probé con el método message.setJMSPriority() para establecer la prioridad pero no estaba funcionando en HornetQ y ActiveMQ así que finalmente establecí la prioridad del Productor de mensajes usando el método setPriority() y funciona bien ahora.

¿Por qué Messsge.setJMSPriority() no funciona en ninguna de las implementaciones del proveedor JMS y por qué tenemos que establecer la prioridad del productor, no el mensaje en sí, para establecer la prioridad del mensaje? ¿Cuál es el uso del método Messsge.setJMSPriority() entonces?

Se agradece cualquier sugerencia o comentario.

Respuesta

16

Para responder a esta pregunta, todo lo que necesita hacer es leer los documentos de la API para el método setPrincityJMS y le explica por qué. Aquí está el texto relevante.

Establece el nivel de prioridad para este mensaje.

Los proveedores de JMS configuran este campo cuando se envía un mensaje. Este método se puede usar para cambiar el valor de un mensaje que se ha recibido.

El proveedor de JMS (ActiveMQ, HornetMQ, etc) que establezca la prioridad en el productor en enviar ya sea al valor predeterminado de 4, o para cualquier valor que haya establecido el productor de usar, por lo que establecer el valor antes enviar el mensaje en sí no tendrá ningún efecto.

5

Este es un requisito de especificación JMS.

Debe cambiar la prioridad en el Productor de mensajes.

8
msg.setJMSPriority(9); 

En este código, la prioridad del mensaje se establece en 9, indicando que este es un mensaje de alta prioridad. Sin embargo, cuando se envía el mensaje, el mensaje tendrá una prioridad de 4 (prioridad normal ). ¿La razón? Al igual que la caducidad del mensaje, el proveedor de JMS examinará la propiedad de prioridad de mensaje en el mensaje e invocará el método setJMSPriority anterior a para colocar el mensaje en la cola. Como la prioridad del mensaje predeterminado es 4 (prioridad normal ), la prioridad del mensaje no se establecerá en un mensaje de alta prioridad, como el desarrollador había pensado originalmente.

Al igual que la caducidad de los mensajes, hay dos formas de establecer la prioridad del mensaje: que puede invocar el método setPriority() en el MessageProducer (QueueSender o Tema Editorial) o establecer la prioridad del mensaje al enviar el mensaje:

//set the default message priority for all messages to 9 (high) 
QueueSender qSender = qSession.createSender(requestQ); 
qSender.setPriority(9); 

qSender.send(msg1); 
//this message is low priority 
qSender.send(msg2, DeliveryMode.PERSISTENT, 1, 30000); 

En este ejemplo, msg1 se enviará con una prioridad de 9 (alta prioridad), mientras que msg2 se enviará con una prioridad de 1 (baja prioridad) a .

Cuestiones relacionadas