Pregunta

He escrito un servicio de Windows usando las bibliotecas Apache.NMS y Apcahe.NMS.ActiveMQ (versión 1.0). El servicio consume mensajes de ActiveMQ de un servidor proveedor.

El servicio hace girar una conexión y escucha los mensajes (manejo el evento OnMessage)

La conexión es una conexión transaccionada, así que llamo commit después de cada mensaje.

Cuando se inicia el servicio, todo funciona muy bien y lo hace por un tiempo. Sin embargo, después de que se haya ejecutado durante un tiempo, ya no consumirá mensajes. Incluso si restablezco el servicio. Por lo general, se requiere reiniciar mi servicio Y el servidor del proveedor (tomcat) para que las cosas vuelvan a funcionar. El vendedor insiste en que nada está mal de su parte.

No se lanzan excepciones en ninguno de los lados (cliente o servidor), simplemente está "atascado".

¿Debería considerar usar Spring.Messaging.Nms?

¿Fue útil?

Solución

He descubierto el problema. Después de establecer la conexión y el escucha del mensaje, el servicio entró en un bucle con Thread.Sleep (500). Tonto. Reformulé el servicio para iniciar todo en OnStart y deshacerme de él en OnStop.

Desde que lo hice, todo funciona perfectamente.

Error clásico ID-10-T que ocurre entre el teclado y la silla.

Otros consejos

Mi código es un poco diferente. En lugar de sondear en un bucle, configuré un oyente que responde a un "OnMessage". evento. Mi código es similar al siguiente código. Mi código real tiene muchas cosas irrelevantes, pero el espíritu es el mismo, espero que esto ayude.

factory = new Apache.NMS.ActiveMQ.ConnectionFactory("tcp://activemq:61616");

connection = factory.QueueConnection(factory, "MyQueue", AcknowledgementMode.AutoAcknowledge)

consumer = connection.Session.CreateConsumer(connection.Queue, "2 > 1"); //Get every msg

consumer.Listener += new MessageListener(OnMessage);


private void OnMessage(IMessage message)
{
  //Process message here.;
}

acabamos de encontrar exactamente el mismo problema al usar un servicio .Net que habla con ActiveMQ, pero el nuestro se bloquea después de que solo se entreguen entre 10 y 20 mensajes.

Lo he probado con y sin el marco de resorte y es un poco mejor sin (a menos que esté imaginando cosas).

¿Te importaría revisar este código y avisarme si tiene algún parecido con el tuyo?

ConnectionFactory connectionFactory = new ConnectionFactory("tcp://activemq:61616");

Connection connection = (Connection)connectionFactory.CreateConnection();
connection.Start();

Session session = (Session)connection.CreateSession(AcknowledgementMode.AutoAcknowledge);
IDestination queue = session.GetQueue("test.queue");

MessageConsumer consumer = (MessageConsumer)session.CreateConsumer(queue);

for (int i = 0; i < 1000; i++)
{
    IMessage msg = consumer.Receive();
    if (msg != null)
        Console.WriteLine((msg as ITextMessage).Text);
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top