Bu makale makine çevirisi ayna makalesidir, orijinal makaleye geçmek için lütfen buraya tıklayın.

Görünüm: 44647|Yanıt: 8

[WinForm] rabbitMQ Kuyruk Kuyruğu Mesajı Kalıcılığı [kaynak kodu ile]

[Bağlantıyı kopyala]
Yayınlandı 9.04.2018 10:23:21 | | | |
Varsayılan olarak, rabbitMQ kuyruk mesajları sabit diskte kalıcı olmaz, bu da rabbitMQ servisi yeniden başlatıldığında mesajların kaybolacağı anlamına gelir.

Kuyrukların kalıcılığı

Örneğin, kuyruğun kalıcılığı tanımlanırdurable'is true'dur, yani kalıcı bir kuyruk olduğu anlamına gelir, ardından servis yeniden başlatıldıktan sonra da var olur, çünkü hizmet kalıcı kuyruğu sabit diskte saklar ve hizmet yeniden başlatıldığında, daha önce devam eden kuyruğu yeniden oluşturur. Kuyruk devam ettirilebilir, ancak içindeki mesajların kalıcı olup olmaması mesajın kalıcılık ayarlarına bağlıdır. Başka bir deyişle, yeniden başlatmadan önce kuyrukta mesaj gönderilmediyse, yeniden başlatmadan sonra orijinal mesajın kuyrukta olup olmadığı, mesajın gönderildiği sırada gerçekleşen mesaj ayarlarına bağlıdır.
Yeniden başlatmadan sonra mesajların kalıcı kalmasını istiyorsanız, mesajın kalıcı olduğu kimliği ayarlamanız gerekir.

Kuyruk kalıcılığını kurun:




Yöntemin dördüncü parametresi olan otomatik Silme genellikle false olarak girilir. Eğer doğruysa, dokümantasyon bu parametreyi açıklar; bu, kuyruk artık kullanılmazsa (abone edilmezse), sunucunun onu sileceği anlamına gelir. Testlerim sırasında, bağlantı değiştirme kuyruğunun tüm alıcıları bağlantısı kesildiği sürece, içinde hâlâ işlenmemiş mesajlar olsa bile kuyruk siliniyor. RabbitMQ yeniden başlatma da onları kaldırır. Yanlış girilirse, hizmet kuyruğu silmez ve tüm ona bağlı istemciler bağlantısı kesilirse kuyruğun içindeki mesajlar var olur. Gönderici ayrıca istemci bağlantısı olmadığında mesajları değişim kuyruğuna koyabilir ve istemci açıldığında bu mesajları alır. Ancak RabbitMQ servisi yeniden başlatılırsa, kuyruk kaybolur ve içindeki mesajlar doğal olarak kaybolur.

Üçüncü parametre özel ve dokümantasyonda belirtiler: eğer doğruysa, kuyruğun bağlantısı bozulur, ardından kuyruk silinir ve içindeki mesajlar dahil.

İkinci parametre olan dayanıklı, dokümantasyonda doğruysa, hizmet yeniden başladıktan sonra da var olacak kalıcı bir kuyruğu temsil ettiği şeklinde tanımlanır. Çünkü hizmet, kalıcı kuyruğu sabit diskte saklar ve hizmet yeniden başlatıldığında bu kuyruğu tekrar onaylar. Elbette, hem otomatik silme hem de özel olarak yanlış olduğunda olmalı. Kuyruk devam ettirilebilir, ancak içindeki mesajların kalıcı olup olmaması mesajın kalıcılık ayarlarına bağlıdır. Başka bir deyişle, yeniden başlatmadan önce kuyrukta hâlâ mesaj gönderiliyorsa, yeniden başlatmadan sonra orijinal mesajın kuyrukta olup olmaması, göndericinin mesajı gönderirken verdiği ayarlara bağlıdır.


Kodu değiştirdikten sonra çalıştırmaya çalışıyoruz ve hata şu şekilde olur:

Yönetilmeyen istisna: RabbitMQ.Client.Exceptions.OperationInterruptedException: AMQP işlemi kesintiye uğradı: AMQP close-reason, başlattı Peer, code=406, text="PRECONDITION_FAILED - eşdeğersiz arg 'durable' vhost 'myserver' içindeki kuyruk 'hello' için: alınan 'doğru' ama güncel 'yanlış'", classId=50, methodId=10, cause=



