Spring事件处理
创始人
2024-04-28 10:13:51
0

        在实际业务开发中,有时候复杂性的业务之间需要解耦,常用的方法:同步、异步、MQ。但 MQ 重啊,非必要不提升架构复杂度。

        针对同步和异步使用方式:1.定时器 2.Spring Event.

        Spring Event:

                观察者设计模式,一个 Bean 处理完成任务后希望通知其它 Bean 或者说一个 Bean监听另一个Bean 的行为。

配置异步线程池

package com.lean.event.demo.config;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.AsyncConfigurer;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;import java.util.concurrent.Executor;
import java.util.concurrent.ThreadPoolExecutor;@Configuration
public class AsynConfig implements AsyncConfigurer {private static final Logger log= LoggerFactory.getLogger(AsynConfig.class);@Bean("taskAsyncPool")public Executor orderTaskAsyncPool() {ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();executor.setCorePoolSize(10); // 核心线程数executor.setMaxPoolSize(20); // 最大线程数executor.setQueueCapacity(1000); // 队列大小executor.setKeepAliveSeconds(300); // 线程最大空闲时间executor.setThreadNamePrefix("async-Executor-"); // 指定用于新创建的线程名称的前缀。executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); // 拒绝策略(一共四种,此处省略)executor.initialize();return executor;}@Overridepublic Executor getAsyncExecutor() {return orderTaskAsyncPool();}// 异常处理器@Overridepublic AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {return (ex, method, params) -> log.error(String.format("执行异步任务'%s'", method), ex);}
}

1.同步

import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import org.springframework.context.ApplicationEvent;
/*** 自定义事件 继承ApplicationEvent*/
@Getter
@Setter
@ToString
public class MessageEvent extends ApplicationEvent {//传输的数据对象private String messageId;public MessageEvent(Object source, String messageId) {super(source);this.messageId = messageId;}
}
package com.lean.event.demo.listener;import com.lean.event.demo.events.MessageEvent;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.ApplicationListener;
import org.springframework.stereotype.Component;
/*** 同步* 监听器:* 实现方式:*      1.实现ApplicationListener*      2.@EventListener*/
@Slf4j
@Component
public class MessageListener implements ApplicationListener {@SneakyThrows@Overridepublic void onApplicationEvent(MessageEvent event) {String messageId = event.getMessageId();long start = System.currentTimeMillis();long end = System.currentTimeMillis();log.info("{}:耗时:({})毫秒", messageId, (end - start));}
}

2.异步

| 自定义事件

import lombok.AllArgsConstructor;
import lombok.Data;@Data
@AllArgsConstructor
public class MsgEvent {/*** 该类型事件携带的信息*/public String messageId;
}
import com.lean.event.demo.events.MsgEvent;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.event.EventListener;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;
@Slf4j
@Component
public class MsgListener {//异步注解 需要开启@EnableAsync异步@Async(value = "taskAsyncPool")@SneakyThrows@EventListener(MsgEvent.class)public void sendMsg(MsgEvent event) {String messageId = event.getMessageId();long start = System.currentTimeMillis();log.info("开发发送短信");log.info("开发发送邮件");long end = System.currentTimeMillis();log.info("{}:发送短信、邮件耗时:({})毫秒", messageId, (end - start));}
}
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableAsync;@EnableAsync
@SpringBootApplication
public class SpringLeanEventApplication {public static void main(String[] args) {SpringApplication.run(SpringLeanEventApplication.class, args);}}

3.测试

package com.lean.event.demo.service;import com.lean.event.demo.events.MsgEvent;
import com.lean.event.demo.events.MessageEvent;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Service;
@Slf4j
@Service
@Data
public class MessageService {/** 注入ApplicationContext用来发布事件 */private final ApplicationContext applicationContext;public String testMessage(String messageId) {long start = System.currentTimeMillis();// (同步处理)applicationContext.publishEvent(new MessageEvent(this, messageId));// (异步处理)applicationContext.publishEvent(new MsgEvent(messageId));long end = System.currentTimeMillis();log.info("任务全部完成,总耗时:({})毫秒", end - start);return "购买成功";}
}
package com.lean.event.demo;import com.lean.event.demo.service.MessageService;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;@SpringBootTest
public class MessageServiceTest {@Autowiredprivate MessageService messageService;@Testpublic void buyOrderTest() {messageService.testMessage("123456");}
}

ApplicationEvent: 

类的注释是,被应用事件继承的类,抽象的不能初始化;

