ActiveMQ消费者平滑关闭
平滑關閉的思路就是讓正在執行的任務線程正常執行完畢,然后再關閉JVM。在JVM關閉之前觸發一個shutdown hook,jvm自帶這個hook,在java啟動時候就可以注冊這樣的hook。
##1、簡述JVM關閉鉤子(shutdown hook) 首先JVM的關閉方式可以分為三種:
-
正常關閉:當最后一個非守護線程結束或者調用了System.exit或者通過其他特定平臺的方法關閉(發送SIGINT,SIGTERM信號等)
-
強制關閉:通過調用Runtime.halt方法或者是在操作系統中直接kill(發送SIGKILL信號)掉JVM進程
-
異常關閉:運行中遇到RuntimeException異常等。
在某些情況下,我們需要在JVM關閉時做些掃尾的工作,比如刪除臨時文件、停止日志服務以及內存數據寫到磁盤等,為此JVM提供了關閉鉤子(shutdown hooks)來做這些事情。另外特別注意的是:如果JVM因異常關閉,那么子線程(Hook本質上也是子線程)將不會停止。但在JVM被強行關閉時,這些線程都會被強行結束。
另外在使用關閉鉤子還要注意以下幾點:
##2、 ActiveMQ消費者的鉤子
先講一下我的消費者整體情況:
1、使用Spring集成ActiveMQ,用Spring容器進行bean的管理
2、用DefaultMessageListenerContainer來監聽處理隊列里的消息
直接貼代碼:
//消費者是普通的java工程,通過這個類的main方法啟動,這里只貼出main函數里的代碼 public static void main( String[] args ) {log.info("start APP......");ApplicationContext context = new ClassPathXmlApplicationContext("classpath:spring/applicationContext.xml");//testContainer是在配置文件中配置的監聽器final DefaultMessageListenerContainer container = (DefaultMessageListenerContainer)context.getBean("testContainer");Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {public void run() {System.out.println("-------------------- 消費者JVM即將關閉,執行清場操作 --------------------");//關閉線程池,等待線程池積壓消息處理container.shutdown();System.out.println("-------------------- 消費者關閉,線程池處理完畢 --------------------");//不要在鉤子里面執行System.exit,調用halt()是可以正常關閉系統的,但是貌似沒這個必要//Runtime.getRuntime().halt(0);}})); }為了可以更直觀的看到這個等待任務線程處理完的一個過程,在任務線程里添加sleep代碼。
public class TestMessageListener implements SessionAwareMessageListener {public void onMessage(Message message, Session session) {if (message instanceof TextMessage) {TextMessage textMsg = (TextMessage) message;try {Thread.sleep(1000L);System.out.println(Thread.currentThread().getName() + ",接收到一個純文本消息,消息內容是:" + textMsg.getText());} catch (JMSException e) {e.printStackTrace();}catch (InterruptedException e) {e.printStackTrace();}}} }運行結果如下:
##3、 關閉消費者
關閉消費者的時候也很重要,不要使用kill -9的方式來殺進程,這是無腦殺。
ref:
- 深入JVM關閉與關閉鉤子
- JAVA虛擬機關閉鉤子(Shutdown Hook)
- Java消息隊列任務的平滑關閉
- 使用后臺進程和 Shutdown Hook 友好地關閉 Tomcat
總結
以上是生活随笔為你收集整理的ActiveMQ消费者平滑关闭的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 几种限流器(RateLimiter)原理
- 下一篇: 计算机的定点运算器原理,计算机组成原理定