Question

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 de fournisseur.

Le service établit une connexion et écoute les messages (je gère l'événement OnMessage)

La connexion étant une transaction, j'appelle commit après chaque message.

Lorsque le service démarre, tout fonctionne très bien et le fait pendant un moment. Cependant, après avoir fonctionné pendant un certain temps, les messages ne seront plus consommés. Même si je réinitialise le service. Il faut généralement un redémarrage de mon service ET du serveur du fournisseur (tomcat) pour que les choses se reprennent. Le vendeur insiste sur le fait que rien ne va de son côté.

Aucune exception n'est générée de part et d'autre (client ou serveur) - c'est simplement "bloqué".

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

Était-ce utile?

La solution

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

Depuis, tout fonctionne parfaitement.

Erreur Classic ID-10-T survenant entre le clavier et le fauteuil.

Autres conseils

Mon code est un peu différent. Au lieu d’interroger dans une boucle, j’ai configuré un écouteur qui répond à un message "OnMessage". un événement. Mon code est similaire au code ci-dessous. Mon code actuel contient beaucoup d'éléments non pertinents, mais l'esprit est le même. J'espère que cela vous 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.;
}

nous rencontrons exactement le même problème en utilisant un service .Net qui parle à ActiveMQ, mais le nôtre se bloque après seulement 10 à 20 messages livrés.

Je l’ai essayé avec et sans le cadre à ressort et c’est un peu mieux sans (sauf si j’imagine des choses).

Pourriez-vous vérifier ce code et me laisser savoir s'il ressemble au 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);
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top