 EventObject: 父类

 事件携带一个 Objecgt 对象,可以被发布。

事件监听者,监听到这个事件后,触发自定义逻辑 ( 操作 Object 对象);

注意:

        事件发布后,都会被监听ApplicationEvent的监听对象所监听到。

代码

相关内容

热门资讯

安卓50系统精简列表,极致体验 你有没有发现,手机系统更新换代的速度简直就像坐上了火箭呢?这不,安卓系统已经来到了50版本,而这次的...
凯迪拉克开放安卓系统吗,揭秘安... 你有没有想过,你的爱车凯迪拉克,是不是也能像智能手机一样,拥有丰富的应用生态呢?今天,就让我带你一探...
安卓系统退出微信,告别繁琐操作 你知道吗?最近安卓系统上的微信用户们可是炸开了锅呢!原因嘛,就是微信宣布了一项重大决定——退出安卓系...
华为手机不用安卓系统,打造自主... 你知道吗?最近有个大新闻在科技圈里炸开了锅,那就是华为手机竟然不用安卓系统!是不是很惊讶?别急,让我...
关于安卓系统怎么下载,安卓系统... 你有没有想过,你的安卓手机里那些好玩的应用是怎么来的呢?是不是觉得下载个应用就像变魔术一样简单?其实...
安卓7.1系统安装不了,无法安... 最近是不是有不少小伙伴在为安卓7.1系统安装问题头疼呢?别急,今天就来给你详细说说这个事儿,让你一次...
安卓系统安装限制 破解,揭秘破... 安卓系统安装限制及破解全解析在数字化时代,安卓系统以其开源免费的特点赢得了全球用户的喜爱。正如每一枚...
安卓系统怎么找手机,安卓系统手... 手机不见了?别慌张,让我来告诉你,安卓系统里怎么找手机吧!在这个信息爆炸的时代,手机可是我们生活中不...
安卓系统怎么蓝牙耳机,安卓系统... 你有没有想过,为什么你的安卓手机和蓝牙耳机总是那么默契地连接在一起?今天,就让我来带你一探究竟,揭秘...
保时捷和安卓系统互联,智能驾驶... 你有没有想过,你的手机和你的爱车之间也能来个甜蜜的“牵手”呢?没错,就是那个让人心跳加速的保时捷,还...
windows phone 安... 你有没有发现,现在手机市场上安卓系统几乎占据了半壁江山,而曾经的Windows Phone却逐渐淡出...
苹果咋样切换安卓系统,系统切换... 你有没有想过,有一天你的苹果手机突然变成了安卓系统?是不是觉得这听起来就像是从科幻电影里跳出来的情节...
安卓系统层级抓包,安卓系统层级... 你有没有想过,手机里的那些应用是怎么知道你的喜好,还能精准推送广告给你的呢?这背后,可是有安卓系统层...
安卓系统更新怎么退出,安卓系统... 亲爱的安卓用户们,你是否在更新系统时突然遇到了一些小麻烦,比如不小心按下了更新按钮,然后系统就开始自...
安卓系统多次密码错误,多重解决... 你是不是也遇到了这个让人头疼的问题?安卓系统多次密码错误,是不是让你感觉像是被无形的锁链困住了?别急...
安卓系统怎么玩夸克,轻松上手夸... 你有没有发现,安卓手机上有个超好用的浏览器——夸克?它不仅速度快,功能强大,还能帮你省流量,是不是很...
米原生安卓系统下载,下载与体验... 亲爱的手机控们,你是否厌倦了那些花里胡哨的安卓系统,想要回归最纯粹的原生态?那就跟着我一起探索米原生...
安卓系统铃声无法修改,探究原因... 你有没有遇到过这种情况?手机里下载了各种好听的铃声,可就是找不到修改铃声的方法。别急,今天就来给你详...
扫描仪安卓系统,安卓系统扫描仪... 你有没有想过,家里的安卓手机竟然能变成一个强大的扫描仪?没错,就是那个你每天不离手的手机,现在竟然能...
安卓苹果系统换机教程,一步到位... 你终于决定给手机来个换血大手术了?恭喜你,迈出了迈向新世界的第一步!不过,别急,换机可不是那么简单的...