91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Spring Boot中消息事件機制的原理是什么

發布時間:2021-07-22 14:16:06 來源:億速云 閱讀:297 作者:Leah 欄目:大數據

本篇文章給大家分享的是有關Spring Boot中消息事件機制的原理是什么,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

Spring Boot自帶了消息機制,可以讓我們在一個地方發布消息,多個地方同時接收消息并處理消息,當然這是在同一個JVM內存下進行的,不同的進程還需要使用MQ來實現。我覺得該消息模式跟觀察者模式有一定的區別,觀察者模式一般觀察的是一個對象內部屬性發生變化的時候使用。而該消息機制可以在任意地方使用。

消息事件本身是一個對象,繼承于ApplicationEvent

@Datapublic class DemoEvent extends ApplicationEvent {private String type;    private List<Map> msg;    public DemoEvent(Object source,String type,List<Map> msg) {super(source);        this.type = type;        this.msg = msg;    }
}

還需要有一個消息事件發布者,將這個消息事件給發布出去

@Componentpublic class DemoPublisher {@Autowired    ApplicationContext applicationContext;    public void publish(DemoEvent demoEvent) {applicationContext.publishEvent(demoEvent);    }
}

然后就是我們的偵聽者,偵聽者可以有任意個根據業務不同做不同的處理,他的寫法分兩種,一個是實現了ApplicationListener接口,一個是在方法上打上@EventListener標簽

@Component@Slf4jpublic class DemoListener implements ApplicationListener<DemoEvent> {@Override    @Async    public void onApplicationEvent(DemoEvent demoEvent) {log.info("接收到publisher發送到消息,時間" + Time.getTime());        List<Map> msg = demoEvent.getMsg();        String type = demoEvent.getType();        try {
            Thread.sleep(3000);        }catch (Exception e) {
            e.printStackTrace();        }log.info("類型" + type + ",消息內容:" + msg);    }
}
@Component@Slf4jpublic class DemoListener1 {@EventListener    public void onDemoEvent(DemoEvent demoEvent) {log.info("listener1通過注解接收到了publisher發送的消息,時間" + Time.getTime());        String type = demoEvent.getType();        List<Map> msg = demoEvent.getMsg();        try {
            Thread.sleep(2000);        }catch (Exception e) {
            e.printStackTrace();        }log.info("listener1:類型" + type + ",消息內容:" + msg);    }
}

但是我們需要知道的是,多個消息監聽是同步執行的,他們會發生阻塞,所以我們需要進行異步監聽,實現異步監聽只需要在方法上打上@Async標簽,同時在Springboot主程序中開啟允許異步

@EnableAsync@SpringBootApplicationpublic class LanmdaApplication {   public static void main(String[] args) {
      SpringApplication.run(LanmdaApplication.class, args);   }

}

最后寫一個測試的Controller

@Slf4j@RestControllerpublic class TestController {@Autowired    private DemoPublisher publisher;    @GetMapping("/test")public String testListener() {
        List<Map> list = new ArrayList<>();        Map<String,String> m1 = new HashMap<>();        m1.put("1","2");        Map<String,String> m2 = new HashMap<>();        m2.put("3","4");        Map<String,String> m3 = new HashMap<>();        m3.put("5","6");        list.add(m1);        list.add(m2);        list.add(m3);        log.info("開始發布消息:" + Time.getTime());        publisher.publish(new DemoEvent(this,"測試消息",list));        log.info("消息發布結束:" + Time.getTime());        return "消息發布成功";    }
}

執行后,日志如下

2019-07-21 10:42:39.686  INFO 1756 --- [nio-8080-exec-1] c.g.lanmda.controller.TestController     : 開始發布消息:10:42:39
2019-07-21 10:42:39.687  INFO 1756 --- [nio-8080-exec-1] com.guanjian.lanmda.event.DemoListener1  : listener1通過注解接收到了publisher發送的消息,時間10:42:39
2019-07-21 10:42:41.690  INFO 1756 --- [nio-8080-exec-1] com.guanjian.lanmda.event.DemoListener1  : listener1:類型測試消息,消息內容:[{1=2}, {3=4}, {5=6}]
2019-07-21 10:42:41.695  INFO 1756 --- [nio-8080-exec-1] .s.a.AnnotationAsyncExecutionInterceptor : No task executor bean found for async processing: no bean of type TaskExecutor and no bean named 'taskExecutor' either
2019-07-21 10:42:41.697  INFO 1756 --- [nio-8080-exec-1] c.g.lanmda.controller.TestController     : 消息發布結束:10:42:41
2019-07-21 10:42:41.697  INFO 1756 --- [cTaskExecutor-1] com.guanjian.lanmda.event.DemoListener   : 接收到publisher發送到消息,時間10:42:41
2019-07-21 10:42:44.701  INFO 1756 --- [cTaskExecutor-1] com.guanjian.lanmda.event.DemoListener   : 類型測試消息,消息內容:[{1=2}, {3=4}, {5=6}]

以上就是Spring Boot中消息事件機制的原理是什么,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

南投县| 丘北县| 武定县| 满洲里市| 乾安县| 东乡县| 遂昌县| 无极县| 天水市| 昌都县| 红安县| 河曲县| 修文县| 武清区| 黑水县| 景谷| 宣恩县| 榆中县| 济南市| 桑植县| 清涧县| 大港区| 天台县| 海阳市| 淮阳县| 西林县| 九龙坡区| 武隆县| 万荣县| 中超| 吴川市| 南乐县| 梧州市| 海宁市| 浮山县| 庄浪县| 胶州市| 隆尧县| 凭祥市| 兰西县| 蓝山县|