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

相关内容

热门资讯

我来教大家“云雀麻将辅助器ap... 您好,云雀麻将这款游戏可以开挂的,确实是有挂的,需要了解加微{7198902}很多玩家在这款游戏中打...
我来教大家“来几局麻将辅助器a... 亲,来几局麻将这款游戏可以开挂的,确实是有挂的,。但是开挂要下载第三方辅助软件,来几局麻将的开挂软件...
我来教大家“口袋广丰辅助器ap... 我来教大家“口袋广丰辅助器app官方下载最新版本更新”详细分享开挂1、让任何用户在无需AI插件第三方...
我来教大家“安喜辅助器app官... 您好,安喜这款游戏可以开挂的,确实是有挂的,需要了解加微{7198902}很多玩家在这款游戏中打牌都...
我来教大家“彩虹辅助器app官... 我来教大家“彩虹辅助器app官方下载最新版本更新”详细分享开挂1、让任何用户在无需AI插件第三方神器...
我来教大家“天天南通长牌辅助器... 亲,天天南通长牌这款游戏可以开挂的,确实是有挂的,。但是开挂要下载第三方辅助软件,天天南通长牌的开挂...
我来教大家“奕乐麻将辅助器ap... 亲,奕乐麻将这款游戏可以开挂的,确实是有挂的,。但是开挂要下载第三方辅助软件,奕乐麻将的开挂软件,名...
我来教大家“掌酷天天开心辅助器... 您好,掌酷天天开心这款游戏可以开挂的,确实是有挂的,需要了解加微{7198902}很多玩家在这款游戏...
我来教大家“老铁联盟辅助器ap... 亲,老铁联盟这款游戏可以开挂的,确实是有挂的,。但是开挂要下载第三方辅助软件,老铁联盟的开挂软件,名...
我来教大家“星悦陕西麻将辅助器... 您好,星悦陕西麻将这款游戏可以开挂的,确实是有挂的,需要了解加微{7198902}很多玩家在这款游戏...
我来教大家“天道联盟辅助器ap... 我来教大家“天道联盟辅助器app官方下载最新版本更新”详细分享开挂1、让任何用户在无需AI插件第三方...
我来教大家“开心休闲辅助器ap... 我来教大家“开心休闲辅助器app官方下载最新版本更新”详细分享开挂一、开心休闲AI软件牌型概率发牌机...
我来教大家“518葫芦岛麻将辅... 我来教大家“518葫芦岛麻将辅助器app官方下载最新版本更新”详细分享开挂1、让任何用户在无需AI插...
我来教大家“荔枝花棋牌辅助器a... 您好,荔枝花棋牌这款游戏可以开挂的,确实是有挂的,需要了解加微{7198902}很多玩家在这款游戏中...
我来教大家“渔舟唱晚辅助器ap... 我来教大家“渔舟唱晚辅助器app官方下载最新版本更新”详细分享开挂一、渔舟唱晚AI软件牌型概率发牌机...
我来教大家“广客麻将辅助器ap... 我来教大家“广客麻将辅助器app官方下载最新版本更新”详细分享开挂一、广客麻将AI软件牌型概率发牌机...
我来教大家“一喜棋牌辅助器ap... 您好,一喜棋牌这款游戏可以开挂的,确实是有挂的,需要了解加微{7198902}很多玩家在这款游戏中打...
我来教大家“熊猫互娱辅助器ap... 亲,熊猫互娱这款游戏可以开挂的,确实是有挂的,。但是开挂要下载第三方辅助软件,熊猫互娱的开挂软件,名...
我来教大家“欢乐卡五星辅助器a... 您好,欢乐卡五星这款游戏可以开挂的,确实是有挂的,需要了解加微{7198902}很多玩家在这款游戏中...
我来教大家“山海棋牌辅助器ap... 我来教大家“山海棋牌辅助器app官方下载最新版本更新”详细分享开挂一、山海棋牌AI软件牌型概率发牌机...