ActiveMQ kalıcı abonelik ayarları Yayıncı için PERSISTENT teslimat modunu ayarlayarak, aboneler için kalıcı abonelikler kullanabilirsiniz; bu da Pub/Sub programının tüm yayınlanmış mesajları almasını garanti eder. Mesaj abonelikleri, kalıcı olmayan abonelikler ve kalıcı abonelikler olarak ayrılır; kalıcı olmayan abonelikler yalnızca istemci aktifken, yani istemci çevrimdışı olduğunda, konuya gönderilen mesajlar kaybolur ve asla alınmaz. İstemci çevrimdışı olduğunda, ActiveMQ kendi kimliğine göre konnaya gönderilen tüm mesajları kaydeder ve istemci tekrar ActiveMQ'ya bağlandığında, çevrimdışı olduğunda ona gönderilen tüm mesajları alır. Sürekli abonelikler genel giderleri artırır ve aynı anda sadece bir aktif kullanıcı kalıcı abonelikte olur. Kalıcı abonelik kurmanın adımları: 1. Bağlantı için bir müşteri kimliği oluşturun; 2. Abonelik konusu için bir abonelik adı belirtin; Yukarıdaki kombinasyon benzersiz olmalı. Kod, kalıcı abonelikleri uygular
(1) Kuyruk kullanıldığında, yani sıraya girerken, her mesaj için sadece bir tüketici olur, bu yüzden kalıcı olmak çok basittir, sadece veritabanına kaydedin
。 Sonra, herhangi bir tüketici onu alıp elden çıkarabilir. Bir tüketici bir süreliğine kapatsa da fark etmez.
(2) Konu kullanıldığında, yani abone olunca her mesajın birden fazla kullanıcısı olabilir ki bu da daha sorunludur.
Birincisi, tüketicilerin sıradan tüketici olduğunu varsayarsak, ------------------------ <1> lansmanından sonra activemq piyasaya sürüldü, haber 1 yayınlandı, ancak ne yazık ki artık hiçbir tüketici başlamadı, yani abone olmadı. Yani
, haber terk edildi.
<2> Tüketici 1 başladı, activemq'ya bağlandı, abone oldu ve mesaj bekledi~~
activemq mesaj 2 gönderiyor, tamam, tüketici 1 mesajı alıyor ve işliyor. Mesajın terk edilmesi.
<3> Tüketici 2 de açıldı, activemq'ya bağlı, abone oldu ve bir mesaj bekliyor~~
activemq mesaj 3, OK, tüketici 1, tüketici 2 mesajlarını yayınlar, hepsi alınır ve işlenir. Mesajın terk edilmesi.
<4> Tüketici 1 kapalı.
activemq mesaj 4 gönderiyor, tamam, tüketici 2 mesajı alıyor ve işliyor. Mesajın terk edilmesi.
<5> Tüketici 1 yeniden başladı.
activemq mesajlar 5, OK, tüketici 1 ve tüketici 2 mesajlarını alır ve işler. Mesajın terk edilmesi. ----------------------------- Özetle: ActiveMQ sadece şu anda piyasaya sürülen tüketiciye mesaj gönderir. Kapatan tüketiciler birçok mesajı kaçırır ve onları tekrar alamayacaklar.
Gönderilen mesaj önemli kullanıcı senkronizasyonu verisse ve kaçırıyorsa, kullanıcı veri senkronize edilmez.
Peki, tüketiciler yeniden başlattıklarında kaçırılan mesajları nasıl alırsınız?
Cevap ise kalıcı bir abonelik. -----------------------------
Sıradan abonelikler, tüketicileri ayırt etmeden, mekanda birkaç kişi varsa, birkaç buharda pişirilmiş çörek atar. Sürekli abonelikler için tüketicinin adını kaydetmeniz gerekir. Zhang San, ben Zhang San'ım, benim için buharda pişirilmiş çörekler var, geri gelip alacağım. Li Si dedi ki, ben Li Si'yim, benim için buharda pişirilmiş çörekler var, geri gelip alacağım. activemq, Zhang San ve Li Si'nin isimlerini yazdı.
Buharda pişirilmiş çörekleri bölerken, bir baş yine buharda pişirilmiş çörek verir. Bölünmeden sonra, Zhang San'ın konuşmadığını görünce, onun orada olmadığı anlamına geliyordu, ona bir tane bırak. Li Si konuştu, bu yüzden kalmasına gerek yoktu.
Zhang San geri döndü, activemq aradı ve baktı, bu Zhang San değil, buharda pişirilmiş çöreklerini hemen getir. Bir buharda pişirilmiş çörek olabilir, ya da 100 buharda pişirilmiş çörek olabilir, Zhang San'ın bir süreliğine ayrıldığından beri kaç buharda pişirilmiş çöreği böldüğüne bağlı.
activemq, tüketicileri clientID ve abone adıyla ayırır. ----------------------------- Bir bağlantı kur connection = connectionFactory.createConnection(); connection.setClientID("bbb"); Sürekli abonelikler için bunu ayarlamak gerekir. connection.start();
Bir oturum oluşturun Oturum oturumu = connection.createSession(yanlış,Session.AUTO_ACKNOWLEDGE);
Bir varış noktası oluşturun Konu konusu = session.createTopic("userSyncTopic"); Konu adı
MessageConsumer = session.createConsumer(topic); Düzenli abonelik MessageConsumerConsumer = session.createDurableSubscriber(topic,"bbb"); Kalıcı abonelikler
Bir diğer nokta ise, mesaj üreticisinin mesaj gönderirken kalıcı mod kullanmasıdır MessageProducer yapımcı = ...; producer.setDeliveryMode(DeliveryMode.PERSISTENT); Eğer değilse, varsayılan olarak kalıcı olur
(5) Aynı "clientID" kullanılırsa, aynı tüketici olarak kabul edilir. İki program aynı "clientID"yi kullanıyorsa, aynı anda sadece biri activemq'ya bağlanabilir ve ikinci bağlantı hata bildirir.
(6) activemq ayarları conf/activemq.xml içinde ve varsayılan mesajlar data/kahadb içinde kaydedilir; activemq yeniden başlatıldığında mesajlar kaybolmaz.
Mevcut kuyruklar, konular ve kalıcı aboneler hakkında bilgileri http://localhost:8161/admin/index.jsp erişebilir, mesaj gönderebilir ve daha fazlasını yapabilirsiniz.
İçeriği activemq-jdbc.xml kopyalayıp değiştirebilir ve mesajı diğer veritabanlarına kaydedebilirsiniz. |