您好,登錄后才能下訂單哦!
這篇文章主要介紹“SpringBoot如何實(shí)現(xiàn)ApplicationEvent事件的監(jiān)聽與發(fā)布”,在日常操作中,相信很多人在SpringBoot如何實(shí)現(xiàn)ApplicationEvent事件的監(jiān)聽與發(fā)布問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”SpringBoot如何實(shí)現(xiàn)ApplicationEvent事件的監(jiān)聽與發(fā)布”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!
通過發(fā)布訂閱模式實(shí)現(xiàn)數(shù)據(jù)的異步處理,比如異步處理郵件發(fā)送
項(xiàng)目結(jié)構(gòu)
.
├── pom.xml
└── src
└── main
├── java
│ └── com
│ └── example
│ └── demo
│ ├── Application.java
│ ├── config
│ │ └── TaskPoolConfig.java
│ ├── controller
│ │ └── IndexController.java
│ ├── entity
│ │ └── EmailDto.java
│ ├── event
│ │ └── SendEmailEvent.java
│ ├── listener
│ │ └── SendEmailListener.java
│ └── service
│ ├── SendEmailService.java
│ └── impl
│ └── SendEmailServiceImpl.java
└── resources
├── application.yml
├── static
└── templates
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.7.7</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.example</groupId> <artifactId>demo</artifactId> <version>0.0.1-SNAPSHOT</version> <name>demo</name> <description>Demo project for Spring Boot</description> <properties> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> <optional>true</optional> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <excludes> <exclude> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </exclude> </excludes> </configuration> </plugin> </plugins> </build> </project>
package com.example.demo; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } }
package com.example.demo.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.annotation.EnableAsync; import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; import java.util.concurrent.Executor; /** * 線程池參數(shù)配置 **/ @EnableAsync @Configuration public class TaskPoolConfig { /** * 自定義線程池 **/ @Bean public Executor taskExecutor() { //返回可用處理器的Java虛擬機(jī)的數(shù)量 12 int i = Runtime.getRuntime().availableProcessors(); System.out.println("系統(tǒng)最大線程數(shù) : " + i); ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); //核心線程池大小 executor.setCorePoolSize(16); //最大線程數(shù) executor.setMaxPoolSize(20); //配置隊(duì)列容量,默認(rèn)值為Integer.MAX_VALUE executor.setQueueCapacity(99999); //活躍時間 executor.setKeepAliveSeconds(60); //線程名字前綴 executor.setThreadNamePrefix("asyncServiceExecutor -"); //設(shè)置此執(zhí)行程序應(yīng)該在關(guān)閉時阻止的最大秒數(shù),以便在容器的其余部分繼續(xù)關(guān)閉之前等待剩余的任務(wù)完成他們的執(zhí)行 executor.setAwaitTerminationSeconds(60); //等待所有的任務(wù)結(jié)束后再關(guān)閉線程池 executor.setWaitForTasksToCompleteOnShutdown(true); return executor; } }
package com.example.demo.entity; import lombok.Data; @Data public class EmailDto { private String email; private String subject; private String content; }
package com.example.demo.event; import com.example.demo.entity.EmailDto; import org.springframework.context.ApplicationEvent; /** * 自定義事件 */ public class SendEmailEvent extends ApplicationEvent { private EmailDto emailDto; public SendEmailEvent(EmailDto emailDto) { super(emailDto); this.emailDto = emailDto; } public EmailDto getEmailDto() { return this.emailDto; } }
package com.example.demo.listener; import com.example.demo.entity.EmailDto; import com.example.demo.event.SendEmailEvent; import com.example.demo.service.SendEmailService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationListener; import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Component; /** * 事件監(jiān)聽器 */ @Component public class SendEmailListener implements ApplicationListener<SendEmailEvent> { @Autowired private SendEmailService sendEmailService; @Async @Override public void onApplicationEvent(SendEmailEvent event) { EmailDto emailDto = event.getEmailDto(); this.sendEmailService.sendEmail(emailDto); } }
package com.example.demo.service; import com.example.demo.entity.EmailDto; public interface SendEmailService { void sendEmail(EmailDto emailDto); }
package com.example.demo.service.impl; import com.example.demo.entity.EmailDto; import com.example.demo.service.SendEmailService; import org.springframework.stereotype.Service; @Service public class SendEmailServiceImpl implements SendEmailService { @Override public void sendEmail(EmailDto emailDto) { try { // 模擬耗時3秒 Thread.sleep(3 * 1000); } catch (Exception e) { System.out.println("Email發(fā)送異常"); } System.out.println("Email發(fā)送成功 " + emailDto); } }
package com.example.demo.controller; import com.example.demo.entity.EmailDto; import com.example.demo.event.SendEmailEvent; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationEventPublisher; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class IndexController { @Autowired private ApplicationEventPublisher publisher; @GetMapping("/sendEmail") public String sendEmail() { EmailDto emailDto = new EmailDto(); emailDto.setEmail("tom@qq.com"); emailDto.setSubject("郵件標(biāo)題"); emailDto.setContent("郵件內(nèi)容"); // 發(fā)布事件 publisher.publishEvent(new SendEmailEvent(emailDto)); return "success"; } }
到此,關(guān)于“SpringBoot如何實(shí)現(xiàn)ApplicationEvent事件的監(jiān)聽與發(fā)布”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注億速云網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。