<noframes id="ndrzl"><form id="ndrzl"><nobr id="ndrzl"></nobr></form>

<sub id="ndrzl"><listing id="ndrzl"><listing id="ndrzl"></listing></listing></sub><noframes id="ndrzl">

<address id="ndrzl"><nobr id="ndrzl"><progress id="ndrzl"></progress></nobr></address>
<address id="ndrzl"><form id="ndrzl"></form></address>

<listing id="ndrzl"></listing>

<noframes id="ndrzl">

    <address id="ndrzl"></address>
    專注Java教育13年 全國咨詢/投訴熱線:400-8080-105
    動力節點LOGO圖
    始于2009,一家只教授Java的培訓機構
    首頁 hot資訊 ActiveMQ使用場景匯總

    ActiveMQ使用場景匯總

    更新時間:2022-11-22 08:48:35 來源:動力節點 瀏覽29次

    ActiveMQ使用場景?動力節點小編來告訴大家。以下介紹消息隊列在實際應用中常用的使用場景。

    異步處理,應用解耦,流量削鋒和消息通訊四個場景。本篇使用ActiveMQ+SpringBoot來模擬這四個場景。

    1.異步處理

    場景說明:汽車觸發圍欄報警后,需要發送報警郵件和報警短信。傳統的做法有兩種1.串行的方式;2.并行方式。

    (1)串行方式:將報警信息寫入數據庫成功后,發送報警郵件,再發送報警短信。以上三個任務全部完成后,該報警信息加入統計列表。

    (2)并行方式:報警信息寫入數據庫成功后,同時發送報警郵件和短信。

    假設三個業務節點每個使用50毫秒鐘,不考慮網絡等其他開銷,則串行方式的時間是150毫秒,并行的時間可能是100毫秒。

    因為CPU在單位時間內處理的請求數是一定的,假設CPU1秒內吞吐量是100次。則串行方式1秒內CPU可處理的請求量是7次(1000/150)。并行方式處理的請求量是10次(1000/100)。

    小結:如以上案例描述,傳統的方式系統的性能(并發量,吞吐量,響應時間)會有瓶頸。如何解決這個問題呢?

    引入消息隊列,將不是必須的業務邏輯,異步處理。改造后的架構如下:

    代碼示例

    (1)在pom文件中引入activemq依賴

    <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-activemq</artifactId>
            <version>1.5.6.RELEASE</version>
        </dependency>

    (2)在配置文件中加上activemq的配置

    spring.activemq.broker-url=tcp://127.0.0.1:61616
    # 在考慮結束之前等待的時間
    #spring.activemq.close-timeout=15s 
    # 默認代理URL是否應該在內存中。如果指定了顯式代理,則忽略此值。
    spring.activemq.in-memory=true 
    # 是否在回滾回滾消息之前停止消息傳遞。這意味著當啟用此命令時,消息順序不會被保留。
    spring.activemq.non-blocking-redelivery=false
    # 密碼
    spring.activemq.password=123456
    # 等待消息發送響應的時間。設置為0等待永遠。
    spring.activemq.send-timeout=0
    spring.activemq.user=haha
    # 是否信任所有包
    #spring.activemq.packages.trust-all=
    # 要信任的特定包的逗號分隔列表(當不信任所有包時)
    #spring.activemq.packages.trusted=
    # 當連接請求和池滿時是否阻塞。設置false會拋“JMSException異?!?。
    #spring.activemq.pool.block-if-full=true
    # 如果池仍然滿,則在拋出異常前阻塞時間。
    #spring.activemq.pool.block-if-full-timeout=-1ms
    # 是否在啟動時創建連接??梢栽趩訒r用于加熱池。
    #spring.activemq.pool.create-connection-on-startup=true
    # 是否用Pooledconnectionfactory代替普通的ConnectionFactory。
    #spring.activemq.pool.enabled=false 
    # 連接過期超時。
    #spring.activemq.pool.expiry-timeout=0ms
    # 連接空閑超時
    #spring.activemq.pool.idle-timeout=30s
    # 連接池最大連接數
    #spring.activemq.pool.max-connections=1
    # 每個連接的有效會話的最大數目。
    #spring.activemq.pool.maximum-active-session-per-connection=500
    # 當有"JMSException"時嘗試重新連接
    #spring.activemq.pool.reconnect-on-exception=true
    # 在空閑連接清除線程之間運行的時間。當為負數時,沒有空閑連接驅逐線程運行。
    #spring.activemq.pool.time-between-expiration-check=-1ms
    # 是否只使用一個MessageProducer
    #spring.activemq.pool.use-anonymous-producers=true

    (3)消息生產者

    import java.util.Map;
    import javax.jms.Destination;
    import javax.jms.Queue;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.jms.core.JmsMessagingTemplate;
    import org.springframework.jms.core.JmsTemplate;
    import org.springframework.jms.core.MessagePostProcessor;
    import org.springframework.scheduling.annotation.EnableScheduling;
    import org.springframework.scheduling.annotation.Scheduled;
    import org.springframework.stereotype.Component;
    /**
     * 報警消息Producer
     * @author ko
     *
     */
    @Component
    //@EnableScheduling
    public class AlarmProducer {    
        // 也可以注入JmsTemplate,JmsMessagingTemplate對JmsTemplate進行了封裝
        @Autowired
        private JmsTemplate jmsTemplate;
    //    private JmsMessagingTemplate jmsTemplate;    
    //    @Autowired
    //    private Queue queue;    
    //    @Scheduled(fixedDelay=5000) // 5s執行一次   只有無參的方法才能用該注解
        public void sendMessage(Destination destination, String message){
    //        jmsTemplate.convertAndSend(destinationName, payload, messagePostProcessor);
            this.jmsTemplate.convertAndSend(destination, message);
        }
      // 雙向隊列
        // @JmsListener(destination="out.queue") 
        //   public void consumerMessage(String text){  
            //   System.out.println("從out.queue隊列收到的回復報文為:"+text);  
        // }
    }

    (4)controller里寫上測試接口

    @Autowired
        private AlarmProducer alarmProducer;    
        @RequestMapping(value="/chufabaojing",method=RequestMethod.GET)
        @ApiOperation(value="觸發報警", notes="觸發報警")
        @ApiImplicitParams({
            @ApiImplicitParam(name = "devicename", value = "name",example = "xxxx", required = true, dataType = "string",paramType="query"),
        })
        public String chufabaojing(String devicename){        
            List<String> alarmStrList = new ArrayList<>();
            alarmStrList.add(devicename+"out fence01");
            alarmStrList.add(devicename+"out fence02");
            alarmStrList.add(devicename+"in fence01");
            alarmStrList.add(devicename+"in fence02");        
            System.out.println("設備"+devicename+"出圍欄報警");
            // 報警信息寫入數據庫
            System.out.println("報警數據寫入數據庫。。。");        
            // 寫入消息隊列
            Destination destination = new ActiveMQQueue("mytest.queue");
            for (String alarmStr : alarmStrList) {
                alarmProducer.sendMessage(destination, alarmStr);
            }        
            // 消息寫進消息隊列里就不管了        
            // 下面兩步驟移到activemq消費者里
            // 發送郵件
            // 發送短信        
            return "success";
        }

    2.應用解耦

    場景介紹,在spring cloud分布式微服務項目中,工單管理和設備管理分別是兩個微服務,如果A工單被張三接單了,那么工單狀態要設為已派單,檢驗員設為張三,設備狀態要置為在檢。

    傳統的做法是,先調用工單管理的工單更新接口,成功之后再調用設備管理的設備更新接口,成功之后再返回操作提示給用戶。這樣做的缺點是應用耦合,如果在派單操作的時候正好設備管理微服務掛了或者阻塞了,那么派單操作就會失敗或者要等待很長時間無反饋。另外如果設備管理的接口有變動,那么工單管理里面的代碼也要改動。

    引入消息中間件,派單的時候,工單管理的工單更新接口處理好后把信息寫入消息隊列,然后直接返回操作反饋給用戶。不管工單管理服務正不正常,正常就從消息隊列里訂閱消息處理,不正常就等待回復正常后再訂閱消息處理。

    3.流量削峰

    場景介紹,XX公司的系統原來是針對A地區的客戶開發的,現在為了搶占市場,拿下了B和C兩個地區的客戶,那么新系統上線,就存在如何把B和C的基礎數據導入XX公司的系統中來的問題,短時間內要把龐大的舊數據改造適合新系統再導入進來,這很容易使系統掛掉,另外每天還有增量數據產生。

    這時可以引入消息中間件,B和C的客戶只要負責把數據規則放到消息隊列里就好了,XX公司可以有條不紊的從消息隊列里訂閱數據,可以有效緩解短時間內的高流量壓力,但是這也對消息中間件的可靠性提出了要求。

    4.點對點通訊

    類似聊天室的功能。

    提交申請后,顧問老師會電話與您溝通安排學習

    免費課程推薦 >>
    技術文檔推薦 >>
    返回頂部
    av无码天堂热久久
    <noframes id="ndrzl"><form id="ndrzl"><nobr id="ndrzl"></nobr></form>

    <sub id="ndrzl"><listing id="ndrzl"><listing id="ndrzl"></listing></listing></sub><noframes id="ndrzl">

    <address id="ndrzl"><nobr id="ndrzl"><progress id="ndrzl"></progress></nobr></address>
    <address id="ndrzl"><form id="ndrzl"></form></address>

    <listing id="ndrzl"></listing>

    <noframes id="ndrzl">

      <address id="ndrzl"></address>