Setări persistente de abonament ActiveMQ Prin setarea modului de livrare PERSISTENT pentru editor, poți folosi abonamente persistente pentru abonați, ceea ce garantează că programul Pub/Sub primește toate mesajele publicate. Abonamentele la mesaje sunt împărțite în abonamente nedurabile și abonamente durabile, iar abonamentele nedurabile pot primi mesaje trimise către un subiect doar când clientul este activ, adică când clientul este offline, mesajele trimise către subiect în această perioadă se vor pierde și nu vor fi niciodată primite. Când clientul este offline, ActiveMQ va salva toate mesajele trimise subiectului conform ID-ului său, iar când clientul se conectează din nou la ActiveMQ, va primi toate mesajele trimise subiectului când este offline. Abonamentele persistente cresc costurile suplimentare și au doar un singur utilizator activ într-un abonament persistent la un moment dat. Pași pentru a stabili un abonament persistent: 1. Configurarea unui ID de client pentru conexiune; 2. Specifică un nume de abonament pentru subiectul abonamentului; Combinația de mai sus trebuie să fie unică. Codul implementează abonamente persistente
(1) Când se folosește coada, adică la coadă, există un singur consumator per mesaj, deci persistența este foarte simplă, pur și simplu salvează în baza de date
。 Apoi, orice consumator îl poate ridica și arunca de el. Nu contează dacă un consumator o oprește pentru o perioadă.
(2) Când se folosește topic, adică la abonament, fiecare mesaj poate avea mai mulți consumatori, ceea ce este mai problematic.
În primul rând, presupunând că consumatorii sunt consumatori obișnuiți, ------------------------ După lansarea <1> activemq, a fost lansat News 1, dar, din păcate, niciun consumator nu începe acum, adică niciun consumator nu s-a abonat. Deci
, știrile au fost abandonate.
<2> Consumatorul 1 a pornit, s-a conectat la activemq, s-a abonat și a așteptat un mesaj~~
activemq postează mesajul 2, OK, consumatorul 1 îl primește și îl procesează. Abandon al mesajului.
<3> Consumer 2 este de asemenea lansat, conectat la activemq, abonat și așteaptă un mesaj~~
activemq publică mesajul 3, OK, consumator 1, consumator 2 sunt toate primite și procesate. Abandon al mesajului.
<4> Consumatorul 1 este dezactivat.
activemq postează mesajul 4, OK, consumatorul 2 îl primește și îl procesează. Abandon al mesajului.
<5> Consumatorul 1 a început din nou.
ActiveMQ publică mesajele 5, OK, Consumator 1 și Consumator 2, toate le primesc și procesează. Abandon al mesajului. ----------------------------- Ca să rezum: activemq pur și simplu trimite mesaje către consumatorul lansat în prezent. Consumatorii care se opresc vor rata multe mesaje și nu le vor mai putea primi.
Dacă mesajul trimis conține date importante de sincronizare a utilizatorului și le rata, datele utilizatorului nu sunt sincronizate.
Așadar, cum faci ca consumatorii să primească mesaje ratate când reîncep?
Răspunsul este un abonament persistent. -----------------------------
Abonamentele obișnuite, fără a face distincție între consumatori, dacă sunt câteva capete în locație, aruncă câteva chifle aburite. Pentru abonamentele persistente, trebuie să notezi numele consumatorului. Zhang San a spus: Eu sunt Zhang San, sunt chifle la abur pentru mine, mă voi întoarce să le iau. Li Si a spus: Eu sunt Li Si, sunt chifle la abur pentru mine, mă voi întoarce să le iau. activemq a notat numele lui Zhang San și Li Si.
Apoi, când împărțim chiflele aburite, un cap dă totuși o chiflă aburită. După divizare, când a văzut că Zhang San nu a vorbit, a însemnat că nu era acolo, așa că lasă-i una. Li Si a vorbit, deci nu era nevoie să rămână.
Zhang San s-a întors, a căutat active și s-a uitat, acesta nu este Zhang San, adu-i repede chiflele aburite. Poate fi o chiflă la abur sau poate fi 100 de chifle aburite, depinde câte chifle la abur a împărțit Zhang San de când a plecat o perioadă.
activemq distinge consumatorii prin clientID-ul și numele abonatului. ----------------------------- Creează o conexiune connection = connectionFactory.createConnection(); connection.setClientID("bbb"); Abonamentele persistente necesită setarea acestui lucru. conexiune.start();
Creează o sesiune Session session = connection.createSession(false,Session.AUTO_ACKNOWLEDGE);
Creează o destinație Topic topic = session.createTopic("userSyncTopic"); Numele subiectului
MesajConsumator = sesiune.createConsumer(subiect); Abonament regulat MessageConsumer consumer = session.createDurableSubscriber(topic,"bbb"); Abonamente persistente
Un alt aspect este că producătorul mesajului folosește modul persistent atunci când trimite mesaje MesajProducător producător = ...; producer.setDeliveryMode(DeliveryMode.PERSISTENT); Dacă nu, este persistent implicit
(5) Dacă se folosește același "clientID", se consideră același consumator. Dacă două programe folosesc același "clientID", doar unul se poate conecta simultan la activemq, iar a doua conexiune va raporta o eroare.
(6) Setările activemq sunt în conf/activemq.xml, iar mesajele implicite sunt salvate în data/kahadb, iar mesajele nu se vor pierde la repornirea activemq.
Poți accesa http://localhost:8161/admin/index.jsp: poți vedea informații despre cozile curente, subiecte și abonați permanenți, trimite mesaje și multe altele.
Poți copia conținutul din activemq-jdbc.xml și să-l modifici, și poți salva mesajul în alte baze de date. |