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?
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
Nunca mente, eu encontrei-o aqui:
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);
}