1. 程式人生 > >Spring boot ApplicationEvent實現非同步呼叫

Spring boot ApplicationEvent實現非同步呼叫

1.什麼是事件機制

事件機制在java的設計模式中也可以叫監聽器模式或者是觀察者模式。
當有事件發生時,通知關注次事件的物件傳送訊息,告訴它有一個事件發生了,那麼怎麼知道通知誰呢? 那必須要在對這個事件感興趣的物件中定義這個事件,一旦有事件發生了,對事件有興趣的物件就知道了。

2.什麼時候使用事件

首先,使用事件機制有什麼好處呢?我覺得最重要的一點就是避免了在程式碼中到處新增相同程式碼的問題,而且也可以對程式進行鬆耦合的設計。那麼我們什麼時候用事件機制呢?第一,當有多個程式碼塊中需要引用相同程式碼的時候。第二,發生的這個操作或者程式碼不需要立即執行的,可以非同步的。

例項

通過以上分析我們可以有個結論事件有三個部分,事件釋出、監聽、和事件源(什麼事件)。
首先定義一個事件源,繼承ApplicationEvent 說明此類是一個事件:

public class ApplyEvent extends ApplicationEvent {

    private static final long serialVersionUID = 1L;

    private ApplyModel applyModel;

    /**
     * 事件標識
     * true 申請事件
     * false 稽核事件
     */
    private boolean flag;

    public ApplyEvent(Object source, ApplyModel applyModel,   boolean
flag) { super(source); this.applyModel = applyModel; this.flag = flag; } } get set省略

其次,定義監聽器監聽事件,實現ApplicationListener 介面:

@Component
//這裡注意我們直接把監聽類註冊成元件
public class MessageListener implements ApplicationListener {

      private final Logger logger = LoggerFactory.getLogger(MessageListener.class);

