ActiveMQ message de réception de l'événement Un seul message par seconde?

StackOverflow https://stackoverflow.com/questions/390044

  •  23-08-2019
  •  | 
  •  

Question

Nous avons construit une infrastructure d'application basée sur ActiveMQ.

Nous pouvons envoyer et recevoir des messages très bien, et pour la plupart des choses sont partie assez rapide et OK.

Cependant, nous avons remarqué que si nous soumettons un lot de messages « à la fois », disons 5000 messages - que ActiveMQ obtiendra les messages à l'application 3ème partie à l'autre bout assez rapidement, et que cette application traitera aussi assez rapidement, et qu'il en file d'attente des réponses de retour au courtier rapidement aussi, disons moins d'une minute.

Mais pour une raison quelconque, notre VB.NET EXE qui a pris naissance les messages en premier lieu ne semble traiter les messages de retour, il reçoit de façon erratique, faisant parfois environ un par seconde, parfois en prenant des pauses pour une heure et revenir à une par seconde.

Origin (VB.NET EXE which we manage) 
    -> Broker  (which we manage)
        -> (3rd party app) 
            -> back to the same broker 
                -> back to the origin app.

Le récepteur attend le MessageListener de l'événement à partir du code C # téléchargé il y a de ActiveMQ peut-être 9 mois:

Public Delegate Sub MessageListener(ByVal message As NMS.IMessage)
     Member of: NMS

Je pense que ce qui se passe est que MessageListener ne nous donne un message (NMS.IMessage) à mâcher, et c'est ce que nous traitons.

Y at-il un moyen de dire « un événement MessageListener, s'il vous plaît voir s'il y a d'autres messages sur la file d'attente en ce moment et les faire tous »?

Était-ce utile?

La solution

fin de compte, nous pensons que nous savons un peu plus maintenant ce qu'il en est.

Lorsque notre application VB.NET WinForms qui utilise la DLL ActiveMQ se bloque finalement, ce qui tend à faire quelques fois par semaine, nous avons un programme de surveillance qui utilise le pslist Winternals et les services publics PsKill pour récolter le zombie, puis commencer à une nouvelle connexion client.

Lorsque cela se produit, en utilisant jconsole pour analyser le courtier nous montre qui est encore enregistrée la session du zombie, et est donc le nouveau client frais.

Ma théorie est en ce moment que lorsque AMQ voit les deux sessions, il essaie de commencer à distribuer des messages aux deux sessions de style à la ronde. AMQ tente d'envoyer le message au zombie, qui ne répond pas. Après un certain laps de temps (une seconde peut-être) AMQ abandonne et va à la prochaine session dans la liste, le nouveau client frais.

À un certain moment, le courtier ou la pile TCP remarque probablement que le zombie n'a pas gardé sa connexion TCP active et elle le donne; puis l'opération retourne à la normale.

La question devient, comment écrire un client ActiveMQ qui a) ne meurt pas ou b) meurt avec grâce, la fermeture de la session il dans le processus?

Edit: mise à niveau vers la prochaine version de ActiveMQ résolu ce. Nous avons également eu une seule application faisant l'envoi et la réception, mais il n'a pas été threadsafe - donc si elle a reçu alors qu'il essayait d'envoyer cela a causé les accidents. Nous ré-écrit comme deux applications de la console, qui a envoyé des données et qui ont reçu des données. Pas plus d'accidents. Aussi l'ancienne version de ActiveMQ que nous utilisions à l'époque ne pas traiter les accidents avec grâce, la mise à niveau 4.x résolu que.

Autres conseils

Je vous suggère d'avoir signalé ce au Forum utilisateur ainsi que peut-être soulevant une question de soutien que cela ressemble à ce pourrait être une question avec le code client NMS et tous les développeurs NMS sont sur cette liste et pourrait répondre

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top