最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot下使用自定義監(jiān)聽事件的流程分析

 更新時間:2023年08月07日 09:32:18   作者:楓葉梨花  
事件機制是Spring的一個功能,目前我們使用了SpringBoot框架,所以記錄下事件機制在SpringBoot框架下的使用,同時實現(xiàn)異步處理,這篇文章主要介紹了SpringBoot下使用自定義監(jiān)聽事件,需要的朋友可以參考下

事件機制是Spring的一個功能,目前我們使用了SpringBoot框架,所以記錄下事件機制在SpringBoot框架下的使用,同時實現(xiàn)異步處理。事件機制其實就是使用了觀察者模式(發(fā)布-訂閱模式)。

Spring的事件機制經(jīng)過如下流程:

  • 1、自定義事件,繼承org.springframework.context.ApplicationEvent抽象類
  • 2、定義事件監(jiān)聽器,實現(xiàn)org.springframework.context.ApplicationListener接口
  • 3、在Spring容器中發(fā)布事件

SpringBoot的實例程序

實現(xiàn)一個保存用戶的時候,向用戶提供的郵箱發(fā)送一封郵件的功能,同時采用異步處理。

自定義事件

import org.springframework.context.ApplicationEvent;
public class EmailEvent extends ApplicationEvent {
	private static final long serialVersionUID = 3733891603598996786L;
	private String emailAddress;
	public EmailEvent(String emailAddress) {
		super(emailAddress);
		this.emailAddress = emailAddress;
	}
	public String getEmailAddress() {
		return emailAddress;
	}
	public void setEmailAddress(String emailAddress) {
		this.emailAddress = emailAddress;
	}
}

定義事件監(jiān)聽器

