2013-10-24 20 views
19

Wir verwenden Spring (3.2.4) mit ActiveMQ (5.8.0) in Tomcat (7.0.41) und es ist nicht klar, was die beste Nutzung. Wir möchten JmsTemplate verwenden, um MessageListenerContainer zum Empfangen von Nachrichten zu erzeugen.

Sollten wir Caching in Empfängerseite? (related link)
Arbeitet CachingConnectionFactory mit ActiveMQ und Failover? (related link)
Need useAsyncSend = "true" setzen, wenn wir PooledConnectionFactory benutzen? (related link)
Was ist besser: PooledConnectionFactory oder CachingConnectionFactory?

+0

ich verwendet habe CachingConnectionFactory für die Nachrichtenproduktion (JmsTemplate) und Verbrauch (DefaultMessageListenerContainer) für mehr als ein Jahr mit Spring (3.0.7), ActiveMQ (5.5.0) und Tomcat und keine Probleme erlebt. Im Allgemeinen verarbeitet mein Consumer eine Nachricht aus queue_1 und schließt mit der Veröffentlichung einer Nachricht in queue_2 ab, aber Interaktionen mit der Warteschlange verwenden dieselbe CachingConnectionFactory. – shuttsy

Antwort

30

Von here:

Die Differenz zwischen dem PooledConnectionFactory und dem CachingConnectionFactory ist ein Unterschied in der Umsetzung. einige der folgenden Merkmale sind, die zwischen ihnen unterscheiden:

  • beide Obwohl die PooledConnectionFactory und die CachingConnectionFactory Zustand, dass sie jeder Pool-Verbindungen, Sitzungen und Produzenten, wird der PooledConnectionFactory nicht wirklich einen Cache von mehreren Herstellern erstellen. Es verwendet einfach ein Singleton-Muster, um einen einzelnen zwischengespeicherten Erzeuger auszugeben, wenn einer angefordert wird. Während die CachingConnectionFactory tatsächlich einen Cache erstellt, der mehrere Produzenten enthält, gibt sie einen Produzenten aus dem Cache aus, wenn einer angefordert wird.

  • Die PooledConnectionFactory ist oben auf dem Projekt Apache Commons Pool gebaut Sitzungen der gemeinsamen Nutzung von JMS. Dies ermöglicht eine zusätzliche Kontrolle über den Pool, da Funktionen in Commons Pool nicht von der PooledConnectionFactory verwendet werden. Diese zusätzlichen Features sind wächst die Poolgröße statt blockieren, werfen eine Ausnahme, wenn der Pool erschöpft ist, usw. Sie diese Funktionen Ihren eigenen Commons Pool GenericObjectPool mit Ihren eigenen benutzerdefinierten Einstellungen nutzen können durch das Erstellen und dann reichte dieses Objekt an die PooledConnectionFactory über die setPoolFactory-Methode. Weitere Informationen finden Sie in den folgenden Artikeln: http://commons.apache.org/pool/api-1.4/org/apache/commons/pool/impl/GenericObjectPoolFactory.html

  • Die CachingConnectionFactory kann auch Verbraucher zwischenspeichern. Sie müssen nur vorsichtig sein, wenn Sie diese Funktion verwenden, damit Sie wissen, dass die Kunden gemäß den Regeln im Blogpost zwischengespeichert werden.

  • Am wichtigsten ist jedoch, dass die CachingConnectionFactory mit jeder JMS-konformen MOM funktioniert. Es erfordert nur eine JMS-Verbindungsfactory. Dies ist wichtig, wenn Sie mehr als einen MOM-Anbieter verwenden, der in Unternehmen häufig verwendet wird (dies ist hauptsächlich auf ältere und vorhandene Projekte zurückzuführen). Der wichtige Punkt ist, dass die CachingConnectionFactory sehr gut mit vielen verschiedenen MOM-Implementierungen funktioniert, nicht nur mit ActiveMQ.

Von here:

  • Wenn Sie ActiveMQs gruppierten haben, und die Verwendung Failover-Transport wird berichtet, dass CachingConnectionFactory keine richtige Wahl.

  • Das Problem, das ich habe, ist, dass, wenn ein Feld nach unten geht, sollten wir das Senden von Nachrichten auf der anderen Seite starten, aber es scheint immer noch die alte -Verbindung zu sein (jedes Mal aussenden). Wenn ich das Programm neu starte, wird es wieder verbinden und alles funktioniert.Quelle: Autoreconnect problem with ActiveMQ and CachingConnectionFactory

  • Das Problem besteht darin, dass im Cache gespeicherten Verbindungen zu dem ausgefallenen ActiveMQ waren noch in Gebrauch und erstellt das Problem für den Anwender. Jetzt ist die Auswahl für dieses Szenario PooledConnectionFactory.

  • Wenn Sie ActiveMQ heute verwenden, und die Chancen sind, dass Sie zu einem anderen Broker (JBoss MQ, WebSphere MQ) in Zukunft wechseln, verwenden Sie nicht PooledConnectionFactory, da es eng Paare Ihren Code ActiveMQ.

+0

Dies ist eine gute Gesamtbeschreibung der beiden Fabrik, aber ich würde ein paar Kommentare hinzufügen: Sollten wir Caching in Empfängerseite verwenden? Ich habe in ActiveMQ in Action Book gefunden, dass dies nicht notwendig ist. Arbeitet CachingConnectionFactory mit ActiveMQ und Failover? "Autoreconnect Problem ..." Link enthalten sind 2 entgegengesetzte Antworten, aber es scheint, dass die PooledConnectionFactory wird definitiv funktionieren, also werden wir das verwenden (wir planen nicht, eine andere MOM zu verwenden). Müssen Sie useAsyncSend = "true" setzen, wenn wir PooledConnectionFactory verwenden? Wir wissen es immer noch nicht, aber es sollte kein Problem sein, wenn es eingestellt ist. :) – Krayo

+0

Async sendet: sagt einem Produzenten nicht zu blockieren Warten auf eine Bestätigung für jede Nachricht gesendet: http://activemq.apache.org/async-sends.html (Ich denke, es sollte kein Problem sein) – united

+0

I denken Sie, es ist besser, Ihre neuen Fragen in einer anderen Frage zu stellen;) – united

Verwandte Themen