Sur mes applications JMS, nous utilisons des files d'attente temporaires sur les producteurs pour pouvoir recevoir des réponses des applications grand public.
Je suis confronté exactement au même problème de ma part, comme mentionné dans ce fil: http://activemq.2283324.n4.nabble.com/jira-Created-AMQ-3336-Temporary-Destination-errors-on-HA -failover-in-broker-network-with-Failover-tt-td3551034.html # a3612738
Chaque fois que je redémarrais un courtier arbitraire dans mon réseau, je recevais de nombreuses erreurs comme celle-ci dans mon journal d'application consommateur en essayant d'envoyer une réponse à une file d'attente temporaire:
javax.jms.InvalidDestinationException:
Cannot publish to a deleted Destination: temp-queue://ID:...
Ensuite, j'ai vu la réponse de Gary là-bas suggérant d'utiliser
jms.watchTopicAdvisories=false
comme paramètre d'URL sur le client brokerURL
. J'ai rapidement modifié les URL de mon courtier client avec ce paramètre supplémentaire. Cependant, je vois maintenant des erreurs comme celle-ci lorsque je redémarre mes courtiers en réseau pour ce test de basculement:
javax.jms.JMSException:
The destination temp-queue:
//ID:client.Host-65070-1308610734958-2:1:1 does not exist.
J'utilise la version ActiveMQ 5.5. Et mon URL de courtier client ressemble à ceci:
failover:(tcp://amq-Host1:61616,tcp://amq-Host2.tred.aol.com:61616,tcp://amq-Host3:61616,tcp://amq-Host4:61616)?jms.useAsyncSend=true&timeout=5000&jms.watchTopicAdvisories=false
De plus, voici mon XML de configuration activemq pour l'un des 4 courtiers: amq1.xml
Quelqu'un ici peut-il examiner ce problème et me suggérer l'erreur que je fais dans cette configuration.
Pour clarifier davantage la façon dont je fais la demande-réponse dans mon code:
Il existe un attribut de courtier, org.Apache.activemq.broker.BrokerService # cacheTempDestinations qui devrait aider au basculement: cas. Définissez-le sur true dans la configuration xml et une destination temporaire ne sera pas supprimée immédiatement lorsqu'un client se déconnecte. Un basculement rapide: la reconnexion pourra à nouveau produire et/ou consommer à partir de la file d'attente temporaire.
Il existe une tâche de temporisation basée sur timeBeforePurgeTempDestinations (5 secondes par défaut) qui gère la suppression du cache.
Une mise en garde cependant, je ne vois aucun test dans activemq-core qui utilise cet attribut, donc je ne peux vous donner aucune garantie sur celui-ci.
Des files d'attente temporaires sont créées sur le courtier auquel le demandeur (producteur) dans votre scénario de demande-réponse se connecte. Ils sont créés à partir d'un javax.jms.Session
, ainsi de suite lors de la déconnexion de la session, que ce soit en raison de la déconnexion du client ou de l'échec/du basculement du courtier, ces files d'attente ont définitivement disparu. Aucun des autres courtiers ne comprendra ce que l'on entend lorsqu'un de vos consommateurs tente de répondre à ces files d'attente; d'où votre exception.
Cela nécessite un changement d'architecture dans l'état d'esprit en supposant que vous souhaitez gérer le basculement et conserver tous vos messages. Voici une manière générale d'attaquer le problème:
queue:response.<client id>
. L'ID client peut être un nom standard si vous avez un nombre limité de clients ou un UUID si vous en avez un grand nombre.JMSCorrelationID
et doit être copié de la demande dans le message de réponse.Il s'agit d'une approche similaire à celle adoptée par Apache Camel pour requête-réponse via messagerie .
Une chose à garder à l'esprit est que la file d'attente ne disparaîtra pas lorsque le client le fera, vous devez donc définir une durée de vie sur le message de réponse de sorte qu'il soit supprimé du courtier s'il n'a pas été consommé, sinon vous obtiendrez un arriéré de messages non consommés. Vous devrez également configurer une stratégie de file d'attente de lettres mortes pour éliminer automatiquement les messages expirés .