Tengo una aplicación web que publica mensajes en un tema y luego varios servicios de Windows que se suscriben a esos temas, algunos con varias instancias. Si los servicios se están ejecutando cuando se publican los mensajes, todo funciona correctamente, pero si no es así, los mensajes se retienen en las colas que se suscriben a ese tema, pero no se leen cuando los servicios se reinician.
El comportamiento deseado-
Cuando se publica un mensaje en la cadena de tema MyTopic, se lee desde MyTopicQueue solo una vez. Utilizo algunos temas comodín para que cada mensaje se envíe a varias colas, pero varias instancias de un servicio se suscriben a la misma cadena de tema y cada mensaje debe ser leído solo por esas instancias.
Si los suscriptores del tema MyTopic no están en línea cuando se publica el mensaje, los mensajes se conservan en MyTopicQueue.
Cuando los servicios de Windows que se suscriben a un tema particular vuelven a estar en línea, cada mensaje retenido es leído desde MyTopicQueue por un solo suscriptor.
Encontré alguna documentación irregular [normalmente para IBM] sobre las opciones MQSUBRQ y MQSO_PUBLICATIONS_ON_REQUEST, pero no estoy seguro de cómo debo configurarlas. ¿Puede alguien ayudarme a averiguar qué debo hacer para obtener el comportamiento deseado? [Aparte de volver a cambiar a RabbitMQ, lo cual no puedo hacer, aunque lo preferiría.]
Mis opciones:
private readonly int _openOptions = MQC.MQSO_CREATE | MQC.MQSO_FAIL_IF_QUIESCING | MQC.MQSO_MANAGED; private readonly MQGetMessageOptions _messageOptions = new MQGetMessageOptions()Código para abrir el Tema:
_topic = _queueManager.AccessTopic(_settings.TopicString, null, MQC.MQTOPIC_OPEN_AS_SUBSCRIPTION, _openOptions);La línea de código que lee del tema (tomado de un bucle):
_topic.Get(mqMessage, _messageOptions);Si desea que los mensajes se acumulen mientras no está conectado, debe hacer que la suscripción sea duradera agregando MQC.MQSO_DURABLE . Para poder reanudar una suscripción existente, agregue MQC.MQSO_RESUME además de MQC.MQSO_CREATE .
Tenga cuidado con la terminología, lo que describe como mensajes retenidos es una suscripción duradera.
Las publicaciones retenidas son otra cosa en la que MQ puede retener un mensaje publicado más recientemente sobre cada tema y este mensaje será recuperado por los nuevos suscriptores de forma predeterminada a menos que usen MQSO_NEW_PUBLICATIONS_ONLY para omitir la recepción de la publicación retenida.
MQSO_PUBLICATIONS_ON_REQUEST permite que un suscriptor solo reciba publicaciones retenidas a pedido, no recibirá publicaciones no retenidas.
Si desea que varios consumidores trabajen juntos en una sola suscripción, tiene dos opciones:
CLONESUPP .