|
|
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ütfen Yanıt
|
Önceki:İstisna mesajı: "GüçYazıYazarIstisna: IsPrima...Önümüzdeki:C# delegelerine giriş (delege, Eylem, Func, predikat)
|