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

相关内容

热门资讯

蚌埠系统门窗安装流程,蚌埠系统... 蚌埠系统门窗安装流程详解随着人们对居住环境要求的提高,系统门窗因其优异的性能和美观的外观,越来越受到...
清华同方系统安装黑屏,清华同方... 清华同方电脑系统安装黑屏问题解析及解决方法一、黑屏原因分析1. 硬件故障:电脑硬件故障是导致系统安装...
安装治安系统入账,治安系统安装... 治安系统安装入账流程详解随着社会治安形势的日益复杂,治安系统的安装与维护已成为保障社会安全的重要手段...
安卓安装win7系统,如何在安... 如何在安卓设备上安装Windows 7系统一、准备工作在开始安装Windows 7之前,您需要做好以...
安装原版系统bootmgr 安装原版系统Bootmgr:解决系统引导问题 重拾流畅体验在电脑使用过程中,我们可能会遇到各种...
宝塔系统安装证书,宝塔系统安装... 宝塔系统安装SSL证书的详细教程随着网络安全意识的不断提高,越来越多的网站开始使用SSL证书来保障用...
安卓怎么安装系统更新包,安卓手... 安卓手机系统更新包安装指南一、通过官方渠道更新系统1. 打开手机设置首先,在手机主屏幕上找到并点击“...
安装在虚拟机的系统怎么安装wi... 如何在虚拟机中安装Windows 7系统 准备阶段在开始安装Windows 7系统之前,我们需要做一...
安装显卡导致系统崩溃,原因与解... 显卡驱动安装不当导致系统崩溃:原因与解决方法随着电脑硬件的不断发展,显卡作为电脑性能的重要组成部分,...
报警系统安装联网,守护安全,构... 报警系统安装联网:守护安全,构建智慧社区随着社会的发展和科技的进步,报警系统的安装与联网已经成为现代...
安卓系统凭密码安装应用,安全与... 安卓系统凭密码安装应用:安全与便捷的双重保障随着智能手机的普及,安卓系统因其开放性和丰富的应用生态而...
北斗定位系统模块安装,技术革新... 北斗定位系统模块安装:技术革新助力多领域发展一、北斗定位系统模块简介北斗定位系统是我国自主研发的全球...
白城电脑系统安装价钱,电脑系统... 白城电脑系统安装价格一览,让您明明白白消费一、电脑系统安装的必要性电脑系统是电脑的核心组成部分,它负...
驱动安装卡在系统检查,驱动安装... 驱动安装卡在系统检查怎么办?解决方法大揭秘在电脑使用过程中,我们经常会遇到各种问题,其中驱动安装卡在...
安装鱼缸底滤系统,鱼缸底滤系统... 鱼缸底滤系统安装全攻略鱼缸底滤系统是维护鱼缸水质的重要设备,它能有效过滤掉鱼缸中的杂质和有害物质,为...
清洁大师如何安装系统,清洁大师... 清洁大师U盘安装系统教程一、准备工作在开始安装系统之前,我们需要做好以下准备工作: 准备一个至少2...
安装系统展开文件时蓝屏,安装系... 安装系统展开文件时蓝屏的原因及解决方法在电脑使用过程中,遇到安装系统展开文件时蓝屏的情况,无疑会让用...
清灰后安装系统更新,电脑清灰后... 电脑清灰后,系统更新的重要性与操作指南随着电脑使用时间的增长,灰尘的积累会严重影响电脑的散热性能,进...
安装系统找不到驱动盘,安装系统... 安装系统时找不到驱动盘的解决方法详解在安装操作系统时,有时候会遇到找不到驱动盘的情况,这可能会让许多...
安装系统装载虚拟光驱,如何使用... 如何使用虚拟光驱安装操作系统——轻松实现系统升级与备份一、什么是虚拟光驱?虚拟光驱是一种软件,它可以...