日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

ActiveMQ消费者平滑关闭

發布時間:2024/7/23 61 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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被強行關閉時,這些線程都會被強行結束。

另外在使用關閉鉤子還要注意以下幾點:

  • 不能在鉤子調用System.exit(),否則卡住JVM的關閉過程,但是可以調用Runtime.halt()。
  • 不能再鉤子中再進行鉤子的添加和刪掉操作,否則將會拋出IllegalStateException。
  • 在System.exit()之后添加的鉤子無效。
  • 當JVM收到SIGTERM命令(比如操作系統在關閉時)后,如果鉤子線程在一定時間沒有完成,那么Hook線程可能在執行過程中被終止。
  • Hook線程中同樣會拋出異常,如果拋出異常又不處理,那么鉤子的執行序列就會被停止。
  • ##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消费者平滑关闭的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。