2015-12-22 42 views
0

我有一個基於spring和spring-rabbit庫的獨立java應用程序。我開始是這樣的:春季rabbitmq java應用程序正確關機

nohup java -jar myapp.jar & 

但有時我必須重新啓動應用程序來升級它。現在我使用killall -9 java,但這不是最好的方法。如何正確地阻止它,並確保在這段時間對這個應用程序的兔子聽衆的所有請求將不會被部分處理,只會被拒絕並轉到其他兔子消費者?

回答

1

首先 - 不要使用killall -9 - 它發送一個SIGKILL信號給JVM,這個信號不能被截取,也不允許有序關閉。相反,使用killallkillall -1515是默認信號),它發送SIGTERM,它被JVM攔截並允許有序關閉。

其次,不要過早確認RabbitMQ消息 - 只有在消息實際處理完畢後纔會這樣做。在您確認消息之前,RabbitMQ將保持它處於「未確認」狀態。如果消費者沒有確認而死亡,則該消息將被放回到隊列中供其他消費者選擇。

根據您使用的框架,您可能需要註冊shutdown hook才能以清晰的方式關閉您的應用程序。例如,如果您使用獨立的Spring,則應在您創建的ApplicationContext上調用ConfigurableApplicationContext#registerShutdownHook,以確保所有bean(包括RabbitMQ使用者)都正確關閉。

1

首先,如果您害怕數據丟失,請不要使用autoack。設置autoAck = false,然後在消費者處理消息時,當你真的完成消息處理時確認它或者nack。所以,如果你以某種方式關閉了你的java進程(即使你關閉了你的機器),你也不會丟失數據。 RabbitMq將存儲它,直到您的客戶端將其確認。 在這裏閱讀https://www.rabbitmq.com/tutorials/tutorial-two-java.html 在'message acknoledgement'部分。 爲了正確運行你的java進程,編寫你的bash腳本,這將停止/啓動/重新啓動你的程序。