|
|
Zveřejněno 09.04.2018 10:23:21
|
|
|
|

Ve výchozím nastavení se zprávy rabbitMQ fronty neuchovat na pevném disku, což znamená, že po restartu služby rabbitMQ zprávy zmizí.
Perzistence front
Například je identifikována perzistence frontydurableis nastaven na true, což znamená, že jde o trvalou frontu, poté po restartu služby také existuje, protože služba uloží persisted queue na pevný disk a po restartu služby obnoví to, co bylo dříve persistent. Fronta může být ponechána, ale zda jsou zprávy uvnitř persistentní, závisí na nastavení perzistence zprávy. Jinými slovy, pokud před restartem ve frontě není odeslána žádná zpráva, zda původní zpráva po restartu stále existuje ve frontě, závisí na nastavení zprávy, která nastala při odeslání zprávy. Pokud chcete, aby zprávy po restartu zůstaly trvalé, musíte nastavit identitu, že zpráva je uchovávána.
Nastavte perzistenci fronty:
Čtvrtý parametr metody, autoDelete, se obvykle zadává false. Dokumentace popisuje tento parametr, pokud je pravdivý, což znamená, že pokud fronta již není používána (není odebírána), server ji smaže. Během mého testování, pokud jsou všichni příjemci fronty na změnu připojení odpojeni, fronta se maže, i když v ní stále jsou nezpracované zprávy. Restarty RabbitMQ je také odstraní. Pokud je zadán false příkaz, služba frontu nesmaže a zprávy ve frontě budou existovat, pokud jsou všichni klienti připojeni k ní odpojeni. Odesílatel může také vložit zprávy do fronty změn, když klient nemá připojení, a když klient přijde, tyto zprávy obdrží. Pokud je však služba RabbitMQ restartována, fronta zmizí a zprávy v ní přirozeně zmizí.
Třetí parametr je exkluzivní a dokumentace uvádí, že pokud je pravda, spojení fronty je přerušeno a fronta je smazána včetně zpráv uvnitř.
Druhý parametr, trvalý, je v dokumentaci popsán tak, že pokud je pravdivý, představuje trvalou frontu, která bude existovat i po restartu služby. Protože služba uloží trvalou frontu na pevný disk a při jejím restartu tuto frontu znovu potvrdí. Samozřejmě, že to musí být, když jsou jak autoDelete, tak exclusive nepravdivé. Fronta může být ponechána, ale zda jsou zprávy uvnitř persistentní, závisí na nastavení perzistence zprávy. Jinými slovy, pokud jsou před restartem ve frontě stále odesílány zprávy, zda původní zpráva po restartu stále existuje ve frontě, závisí na nastavení odesílatele zprávy při odeslání zprávy.
Po úpravě kódu se ho pokusíme spustit a chyba bude následující:
Nezpracovaná výjimka: RabbitMQ.Client.Exceptions.OperationInterruptedException: Operace AMQP byla přerušena: AMQP uzavřený důvod, iniciováno Peerem, code=406, text="PRECONDITION_FAILED - inequivalent arg 'durable' pro frontu 'hello' ve vhost 'myserver': přijato 'true', ale current is 'false'", classId=50, methodId=10, cause=
Protože jsme definovali netrvalou frontu nazvanou hello. RabbitMQ neumožňuje redefinovat existující fronty s různými nastaveními parametrů.
Existují dvě řešení:
1: Znovu deklarovat frontu s jiným názvem, například my_queue 2: Smazat definovanou frontu "hello" s adresou http://localhost:15672 a přihlásit se uživatelským jménem a heslem. Výchozí heslo a uživatelské jméno pro RabbitMQ jsou host. Klikněte na sloupec "fronta" pro zobrazení seznamu front, klikněte na frontu "hello" pro rozšíření detailů fronty. Vytáhni stránku na konec, je tam položka "Smazat", klikni na ni, klikni na tlačítko "Smazat frontu" a můžeš frontu smazat. Když je kód spuštěn, vytvoří se hello fronta, která podporuje perzistenci.
Trvalost zpráv
Pokud chcete, aby zpráva přetrvala i po restartu, musíte nastavit, aby zpráva přetrvala. Nastavení je, když odesílatel odesílá zprávu, což je relativně jednoduché, a kód je následující:
DeliveryMode je výchozí na 1, neperzistentní, a nastavení na 2 znamená, že zpráva je trvalá
Po úpravě kódu se snažíme otevřít pouze program Producer pro odeslání zpráv, pak restartovat službu rabbitMQ, znovu otevřít spotřebitele a zjistit, že zpráva není ztracena.
(Konec)
Přiložen je zdrojový kód C#:
Turisté, pokud chcete vidět skrytý obsah tohoto příspěvku, prosím Odpověď
|
Předchozí:Zpráva o výjimečnosti: "StrongTypingException: IsPrima...Další:Úvod do C# delegátů (delegovat, akce, func, predikat)
|