Çünkü merhaba adı verilen kalıcı olmayan bir kuyruk tanımladık. RabbitMQ, farklı parametre ayarlarıyla mevcut kuyrukların yeniden tanımlanmasına izin vermez.

İki çözüm vardır:

1: Farklı bir isimle kuyruk, örneğin my_queue
2: Tanımlanmış "merhaba" kuyruğunu http://localhost:15672 adresiyle silin ve kullanıcı adı ile şifreyle giriş yapın. RabbitMQ için varsayılan şifre ve kullanıcı adı konuk olarak kullanılır. Kuyruk listesini görmek için "kuyruk" sütununa tıklayın, kuyruk detaylarını genişletmek için "merhaba" kuyruğuna tıklayın. Sayfayı sonuna çekin, "Sil" adlı bir öğe var, üzerine tıklayın, "Kuyruğu Sil" butonuna tıklayın ve kuyrukları silebilirsiniz. Kod çalıştırıldığında, kalıcı bir merhaba kuyruğu oluşturulur.



Mesajların kalıcılığı

Yeniden başlatmadan sonra mesajın kalıcı kalmasını istiyorsanız, mesajı kalıcı şekilde ayarlamanız gerekir. Ayar, göndericinin gönderdiği zamandır, bu nispeten basittir ve kod şöyledir:


DeliveryMode varsayılan olarak 1, kalıcı değil ve 2 olarak ayarlaması mesajın kalıcı olduğu anlamına gelir

Kodu değiştirdikten sonra, sadece üretici programını açıp mesaj göndermeye çalışıyoruz, sonra rabbitMQ servisini yeniden başlatıp tüketiciyi tekrar açıyoruz ve mesajın kaybolmadığını görüyoruz.

(Son)

Ekte C# kaynak kodu bulunmaktadır:

Turistler, bu gönderinin gizli içeriğini görmek isterseniz lütfenYanıt





Önceki:İstisna mesajı: "GüçYazıYazarIstisna: IsPrima...
Önümüzdeki:C# delegelerine giriş (delege, Eylem, Func, predikat)
Yayınlandı 9.04.2018 13:17:51 |
Öğrenmeyi öğren
Yayınlandı 25.06.2019 23:22:47 |
Öğrenmeyi öğren
Yayınlandı 29.06.2019 09:36:23 |
Neden demoyu görmedim, görebilmek için cevap vermem gerekiyor
Yayınlandı 9.07.2019 17:34:42 |
C# kaynak kodu istiyorum
Yayınlandı 24.07.2019 14:21:51 |
İyi, tam ihtiyacım olan şey
Yayınlandı 11.04.2020 14:34:54 |
Öğren
Yayınlandı 1.01.2022 14:45:24 |
1111111111111111
 Ev sahibi| Yayınlandı 3.05.2023 22:12:22 |
RabbitMQ Kuyruğunun parametreleri ve anlamları


/**
* Yeni bir kuyruk oluşturun, bir isim, dayanıklılık bayrağı ve otomatik silme bayrağı ile argümanlar verin.
* @param kuyruğun adını adlandırın - null olmamalıdır; Aracı kurumun ismi oluşturmasını sağlamak için "" olarak ayarlayın.
* @param dayanıklı bir kuyruk ilan ediyorsak (kuyruk sunucu yeniden başlatıldığında hayatta kalacaktır)
* @param özel kuyruk ilan ediyorsak doğrudur (kuyruk sadece deklarantı tarafından kullanılır
* bağlantı)
* @param sunucu artık kullanılmadığında kuyruğu silecekse otomatik sil geçerlidir
* @param argümanları kuyruğu ilan etmek için kullanılan argümanlar
*/
public Queue(String name, boolean durable, boolean exclusive, boolean autoDelete, Map<String, Object> arguments) {
   Assert.notNull(name, "'name' null olamaz");
   this.name = isim;
   this.actualName = StringUtils.hasText(name) ? İsim
         : (Base64UrlNamingStrategy.DEFAULT.generateName() + "_awaiting_declaration");
   this.durable = dayanıklı;
   this.exclusive = münhasır;
   this.autoDelete = otomatik Sil;
   this.arguments = argümanlar != null ? argümanlar : yeni HashMap<>();
}