      @Autowired
private APIMessageService apiMessageService; @Async @Override public void onApplicationEvent(ApplicationEvent applicationEvent) { if (applicationEvent instanceof ApplyEvent) { //做處理 } } }

ApplicationListener支援泛型,如果只有一個事件可以這麼寫:

public class MessageListener implements ApplicationListener<ApplyEvent>{
   @Override
      public void onApplicationEvent(ApplyEvent applyEvent) {
             //做處理 
    }
}

最後,定義事件的釋出,因為我們使用spring的話可以直接注入,所以我們直接注入ApplicationContext 物件呼叫釋出方法。

@Autowired
private ApplicationContext context;
//方法中呼叫
context.publishEvent(new ApplyEvent(this, applyModel, true));

非同步

是怎麼實現非同步的呢?
開啟非同步配置在配置類中添加註解@EnableAsync
通過MessageListener 在onApplicationEvent上添加註解@Async,@Async也可以新增在類上。

相關推薦

Spring boot ApplicationEvent實現非同步呼叫

1.什麼是事件機制 事件機制在java的設計模式中也可以叫監聽器模式或者是觀察者模式。 當有事件發生時,通知關注次事件的物件傳送訊息,告訴它有一個事件發生了,那麼怎麼知道通知誰呢? 那必須要在對這個事件感興趣的物件中定義這個事件,一旦有事件發生了,對事件有興

Spring Boot 基礎系列教程 | 第三十二篇:使用@Async實現非同步呼叫:自定義執行緒池

推薦 Spring Boot/Cloud 視訊: 在之前的Spring Boot基礎教程系列中,已經通過《Spring Boot中使用@Async實現非同步呼叫》一文介紹過如何使用@Async註解來實現非同步呼叫了。但是,對於這些非同步執行的控制是我們保障自身

Spring Boot中使用@Async實現非同步呼叫

一 點睛 1 什麼是“非同步呼叫” “非同步呼叫”對應的是“同步呼叫”,同步呼叫指程式按照定義順序依次執行,每一行程式都必須等待上一行程式執行完成之後才能執行;非同步呼叫指程式在順序執行時,不等待非

Spring Boot學習(十二)之Spring Boot使用@Async實現非同步呼叫

什麼是“非同步呼叫”?“非同步呼叫”對應的是“同步呼叫”,同步呼叫指程式按照定義順序依次執行,每一行程式都必須等待上一行程式執行完成之後才能執行;非同步呼叫指程式在順序執行時,不等待非同步呼叫的語句返回

Spring Boot使用@Async實現非同步呼叫返回結果:使用Future以及定義超時

關於使用 @Async實現非同步呼叫的內容,也得到不少童鞋的反饋,其中問題比較多的就是關於返回 Future的使用方法以及對非同步執行的超時控制,所以這篇就來一起講講這兩個問題的處理。 如果您對於 @Async註解的使用還不瞭解的話,可以看看之前的文章,具體如下: 定

Spring Boot2.0之@Async實現非同步呼叫

 補充一個知識點: lombok底層原理使用的是: 位元組碼技術ASM修改位元組碼檔案,生成比如類似於get() set( )方法 一定要在開發工具安裝 在編譯時候修改位元組碼檔案(底層使用位元組碼技術),線上環境使用編譯好的檔案   下面我們學習 Spring Boot 非同步呼

Spring @Async實現非同步呼叫示例

什麼是“非同步呼叫”?        “非同步呼叫”對應的是“同步呼叫”,同步呼叫指程式按照定義順序依次執行,每一行程式都必須等待上一行程式執行完成之後才能執行;非同步呼叫指程式在順序執行時,不等待非同步呼叫的語句返回結果就執行後面的程式。 同步呼叫 下面通過一個簡單示例來直觀的理解什麼是同步呼叫:

rabbitMq與spring boot搭配實現監聽

address app caching prefix 前段時間 ever 不用 理解 its   在我前面有一篇博客說到了rabbitMq實現與zk類似的watch功能,但是那一篇博客沒有代碼實例,後面自己補了一個demo,便於理解。demo中主要利用spring boot

spring boot實現響應圖片的方法以及改進

spring-bootController響應,噴出圖片,是一個很常見的功能,代碼如下@RequestMapping(value = { "/img/{filename:.+}" }, method = RequestMethod.GET, produces = { MediaType.I

Spring Boot實現logback多環境日誌配置

cati feature gprof 配置 color app config 現在 ng- 在Spring Boot中,可以在logback.xml中的springProfile標簽中定義多個環境logback.xml: <springProfile name=

Spring Boot+Profile實現不同環境讀取不同配置

images alt quest color ive 作用 讀取 ron 總結 文件結構如下: 但是官方推薦放在config文件夾下。 作用: 不同環境的配置設置一個配置文件,例如:dev環境下的配置配置在application-dev.properties中。p

spring boot filter實現

spring boot filter實現spring boot filter實現1.註解方式直接配置@Component @ServletComponentScan @WebFilter(urlPatterns = "/*",filterName = "loginFilter&q

spring boot security 實現根據情況跳轉不同頁面功能

invalid static request config 隱藏 ctu gif cte send 在配置主類添加代碼 @Override protected void configure(HttpSecurity http) throws Except

使用spring boot + Thymeleaf實現web小頁面

本文章只是介紹下如何使用spring boot + Thymeleaf,實現簡單的web頁面步驟和流程 幾點說明: Spring boot開發web專案,通常打成jar包,使用內建的web伺服器 Tomcat、Jetty、undertow 來執行。  靜態資源(css、js、圖片等)預

java實現非同步呼叫例項

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

spring boot(四):實現devtools熱部署

使用了springboot的朋友應該都知道,spring為開發者提供了一個名為spring-boot-devtools的模組, 來使Spring Boot應用支援熱部署,提高開發效率,不需要再重啟應用 下面先講解一下devtools的原理 深層原理是使用了兩個ClassLoader,

spring-boot+Redis實現簡單的分散式叢集session共享

  寫在前面:      首先宣告,筆者是一名Java程式設計屆的小學生。前面一直在幾家公司裡面做開發,其實都是一些傳統的專案,對於像分散式啦,叢集啦一些大型的專案接觸的很少,所以一直沒有自己整合和實現過。由於最近幾天專案不是很忙,自己又有點時間

Spring Boot實現logback多環境日誌配置(日誌輸出)

  Spring Boot中實現logback多環境日誌配置 - EasonJim - 部落格園 https://www.cnblogs.com/EasonJim/p/7801549.html   Spring Boot中實現logback多環境日誌配置 方法

Spring boot + mvn 實現簡單web記事本

功能需求: web應用中實現簡易記事本,內容儲存到本地檔案 概要設計: 1.spring boot實現前後端訊息傳送 2.業務類中實現寫入本地檔案 實現: 1.spring boot搭建 mvn匯入spring boot核心包 其中thymeleaf包的作

spring boot aop記錄介面呼叫情況

引入依賴 <!-- 引入aop--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>sprin