Постоянни абонаментни настройки на ActiveMQ Като зададете режима на доставка PERSISTENT за издателя, можете да използвате постоянни абонаменти за абонатите, което гарантира, че програмата Pub/Sub получава всички публикувани съобщения. Абонаментите за съобщения се разделят на неустойчиви и трайни абонаменти, като неустойчивите абонаменти могат да получават съобщения, изпратени към дадена тема, само когато клиентът е активен, тоест когато клиентът е офлайн, съобщенията, изпратени към темата през този период, се губят и никога не се получават. Когато клиентът е офлайн, ActiveMQ запазва всички съобщения, изпратени на субекта според неговия ID, а когато клиентът се свърже отново с ActiveMQ, получава всички съобщения, изпратени на субекта, когато е офлайн. Постоянните абонаменти увеличават натоварването и имат само един активен потребител в постоянен абонамент едновременно. Стъпки за създаване на постоянен абонамент: 1. Настройте клиентски идентификатор за връзката; 2. Посочете име на абонамента за темата на абонамента; Горната комбинация трябва да е уникална. Кодът реализира постоянни абонаменти
(1) При използване на опашка, тоест при опашка, има само един потребител на съобщение, така че персистентността е много проста – просто го запазете в базата данни
。 След това всеки потребител може да я вземе и изхвърли. Няма значение, ако потребителят го изключи за известно време.
(2) При използване на тема, тоест при абонамент, всяко съобщение може да има няколко потребители, което е по-сложно.
Първо, ако приемем, че потребителите са обикновени потребители, ------------------------ След пускането на <1> Activemq беше пуснат новини 1, но за съжаление сега няма потребители, тоест никой потребител не е абониран. Така че
, новината беше изоставена.
<2> Потребител 1 стартира, свърза се с activemq, абонира се и изчака съобщение~~
activemq публикува съобщение 2, Добре, потребител 1 го приема и обработва. Изоставяне на съобщение.
<3> Потребител 2 също е стартиран, свързан с activemq, абонаиран е и чака съобщение~~
Activemq публикува съобщение 3, ОК, Потребител 1, Потребител 2 са всички получени и обработени. Изоставяне на съобщение.
<4> Потребител 1 е изключен.
Activemq публикува съобщение 4, Добре, потребител 2 го приема и обработва. Изоставяне на съобщение.
<5> Потребител 1 започна отново.
Activemq публикува съобщения 5, OK, потребител 1 и потребител 2 всички ги получават и обработват. Изоставяне на съобщение. ----------------------------- В обобщение: Activemq просто изпраща съобщения до текущо стартирания потребител. Потребителите, които се изключват, ще пропуснат много съобщения и няма да могат да ги получават отново.
Ако изпратено съобщение е важна потребителска синхронизация и ги пропуска, потребителските данни не са синхронизирани.
И така, как да накарате потребителите да получават пропуснати съобщения при рестартиране?
Отговорът е постоянен абонамент. -----------------------------
Обикновените абонаменти, без разлика между потребителите, ако има няколко глави в залата, хвърлят няколко задушени питки. За постоянни абонаменти трябва да запишете името на потребителя. Чжан Сан каза: Аз съм Чжан Сан, има парени питки за мен, ще се върна да ги взема. Ли Си каза: Аз съм Ли Си, има парени питки за мен, ще се върна да ги взема. activemq записа имената на Чжан Сан и Ли Си.
След това, когато се разделят задушените питки, едната глава все пак дава задушена питка. След разделянето, когато видя, че Чжан Сан не говори, това означаваше, че го няма, така че му остави едно. Ли Си проговори, така че нямаше нужда да остава.
Чжан Сан се върна, потърси activemq и погледна – това не е Джан Сан, донеси бързо задушените си питки. Може да е една задушена питка, а може и 100 задушени питки, зависи колко парени питки е разделил Чжан Сан, откакто си тръгна за известно време.
Activemq отличава потребителите по clientID и име на абонат. ----------------------------- Създайте връзка connection = connectionFactory.createConnection(); connection.setClientID("bbb"); Постоянните абонаменти изискват настройка на това. connection.start();
Създайте сесия Session session = connection.createSession(false,Session.AUTO_ACKNOWLEDGE);
Създайте дестинация Тема = session.createTopic("userSyncTopic"); Име на темата
MessageConsumer consumer = session.createConsumer(тема); Редовен абонамент MessageConsumer consumer = session.createDurableSubscriber(тема,"bbb"); Постоянни абонаменти
Друг момент е, че производителят на съобщението използва постоянен режим при изпращане на съобщения СъобщениеПродуцент продуцент = ...; producer.setDeliveryMode(DeliveryMode.PERSISTENT); Ако не, по подразбиране е постоянен
(5) Ако се използва един и същ "clientID", се счита за един и същ потребител. Ако две програми използват един и същ "clientID", само едната може да се свърже към activemq едновременно, а втората връзка ще отчете грешка.
(6) Настройките на activemq са в conf/activemq.xml, а стандартните съобщения се запазват в data/kahadb, и съобщенията няма да се загубят при рестартиране на activemq.
Можете да получите достъп до http://localhost:8161/admin/index.jsp: да разглеждате информация за текущи опашки, теми и постоянни абонати, да изпращате съобщения и още.
Можете да копирате съдържанието в activemq-jdbc.xml и да го модифицирате, а съобщението можете да запазите в други бази данни. |