Pergunta

Eu escrevi um serviço do Windows usando o Apache.NMS e Apcahe.NMS.ActiveMQ (versão 1.0) bibliotecas. O serviço consome mensagens de ActiveMQ de um servidor fornecedor.

O serviço gira-se uma ligação e escuta as mensagens (I manipular o evento OnMessage)

A conexão é uma conexão transacionado assim que eu chamo commit depois de cada mensagem.

Quando o serviço é iniciado, tudo funciona muito bem e fá-lo por um tempo. No entanto, depois que ele foi executado por um tempo, ele deixará de consumir mensagens. Mesmo se eu reiniciar o serviço. Geralmente, leva um reinício do meu serviço eo servidor de fornecedor (tomcat) para começar as coisas novamente. O vendedor insiste que nada está errado em seu lado.

Sem exceções são jogados em ambos os lados (cliente ou servidor). - É apenas 'preso'

Eu deveria considerar o uso Spring.Messaging.Nms?

Foi útil?

Solução

Eu descobri o problema. Depois de estabelecer a ligação ea mensagem ouvinte o serviço entrou em um loop com Thread.Sleep (500). Burro. I reformulado o serviço para iniciar tudo em OnStart e descartá-la em OnStop.

Uma vez que fazendo isso, tudo está funcionando perfeitamente.

erro clássico de ID-10-T que ocorre entre o teclado e cadeira.

Outras dicas

Meu código é um pouco diferente. Em vez de polling em um loop eu configurar um ouvinte que responde a um evento "OnMessage". Meu código é semelhante ao código abaixo. Meu código atual tem muita coisa irrelevante, mas o espírito é o mesmo -. Espero que isso ajude

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.;
}

nós temos apenas se deparar com exatamente o mesmo problema usando um serviço de Net falar com ActiveMQ, mas o nosso trava após apenas cerca de 10-20 mensagens que estão sendo entregues.

tentei com e sem o Spring Framework e é ligeiramente melhor sem (a menos que eu estou imaginando coisas).

Você se importaria a verificação sobre este código e deixar-me saber se ele tem qualquer semelhança com o seu próprio?

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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top