Spring Boot Event 观察者模式
时间:2022-08-05
本文章向大家介绍Spring Boot Event 观察者模式,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
event 使用ApplicationEvent和ApplicationListener
// event
public class OrderProductEvent extends ApplicationEvent {
public OrderProductEvent(Object source, String orderId) {
super(source);
this.orderId = orderId;
}
public String getOrderId() {
return orderId;
}
public void setOrderId(String orderId) {
this.orderId = orderId;
}
private String orderId;
}
// listener
@Component
public class OrderProductListener implements ApplicationListener<OrderProductEvent> {
@Async // 异步支持
@Override
public void onApplicationEvent(OrderProductEvent event) {
String orderId = event.getOrderId();
long start = System.currentTimeMillis();
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
long end = System.currentTimeMillis();
System.out.println(String.format("threadId %d, check order %s, takes %d ms", Thread.currentThread().getId(), orderId, end-start));
}
}
event 使用@EventListener
public class MsgEvent {
public MsgEvent(String orderId) {
this.orderId = orderId;
}
public String getOrderId() {
return orderId;
}
public void setOrderId(String orderId) {
this.orderId = orderId;
}
private String orderId;
}
@Component
public class MsgListener {
@Async // 异步支持
@EventListener(MsgEvent.class)
public void sendMsg(MsgEvent event) {
String orderId = event.getOrderId();
long start = System.currentTimeMillis();
System.out.println(String.format("threadId %d, send message", Thread.currentThread().getId()));
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
long end = System.currentTimeMillis();
System.out.println(String.format("threadId %d, send message %s, %d ms", Thread.currentThread().getId(), orderId, (end-start)));
}
}
service
@Service
public class OrderService {
private final ApplicationContext applicationContext;
@Autowired
public OrderService(ApplicationContext applicationContext) {
this.applicationContext = applicationContext;
}
public String buyOrder(String orderId) {
long start = System.currentTimeMillis();
// publish event
applicationContext.publishEvent(new OrderProductEvent(this, orderId));
long end = System.currentTimeMillis();
System.out.println(String.format("threadId %d, completed, %d ms", Thread.currentThread().getId(), end - start));
return "success";
}
public String buyOrder2(String orderId) {
long start = System.currentTimeMillis();
// publish event
applicationContext.publishEvent(new MsgEvent(orderId));
long end = System.currentTimeMillis();
System.out.println(String.format("threadId %d, completed, %d ms", Thread.currentThread().getId(), end - start));
return "success";
}
}
@EnableAsync // 异步支持
@SpringBootApplication
public class SpringeventApplication {
public static void main(String[] args) {
SpringApplication.run(SpringeventApplication.class, args);
}
}
测试
@SpringBootTest
class SpringeventApplicationTests {
@Autowired
private OrderService orderService;
@Test
public void buyOrderTest() {
System.out.println(String.format("thread id %d", Thread.currentThread().getId()));
orderService.buyOrder("12344");
System.out.println("completed.");
}
@Test
public void buyOrder2Test() {
System.out.println(String.format("thread id %d", Thread.currentThread().getId()));
orderService.buyOrder2("12344");
System.out.println("completed.");
}
}
参考:
https://zhuanlan.zhihu.com/p/541552814?utm_oi=963461047566483456
原文地址:https://www.cnblogs.com/mryux/p/16555593.html
- 埃隆·马斯克强烈推荐的5本书,看完之后他开始改变世界
- 算法:AOE网(Activity On edge Network)与关键路径简介
- ASP.NET Core的配置(4):多样性的配置来源[中篇]
- ASP.NET MVC的Razor引擎:RazorViewEngine
- 算法:求解AOE网的关键路径
- 编程小技巧:多态原理
- ASP.NET Core的配置(4):多样性的配置来源[下篇]
- 数据结构 图
- ASP.NET Core的配置(5):配置的同步[ 实例篇]
- TensorFlow 深度学习笔记 卷积神经网络
- 利用EntLib授权机制实现对ASP.NET页面的自动授权
- ASP.NET Core的配置(5):配置的同步[设计篇]
- 详解Redis内部运作机制
- TensorFlow深度学习笔记 循环神经网络实践
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- Linux 中使用 Fio 测评硬盘性能
- 基于Inception & Yearning做SQL审核的实践
- CSharp工程中的几个文件
- 桥接模式 桥梁模式 bridge 结构型 设计模式(十二)
- 在单体架构中应用Hystrix
- Go is not (very) simple, folks
- Python高级技巧:用一行代码减少一半内存占用
- 问答 | python 矩阵输出问题
- Android材料设计Material Design 开篇前言
- ASP.NET (Web) + C#算法 | 生成随机数字序列(随机数字+每个数字取随机不重复的位置和颜色)
- lucene思维导图,让搜索引擎不再难懂
- 在 Debian Stretch 上设置自动升级
- 基于jQuery的公告无限循环滚动实现代码
- 三个技巧 大幅减少 Docker 镜像体积
- 【DUBBO】 扩展机制ServiceLoaderExtensionLoader