ActiveMQ persistent abonnementsinstellingen Door de PERSISTENT-leveringsmodus voor de uitgever in te stellen, kun je persistente abonnementen gebruiken voor abonnees, wat garandeert dat het Pub/Sub-programma alle gepubliceerde berichten ontvangt. Berichtabonnementen zijn onderverdeeld in niet-duurzame abonnementen en duurzame abonnementen, en niet-duurzame abonnementen kunnen alleen berichten ontvangen die naar een onderwerp worden gestuurd wanneer de client actief is, dat wil zeggen wanneer de client offline is; berichten die tijdens deze periode naar het onderwerp worden gestuurd, gaan verloren en worden nooit ontvangen. Wanneer de client offline is, slaat ActiveMQ alle berichten die naar het onderwerp zijn gestuurd op volgens zijn ID, en wanneer de client opnieuw verbinding maakt met ActiveMQ, ontvangt het alle berichten die naar het onderwerp zijn gestuurd wanneer het offline is. Persistente abonnementen verhogen de overhead en hebben telkens maar één actieve gebruiker in een persistent abonnement. Stappen om een persistent abonnement op te zetten: 1. Stel een klant-ID in voor de verbinding; 2. Specificeer een abonnementsnaam voor het onderwerp van het abonnement; De bovenstaande combinatie moet uniek zijn. Code implementeert persistente abonnementen
(1) Bij het gebruik van wachtrij, dat wil zeggen bij het wachtrijen, is er slechts één consument per bericht, dus persistentie is heel eenvoudig, sla het gewoon op in de database
。 Daarna kan elke consument het oppakken en weggooien. Het maakt niet uit of een consument het een tijdje uitzet.
(2) Bij het gebruik van topic, dat wil zeggen bij het abonneren, kan elk bericht meerdere consumenten hebben, wat problematischer is.
Ten eerste, ervan uitgaande dat consumenten gewone consumenten zijn, ------------------------ Na de lancering van <1> activemq werd News 1 uitgebracht, maar helaas beginnen er nu geen consumenten, dat wil zeggen, geen enkele consument heeft zich geabonneerd. Dus
, werd het nieuws verlaten.
<2> Consument 1 startte, verbond met activemq, abonneerde zich en wachtte op een bericht~~
activemq plaatst bericht 2, OK, consument 1 ontvangt het en verwerkt het. Bericht verlaten.
<3> Consumer 2 is ook gelanceerd, verbonden met activemq, geabonneerd en wacht op een bericht~~
activemq publiceert bericht 3, OK, consument 1, consument 2 worden allemaal ontvangen en verwerkt. Bericht verlaten.
<4> Consument 1 is uitgeschakeld.
activemq plaatst bericht 4, OK, consument 2 ontvangt en verwerkt het. Bericht verlaten.
<5> Consument 1 startte opnieuw.
activemq publiceert berichten 5, OK, consument 1 en consument 2 ontvangen en verwerken ze allemaal. Bericht verlaten. ----------------------------- Samengevat: ActiveMQ stuurt simpelweg berichten naar de momenteel gelanceerde consument. Consumenten die uitschakelen, missen veel berichten en kunnen ze niet meer ontvangen.
Als het verzonden bericht belangrijke gebruikerssynchronisatiegegevens is en deze mist, wordt de gebruikersgegevens niet gesynchroniseerd.
Dus, hoe zorg je ervoor dat consumenten gemiste berichten ontvangen wanneer ze opnieuw opstarten?
Het antwoord is een persistent abonnement. -----------------------------
Gewone abonnementen, zonder onderscheid te maken tussen consumenten, als er een paar hoofden in de zaal zijn, gooien een paar gestoomde broodjes. Voor blijvende abonnementen moet je de naam van de consument registreren. Zhang San zei: Ik ben Zhang San, er zijn gestoomde broodjes voor mij, ik kom ze halen. Li Si zei: Ik ben Li Si, er zijn gestoomde broodjes voor mij, ik kom ze halen. activemq schreef de namen van Zhang San en Li Si op.
Dan geeft bij het verdelen van gestoomde broodjes één kop nog steeds een gestoomde broodje. Na de scheiding, toen hij zag dat Zhang San niet sprak, betekende dat dat hij er niet was, dus laat hem maar een gang. Li Si sprak, dus er was geen reden om te blijven.
Zhang San kwam terug, zocht activemq en keek, dit is niet Zhang San, breng snel zijn gestoomde broodjes. Het kan één gestoomd broodje zijn, of 100 gestoomde broodjes, het hangt ervan af hoeveel gestoomde broodjes Zhang San heeft verdeeld sinds hij een tijdje weg was.
activemq onderscheidt consumenten op basis van clientID en abonneenaam. ----------------------------- Maak een verbinding connection = connectionFactory.createConnection(); connection.setClientID("bbb"); Persistente abonnementen vereisen dat je dit instelt. connection.start();
Maak een sessie aan Sessiesessie = connection.createSession(false,Session.AUTO_ACKNOWLEDGE);
Creëer een bestemming Onderwerp = sessie.createTopic("userSyncTopic"); Onderwerpnaam
MessageConsumer consumer = session.createConsumer(topic); Reguliere abonnementen MessageConsumer consument = session.createDurableSubscriber(topic,"bbb"); Persistente abonnementen
Een ander punt is dat de producent van het bericht persistent modus gebruikt bij het verzenden van berichten MessageProducer producer = ...; producer.setDeliveryMode(DeliveryMode.PERSISTENT); Zo niet, dan is het standaard persistent
(5) Als dezelfde "clientID" wordt gebruikt, wordt het beschouwd als dezelfde consument. Als twee programma's dezelfde "clientID" gebruiken, kan er maar één tegelijk verbinding maken met activemq, en de tweede verbinding zal een foutmelding geven.
(6) De instellingen van activemq staan in conf/activemq.xml, en de standaardberichten worden opgeslagen in data/kahadb, en de berichten gaan niet verloren bij het herstarten van activemq.
Je kunt toegang krijgen tot http://localhost:8161/admin/index.jsp: informatie bekijken over huidige wachtrijen, onderwerpen en blijvende abonnees, berichten verzenden en meer.
Je kunt de inhoud in de activemq-jdbc.xml kopiëren en aanpassen, en je kunt het bericht opslaan in andere databases. |