Java:SpringBoot实现ApplicationEvent事件的监听和发布
创始人
2024-05-30 00:01:24
0

通过发布订阅模式实现数据的异步处理,比如异步处理邮件发送

新建SpringBoot项目

项目结构

.
├── 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

pom.xml


4.0.0org.springframework.bootspring-boot-starter-parent2.7.7 com.exampledemo0.0.1-SNAPSHOTdemoDemo project for Spring Boot1.8org.springframework.bootspring-boot-starter-weborg.springframework.bootspring-boot-devtoolsruntimetrueorg.projectlomboklomboktrueorg.springframework.bootspring-boot-starter-testtestorg.springframework.bootspring-boot-maven-pluginorg.projectlomboklombok

Application.java

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);}
}

TaskPoolConfig.java

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;/*** 线程池参数配置**/
@EnableAsync
@Configuration
public class TaskPoolConfig {/*** 自定义线程池**/@Beanpublic Executor taskExecutor() {//返回可用处理器的Java虚拟机的数量 12int i = Runtime.getRuntime().availableProcessors();System.out.println("系统最大线程数  : " + i);ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();//核心线程池大小executor.setCorePoolSize(16);//最大线程数executor.setMaxPoolSize(20);//配置队列容量,默认值为Integer.MAX_VALUEexecutor.setQueueCapacity(99999);//活跃时间executor.setKeepAliveSeconds(60);//线程名字前缀executor.setThreadNamePrefix("asyncServiceExecutor -");//设置此执行程序应该在关闭时阻止的最大秒数,以便在容器的其余部分继续关闭之前等待剩余的任务完成他们的执行executor.setAwaitTerminationSeconds(60);//等待所有的任务结束后再关闭线程池executor.setWaitForTasksToCompleteOnShutdown(true);return executor;}
}

EmailDto.java

package com.example.demo.entity;import lombok.Data;@Data
public class EmailDto {private String email;private String subject;private String content;
}

SendEmailEvent.java

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;}
}

SendEmailListener.java

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;/*** 事件监听器*/
@Component
public class SendEmailListener implements ApplicationListener {@Autowiredprivate SendEmailService sendEmailService;@Async@Overridepublic void onApplicationEvent(SendEmailEvent event) {EmailDto emailDto = event.getEmailDto();this.sendEmailService.sendEmail(emailDto);}
}

SendEmailService.java

package com.example.demo.service;import com.example.demo.entity.EmailDto;public interface SendEmailService {void sendEmail(EmailDto emailDto);
}

SendEmailServiceImpl.java

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 {@Overridepublic void sendEmail(EmailDto emailDto) {try {// 模拟耗时3秒Thread.sleep(3 * 1000);} catch (Exception e) {System.out.println("Email发送异常");}System.out.println("Email发送成功 " + emailDto);}
}

IndexController.java

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 {@Autowiredprivate ApplicationEventPublisher publisher;@GetMapping("/sendEmail")public String sendEmail() {EmailDto emailDto = new EmailDto();emailDto.setEmail("tom@qq.com");emailDto.setSubject("邮件标题");emailDto.setContent("邮件内容");// 发布事件publisher.publishEvent(new SendEmailEvent(emailDto));return "success";}
}

参考

  • Spring事件机制 ApplicationEventPublisher

相关内容

热门资讯

魅族降系统安卓13系统,探索无... 你知道吗?最近手机圈里可是炸开了锅,魅族这个品牌竟然悄悄地给自家手机升级了安卓13系统!这可真是让人...
安卓手机查看系统信息,系统信息... 你有没有想过,你的安卓手机里藏着多少秘密?别小看那小小的屏幕,它可是个信息宝库呢!今天,就让我带你一...
安卓7.0系统相机崩溃,原因分... 最近是不是你也遇到了安卓7.0系统相机崩溃的烦恼?别急,让我来给你详细说说这个让人头疼的问题,让你一...
安卓u子系统系统u盘,Andr... 你有没有想过,你的安卓手机里有一个神秘的“U子系统”,它就像一个隐藏的宝藏,等待着你去探索。今天,就...
联想怎么下载安卓系统,安卓系统... 你有没有想过,你的联想手机或者平板,有一天也能装上安卓系统的全新面貌呢?没错,今天就要来手把手教你如...
查老式安卓系统版本,展望未来 你有没有发现,手机里的安卓系统版本有时候就像是个神秘的宝藏,藏着许多不为人知的秘密呢?今天,就让我带...
核酸录入安卓机系统,基于安卓系... 你有没有想过,那些看似简单的核酸检测,背后竟然有这么复杂的“大脑”——安卓机系统?没错,就是那个我们...
高邮苹果刷安卓系统,安卓系统助... 你有没有想过,那些我们平时吃的苹果,竟然也能刷上安卓系统?听起来是不是有点不可思议?没错,今天就要带...
安卓系统的ar眼镜,安卓系统赋... 你有没有想过,未来科技的世界里,眼镜不仅仅是用来看清世界的工具,还能成为你的得力助手?没错,说的就是...
怎样删安卓系统垃圾,揭秘安卓系... 手机里的安卓系统是不是越来越卡了?是不是觉得那些垃圾文件占据了太多空间,让你头疼不已?别急,今天就来...
畅享10安卓系统,畅享智能生活... 你有没有听说啊?最近安卓系统又来了一次大升级,这次可是直接跳到了10版本,听起来是不是很酷炫?没错,...
安卓怎么刷荣耀系统,轻松刷入荣... 你有没有想过,你的安卓手机能不能来点不一样的风采呢?没错,就是刷机!今天,就让我来带你一起探索如何给...
安卓系统游戏占用内存,揭秘内存... 手机里的游戏是不是越来越多了?每次打开,那内存占用简直让人头疼!今天,就让我来和你聊聊安卓系统游戏占...
安卓驱动系统开发,基于安卓驱动... 你有没有想过,你的安卓手机里那些神奇的驱动系统是怎么来的?没错,就是那些让手机能够顺畅运行各种应用的...
安卓更新系统14,系统革新与未... 你知道吗?最近安卓系统又来了一次大变身,那就是安卓更新系统14!这可不是一个小打小闹的更新,而是带来...
安卓手机按键刷系统,轻松实现系... 你有没有想过,你的安卓手机按键居然也能刷系统呢?没错,你没听错!今天,就让我带你一起探索这个神奇的小...
安卓系统电脑下载图片,轻松获取... 你有没有想过,在电脑上下载图片竟然也能变得如此简单?没错,就是那个我们每天都离不开的安卓系统,它现在...
安卓系统电池描述文件,深度解析... 你有没有发现,手机用着用着,电池就有点不给力了?别急,今天就来给你揭秘安卓系统里的那个神秘角色——电...
鸿蒙系统基于安卓内核,融合与创... 你知道吗?最近科技圈里有个大新闻,那就是华为的鸿蒙系统。没错,就是那个让安卓和iOS都黯然失色的操作...
云os系统装安卓,轻松实现安卓... 你有没有想过,你的手机或者平板电脑,其实可以像电脑一样,装上各种各样的操作系统呢?没错,今天就要来聊...