Parametre tanıtımı:
1. İsim: Kuyruğun adı;
2. actualName: Kuyruğun gerçek adı, ad parametresi varsayılan olarak kullanılır, isim boşsa, kurallara göre bir parametre oluşturulur;
3. dayanıklı: kalıcı olup olmadığı;
4. Dışlayıcı: münhasır mı yoksa dışlayıcı mı;
5. otomatik Silme: otomatik silip silinmemesi;
6. Argümanlar: Kuyruğun diğer öznitelik parametreleri aşağıdaki seçeneklere sahiptir, Şekil 2'deki Argümanlara bakınız:
(1) x-message-ttl: mesajın milisaniye cinsinden son kullanma süresi;
(2) x-süresi doldu: kuyruğun son kullanma süresi, erişilmezse kuyruğun ne kadar süre silineceği, birim: milisaniyeler;
(3) x-max-length: kuyruğun maksimum uzunluğu, maksimum değeri aşarsa, mesaj kuyruk başlığından silinir;
(4) x-max-length-bytes: Kuyruk mesajı içeriği maksimum alanı kaplar, bellek boyutuyla sınırlıdır ve bu eşiği aşarsa, mesaj kuyruk başlığından silinir;
(5) x-overflow: Kuyruk taşma davranışını ayarlayın. Bu, kuyruğun maksimum uzunluğuna ulaşıldığında mesajın başına ne geleceğini belirler. Geçerli değerler drop-head, redet-publish veya reddet-publish-dlx'dir. Quorum kuyruk türleri yalnızca drop-head desteğini destekler;
(6) X-ölü mektup-değişimi: ölü mektup değişiminin adı ve süresi dolan veya silinmiş mesajlar (uzun kuyruk süresi veya eşiği aşan boşluk nedeniyle) değişime gönderilmek üzere belirtilebilir;
(7) x-ölü harf-yönlendirme anahtarı: Ölü harf mesajının yönlendirme anahtarı, mesaj ölü harf değiştiriciye gönderildiğinde kullanılacak, ayarlanmadıysa, mesajın orijinal yönlendirme anahtarı değeri kullanılır
(8) x-single-active-consumer: kuyruğun tek aktif tüketici olup olmadığını gösterir; doğruysa, kayıtlı tüketici grubundaki sadece bir tüketici mesaj tüketir, diğerleri göz ardı edilir ve mesaj tüm tüketicilere bir döngü halinde dağıtıldığında false (varsayılan yanlış)
(9) x-max-priority: kuyruk tarafından desteklenecek maksimum öncelik sayısı; Ayarlanmazsa, kuyruk mesaj önceliğini desteklemez;
(10) x-queue-mode (Tembel mod): Kuyruğu gecikme moduna ayarlayın, RAM kullanımını azaltmak için diskte mümkün olduğunca çok mesaj bulundurun; Ayarlanmazsa, kuyruk mesajları mümkün olan en hızlı şekilde iletmek için bir bellek önbelleği tutar;
(11) x-queue-master-locator: Ayna kuyruğunun ana düğüm bilgisini küme modunda ayarlayın.


Feragatname:
Code Farmer Network tarafından yayımlanan tüm yazılım, programlama materyalleri veya makaleler yalnızca öğrenme ve araştırma amaçları içindir; Yukarıdaki içerik ticari veya yasa dışı amaçlarla kullanılamaz, aksi takdirde kullanıcılar tüm sonuçları ödemelidir. Bu sitedeki bilgiler internetten alınmakta olup, telif hakkı anlaşmazlıklarının bu siteyle hiçbir ilgisi yoktur. Yukarıdaki içeriği indirmeden sonraki 24 saat içinde bilgisayarınızdan tamamen silmelisiniz. Programı beğendiyseniz, lütfen orijinal yazılımı destekleyin, kayıt satın alın ve daha iyi orijinal hizmetler alın. Herhangi bir ihlal olursa, lütfen bizimle e-posta yoluyla iletişime geçin.

Mail To:help@itsvse.com