import java.util.concurrent.TimeUnit;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.ApplicationListener;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;
@Component
public class EmailEventListener implements ApplicationListener<EmailEvent> {
	private static Logger log = LoggerFactory.getLogger(EmailEventListener.class);
	// 異步處理
	@Async
	@Override
	public void onApplicationEvent(EmailEvent event) {
		log.info("監(jiān)聽到事件--郵箱地址:" + event.getEmailAddress());
		//模擬處理的耗時3s
		try {
			TimeUnit.SECONDS.sleep(3);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		log.info("事件處理完成");
	}
}

發(fā)布事件

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Component;
@Component
public class EmailEventPublish {
	@Autowired
	private ApplicationContext applicationContext;
	public void publishEvent(String emailAddress) {
		EmailEvent event = new EmailEvent(emailAddress);
		applicationContext.publishEvent(event);
	}
}

調(diào)用事件

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import com.example.demo.event.EmailEventPublish;
@RestController
public class EventController {
	private static Logger log = LoggerFactory.getLogger(EventController.class);
	@Autowired
	private EmailEventPublish emailEventPublish;
	@RequestMapping("/event")
	public void publishEvent(@RequestParam String emailAddress) {
		// 發(fā)布事件 -- 采用異步處理
		emailEventPublish.publishEvent(emailAddress);
		// 正常該語句先執(zhí)行
		log.info("Controller業(yè)務(wù)處理");
	}
}

結(jié)果

訪問如下地址

http://localhost:8080/event?emailAddress=plf@163.com

結(jié)果為

2023-08-04 21:21:14.338  INFO 6400 --- [nio-8080-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring FrameworkServlet 'dispatcherServlet'
2023-08-04 21:21:14.338  INFO 6400 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : FrameworkServlet 'dispatcherServlet': initialization started
2023-08-04 21:21:14.370  INFO 6400 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : FrameworkServlet 'dispatcherServlet': initialization completed in 32 ms
2023-08-04 21:21:14.429  INFO 6400 --- [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
2023-08-04 21:21:14.534  INFO 6400 --- [nio-8080-exec-1] c.e.demo.controller.EventController      : Controller業(yè)務(wù)處理
2023-08-04 21:21:14.535  INFO 6400 --- [cTaskExecutor-1] c.example.demo.event.EmailEventListener  : 監(jiān)聽到事件--郵箱地址:plf@163.com
2023-08-04 21:21:17.536  INFO 6400 --- [cTaskExecutor-1] c.example.demo.event.EmailEventListener  : 事件處理完成

上述結(jié)果可知是實現(xiàn)了異步處理,先打印了事件之后的程序,等時間到再執(zhí)行監(jiān)聽程序的代碼。

實現(xiàn)異步處理就是在監(jiān)聽事件執(zhí)行業(yè)務(wù)代碼的方法上添加 @Async 注解,同時在啟動類上添加 @EnableAsync 即可。

上面的日志還提到了 TaskExecutor ,這是如果有自定義的線程池就會去調(diào)用,如果沒有就用默認的。我們也可以自己定義一個 TaskExecutor 。

import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.lang.Nullable;
import org.springframework.scheduling.annotation.AsyncConfigurer;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import java.util.concurrent.Executor;
import java.util.concurrent.ThreadPoolExecutor;
@EnableAsync
@Configuration
public class ThreadPool implements AsyncConfigurer {
	@Nullable
	@Override
	@Bean("taskExecutor")
	public Executor getAsyncExecutor() {
		ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
		// 線程池創(chuàng)建時候初始化的線程數(shù)
		executor.setCorePoolSize(10);
		// 線程池最大的線程數(shù),只有在緩沖隊列滿了之后才會申請超過核心線程數(shù)的線程
		executor.setMaxPoolSize(20);
		// 用來緩沖執(zhí)行任務(wù)的隊列
		executor.setQueueCapacity(200);
		// 允許線程的空閑時間60秒
		executor.setKeepAliveSeconds(60);
		// 線程池名的前綴
		executor.setThreadNamePrefix("taskExecutor-");
		// 線程池對拒絕任務(wù)的處理策略
		executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
		executor.initialize();
		return executor;
	}
	@Nullable
	@Override
	public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
		return null;
	}
}

結(jié)果

2023-08-04 21:27:36.507  INFO 7848 --- [nio-8080-exec-2] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring FrameworkServlet 'dispatcherServlet'
2023-08-04 21:27:36.507  INFO 7848 --- [nio-8080-exec-2] o.s.web.servlet.DispatcherServlet        : FrameworkServlet 'dispatcherServlet': initialization started
2023-08-04 21:27:36.537  INFO 7848 --- [nio-8080-exec-2] o.s.web.servlet.DispatcherServlet        : FrameworkServlet 'dispatcherServlet': initialization completed in 30 ms
2023-08-04 21:27:36.757  INFO 7848 --- [nio-8080-exec-2] c.e.demo.controller.EventController      : Controller業(yè)務(wù)處理
2023-08-04 21:27:36.757  INFO 7848 --- [ taskExecutor-1] c.example.demo.event.EmailEventListener  : 監(jiān)聽到事件--郵箱地址:plf@163.com
2023-08-04 21:27:39.757  INFO 7848 --- [ taskExecutor-1] c.example.demo.event.EmailEventListener  : 事件處理完成

可知是使用我們定義的線程池[ taskExecutor-1] 。

總結(jié)

Spring的事件機制是一個很實用的一個功能,在監(jiān)聽和異步處理相關(guān)的功能比較適合。

到此這篇關(guān)于SpringBoot下使用自定義監(jiān)聽事件的文章就介紹到這了,更多相關(guān)SpringBoot自定義監(jiān)聽事件內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Spring Boot + MyBatis Plus 高效開發(fā)實戰(zhàn)從入門到進階優(yōu)化(推薦)

    Spring Boot + MyBatis Plus 高效開發(fā)實戰(zhàn)從入

    本文將詳細介紹 Spring Boot + MyBatis Plus 的完整開發(fā)流程,并深入剖析分頁查詢、批量操作、動態(tài) SQL、樂觀鎖、代碼優(yōu)化等實戰(zhàn)技巧,感興趣的朋友一起看看吧
    2025-04-04
  • SpringBoot配置lombok與logback過程解析

    SpringBoot配置lombok與logback過程解析

    這篇文章主要介紹了SpringBoot配置lombok與logback過程解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-05-05
  • 聊聊Java并發(fā)中的Synchronized

    聊聊Java并發(fā)中的Synchronized

    這篇文章主要介紹了聊聊Java并發(fā)中的Synchronized,介紹了同步的基礎(chǔ),原理,鎖的相關(guān)內(nèi)容,具有一定參考價值,需要的朋友可以了解下。
    2017-11-11
  • Java全面細致講解==和equals的使用

    Java全面細致講解==和equals的使用

    這篇文章主要介紹了Java中==和equals()的區(qū)別,,==可以使用在基本數(shù)據(jù)類型變量和引用數(shù)據(jù)類型變量中,equals()是方法,只能用于引用數(shù)據(jù)類型,需要的朋友可以參考下
    2022-05-05
  • Rabbitmq消息推送功能實現(xiàn)示例

    Rabbitmq消息推送功能實現(xiàn)示例

    rabbitMQ為異步消息處理提出了一個很好的解決方案,它是一個非常好用的消息中間件。主要解決當生產(chǎn)者大量產(chǎn)生數(shù)據(jù)時,消費者無法快速消費的問題。這個時候需要一個中間層,保存這個數(shù)據(jù),rabbitMQ是一個很好的解決方案
    2022-12-12
  • SpringBoot多環(huán)境配置數(shù)據(jù)讀取方式

    SpringBoot多環(huán)境配置數(shù)據(jù)讀取方式

    SpringBoot通過環(huán)境隔離機制,支持properties/yaml/yml多格式配置,結(jié)合@Value、Environment和@ConfigurationProperties實現(xiàn)靈活配置讀取,下面給大家介紹SpringBoot之多環(huán)境配置全解析,感興趣的朋友一起看看吧
    2025-07-07
  • Spring實現(xiàn)上拉刷新和下拉加載效果

    Spring實現(xiàn)上拉刷新和下拉加載效果

    這篇文章主要為大家詳細介紹了Spring實現(xiàn)上拉刷新和下拉加載效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-12-12
  • Redis緩存策略超詳細講解

    Redis緩存策略超詳細講解

    實際開發(fā)中緩存處理是必須的,不可能我們每次客戶端去請求一次服務(wù)器,服務(wù)器每次都要去數(shù)據(jù)庫中進行查找,為什么要使用緩存?說到底是為了提高系統(tǒng)的運行速度
    2022-09-09
  • java 數(shù)據(jù)結(jié)構(gòu)基本算法希爾排序

    java 數(shù)據(jù)結(jié)構(gòu)基本算法希爾排序

    這篇文章主要介紹了數(shù)據(jù)結(jié)構(gòu)基本算法希爾排序的相關(guān)資料,需要的朋友可以參考下
    2017-08-08
  • 線上Java程序占用CPU過高解決方案

    線上Java程序占用CPU過高解決方案

    這篇文章主要介紹了線上Java程序占用CPU過高解決方案,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-11-11

最新評論

息烽县| 桑日县| 南华县| 汶川县| 琼结县| 三门峡市| 瓦房店市| 孟连| 德钦县| 八宿县| 辉县市| 来宾市| 安顺市| 靖安县| 仁化县| 肇庆市| 临颍县| 鱼台县| 鹤峰县| 名山县| 金华市| 汉阴县| 江西省| 乌什县| 平度市| 梁河县| 仪征市| 施秉县| 高青县| 罗平县| 永和县| 和静县| 吉林省| 乐平市| 昭通市| 黑河市| 分宜县| 昭平县| 甘肃省| 隆德县| 东明县|