ActiveMQ persistenta prenumerationsinställningar Genom att ställa in PERSISTENT-leveransläget för utgivaren kan du använda persistenta prenumerationer för prenumeranter, vilket garanterar att Pub/Sub-programmet tar emot alla publicerade meddelanden. Meddelandeprenumerationer delas in i icke-varaktiga prenumerationer och varaktiga prenumerationer, och icke-varaktiga prenumerationer kan endast ta emot meddelanden som skickas till ett ämne när klienten är aktiv, det vill säga när klienten är offline, meddelanden som skickas till ämnet under denna period kommer att förloras och aldrig tas emot. När klienten är offline sparar ActiveMQ alla meddelanden som skickas till subjektet enligt dess ID, och när klienten ansluter till ActiveMQ igen får den alla meddelanden som skickats till subjektet när den är offline. Persistenta prenumerationer ökar overhead och har bara en aktiv användare i en persistent prenumeration åt gången. Steg för att upprätta en persistent prenumeration: 1. Skapa ett kund-ID för anslutningen; 2. Ange ett prenumerationsnamn för prenumerationens ämne; Ovanstående kombination måste vara unik. Kod implementerar persistenta prenumerationer
(1) När man använder kö, det vill säga vid kö, finns det bara en konsument per meddelande, så persistens är mycket enkelt, spara det bara i databasen
。 Sedan kan vilken konsument som helst plocka upp den och göra sig av med den. Det spelar ingen roll om en konsument stänger av den ett tag.
(2) När man använder topic, det vill säga vid prenumeration, kan varje meddelande ha flera konsumenter, vilket är mer besvärligt.
Först, om vi antar att konsumenter är vanliga konsumenter, ------------------------ Efter lanseringen av <1> activemq lanserades, news 1 släpptes, men tyvärr startar inga konsumenter nu, det vill säga inga konsumenter har prenumererat. Så
, övergavs nyheten.
<2> Konsument 1 startade, anslöt till activemq, prenumererade och väntade på ett meddelande~~
activemq skickar meddelande 2, OK, konsument 1 tar emot och bearbetar det. Meddelandeavhopp.
<3> Consumer 2 är också lanserad, ansluten till activemq, prenumererad och väntar på ett meddelande~~
activemq publicerar meddelande 3, OK, konsument 1, konsument 2 tas emot och bearbetas alla. Meddelandeavhopp.
<4> Konsument 1 är avstängd.
activemq postar meddelande 4, OK, konsument 2 tar emot och bearbetar det. Meddelandeavhopp.
<5> Konsument 1 startade igen.
activemq publicerar meddelanden 5, OK, konsument 1 och konsument 2 tar emot och bearbetar dem. Meddelandeavhopp. ----------------------------- Sammanfattningsvis: ActiveMQ skickar helt enkelt meddelanden till den nuvarande användaren. Konsumenter som stänger av kommer att missa många meddelanden och inte kunna ta emot dem igen.
Om meddelandet som skickas är viktig användarsynkroniseringsdata och missar den, är användardatan inte synkroniserad.
Så, hur får man konsumenter att få missade meddelanden när de startar om?
Svaret är en bestående prenumeration. -----------------------------
Vanliga prenumerationer, utan att skilja på konsumenter, om det är några huvuden i lokalen, kastar några ångade bullar. För persistenta prenumerationer behöver du registrera användarens namn. Zhang San sa, Jag är Zhang San, det finns ångade bullar till mig, jag kommer tillbaka och hämtar dem. Li Si sa, jag är Li Si, det finns ångade bullar till mig, jag kommer tillbaka och hämtar dem. activemq skrev ner namnen Zhang San och Li Si.
Sedan, när man delar ångade bullar, ger ett huvud fortfarande ett ångat bulle. Efter delningen, när han såg att Zhang San inte talade, betydde det att han inte var där, så lämna honom en. Li Si talade, så det fanns ingen anledning att stanna.
Zhang San kom tillbaka, letade efter activemq och tittade, det här är inte Zhang San, ta med hans ångade bullar snabbt. Det kan vara en ångad bulle, eller 100 ångade bullar, det beror på hur många ångade bullar Zhang San har delat sedan han var borta ett tag.
activemq särskiljer konsumenter efter klientID och abonnentnamn. ----------------------------- Skapa en koppling connection = connectionFactory.createConnection(); connection.setClientID("bbb"); Persistenta prenumerationer kräver att du sätter detta. connection.start();
Skapa en session Sessionsession = connection.createSession(false,Session.AUTO_ACKNOWLEDGE);
Skapa en destination Ämnesämne = session.createTopic("userSyncTopic"); Ämnesnamn
MessageConsumer consumer = session.createConsumer(topic); Regelbunden prenumeration MessageConsumer consumer = session.createDurableSubscriber(topic,"bbb"); Beständiga prenumerationer
En annan punkt är att producenten av meddelandet använder persistent läge när meddelanden skickas MessageProducer producent = ...; producer.setDeliveryMode(DeliveryMode.PERSISTENT); Om inte, är den persistent som standard
(5) Om samma "clientID" används anses det vara samma konsument. Om två program använder samma "clientID" kan endast ett ansluta till activemq samtidigt, och den andra anslutningen rapporterar ett fel.
(6) Inställningarna i activemq är i conf/activemq.xml, och standardmeddelandena sparas i data/kahadb, och meddelandena går inte förlorade vid omstart av activemq.
Du kan komma åt http://localhost:8161/admin/index.jsp: se information om aktuella köer, ämnen och beständiga prenumeranter, skicka meddelanden och mer.
Du kan kopiera innehållet i activemq-jdbc.xml och ändra det, och du kan spara meddelandet i andra databaser. |