2008-11-06 7 views
1

J'ai écrit un service Windows à l'aide des bibliothèques Apache.NMS et Apcahe.NMS.ActiveMQ (version 1.0). Le service consomme des messages d'ActiveMQ provenant d'un serveur fournisseur.Le client ActiveMQ .net se bloque

Le service tourne une connexion et à l'écoute des messages (je gérer l'événement OnMessage)

La connexion est une connexion, donc j'appelle traitées engage après chaque message. Lorsque le service démarre, tout fonctionne très bien et le fait pendant un certain temps. Cependant, après qu'il a fonctionné pendant un moment, il ne consommera plus de messages. Même si je réinitialise le service. Il faut généralement un redémarrage de mon service ET le serveur du fournisseur (tomcat) pour faire redémarrer les choses. Le vendeur insiste sur le fait que rien ne va pas de leur côté.

Aucune exception n'est levée de part et d'autre (client ou serveur) - c'est juste 'bloqué'.

Dois-je envisager d'utiliser Spring.Messaging.Nms?

Répondre

3

J'ai découvert le problème. Après avoir établi la connexion et l'écouteur de message, le service est entré dans une boucle avec Thread.Sleep (500). Stupide. J'ai refacturé le service pour tout démarrer dans OnStart et l'éliminer dans OnStop.

Depuis lors, tout fonctionne parfaitement.

Erreur d'ID-10-T classique entre le clavier et le fauteuil.

0

Nous venons de rencontrer exactement le même problème en utilisant un service .Net en train de parler à ActiveMQ, mais le notre se verrouille après seulement 10-20 messages livrés.

L'ai essayé avec et sans le cadre de ressort et c'est légèrement meilleur sans (à moins que j'imagine des choses). Pourriez-vous vérifier ce code et me dire si cela ressemble à la vôtre?

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); 
} 
1

Mon code est un peu différent. Au lieu d'interroger dans une boucle, j'ai mis en place un écouteur qui répond à un événement "OnMessage". Mon code est similaire au code ci-dessous. Mon code contient beaucoup de choses non pertinentes, mais l'esprit est le même - j'espère que cela aidera.

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