2016-05-22 9 views
0

Ich verwende Java mit ActiveMQ zum Senden von Nachrichten von Embedded-Linux. Meine Anforderungen sind, dass Nachrichten beibehalten werden sollten, wenn der Zielbroker nicht verfügbar ist. Ich habe KahaDB als Persistenzadapter gewählt, damit die Nachrichten den Neustart eines Brokers überleben.ActiveMQ persistieren nur bei Bedarf auf Platte

broker = new SslBrokerService(); 

KahaDBPersistenceAdapter kahaDBPersistenceAdapter=new KahaDBPersistenceAdapter(); 
kahaDBPersistenceAdapter.setJournalMaxFileLength(16 * 1024 * 1024); 
broker.setPersistenceAdapter(kahaDBPersistenceAdapter); 

/** Connector setup code */ 
broker.start(); 

Auch wenn ich die maximale Dateigröße auf 16 MB beschränkt haben würde Ich mag auf NUR Nachrichten anhalten, wenn die Ziel Broker/Verbraucher nicht zur Verfügung steht. Der Grund dafür ist, die CPU- und Festplattennutzung zu begrenzen. Beispiel: Nachricht 1 erstellen, Nachricht senden. Wenn eine erfolgreiche Persistenz nicht stattfinden sollte, da ich nicht daran interessiert bin, bereits gesendete Daten erneut zu senden (oder nur im Speicher auftreten sollte). Produce Nachrichten 2,3,4 aber Ziel Broker ist nicht verfügbar, dann bestehen Nachrichten auf der Festplatte so, dass in der unwahrscheinlichen Stilllegung von Borker Nachrichten überleben.

Nachdem ich durch die Dokumentation von ActiveMQ hin und her gegangen bin, habe ich keine Antwort für meinen Anwendungsfall gefunden, also frage ich diese großartige Gemeinschaft, ob das, was ich suche, wirklich möglich ist.

Antwort

1

Sie müssten ein benutzerdefiniertes Plugin schreiben, um genau dieses Szenario zu erhalten. JMS beschreibt keinen Anwendungsfall, um zu bestehen, wenn nur der Verbraucher nicht verfügbar ist, b/c der Zuverlässigkeitsvertrag auch mit dem Hersteller ist. Ich denke, ein Store-and-Forward-Design wäre genau das, wonach Sie suchen. Konfigurieren Sie embeddedBroker so, dass ein static: networkConnector verwendet wird, um es an den Zielbroker zu senden. ActiveMQ wird Nachrichten automatisch an den Zielserver senden, wenn sie verfügbar sind, und sie auf dem eingebetteten Server in eine Warteschlange stellen, wenn der Remote-Broker nicht verfügbar ist.

+0

Ich verwende einen Netzwerk-Connector bereits mit einem eingebetteten Broker. Ich dachte mir aber, dass ich einen eigenen Adapter für meinen Anwendungsfall bauen müsste. Danke für den Vorschlag – rpirsc13