springboot2.4实现事件监听
物料准备:
1.一个事件类
2.一个监听方法
3.发布事件
自定义一个事件类MyEvent.java
package com.example.demo.evt;
import lombok.Data;
/**
* 1.创建事件类
*
* 创建1个事件类,用于封装你想传递的数据。
* 这个事件类可以是一个普通的pojo类,不需要实现任何特定的接口
*/
@Data
public class MyEvent {
private Long ts;
private String msg;
}
定义事件的监听类及监听方法
package com.example.demo.evt;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;
/**
* 2.创建监听方法
*
* 在合适的类或组件中创建一个监听方法,
* 用 @EventListener 注解标注这个方法,
* 并指定要监听的事件类型作为参数
*
*
*/
@Slf4j
@Component
public class MyEvtListener {
@EventListener
public void handleEvent(MyEvent myEvent) {
String msg = myEvent.getMsg();
Long ts = myEvent.getTs();
log.info("监听逻辑t1---evt msg:{}",msg);
log.info("监听逻辑t1---evt ts:{}",ts);
}
// @EventListener 方法可以有多个,并且可以监听不同类型的事件。
// 当事件被发布时,所有匹配的 @EventListener 方法都会触发。
//
// 多个EventListener方法监听 同一个事件对象 时,监听方法的执行顺序是随机的。
//
@EventListener
public void handleEvent2(MyEvent myEvent) {
String msg = myEvent.getMsg();
Long ts = myEvent.getTs();
log.info("监听逻辑t2-evt msg:{}",msg);
log.info("监听逻辑t2-evt ts:{}",ts);
}
}
发布事件
package com.example.demo.evt;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.stereotype.Component;
/**
* 3.发布事件: 在适当的时候,通过 ApplicationEventPublisher 发布事件。
*
* 可以通过publishEvent方法来发布事件,将事件对象作为参数传递给该方法。
*
*/
@Component
public class PubEvt {
@Autowired
private ApplicationEventPublisher eventPublisher;
//如果想实现 异步发送事件,可以在这个方法上加@Async注解
public void sendMsgEvt(String msg){
//创建 事件对象
MyEvent event = new MyEvent();
event.setMsg(msg);
event.setTs(System.currentTimeMillis());
//发布 事件对象
eventPublisher.publishEvent(event);
}
}
测试发布事件
@Component
@Slf4j
public class TestPub {
@Autowired
private PubEvt pubEvt;
@Scheduled(cron = "*/5 * * * * ?")
public void testSend() throws Exception{
pubEvt.sendMsgEvt("ret23t23t--"+System.currentTimeMillis());
}
}
2023-07-02 10:44:49.445 INFO 8424 --- [ main] com.example.demo.DemoApplication : Started DemoApplication in 3.111 seconds (JVM running for 3.752)
2023-07-02 10:44:50.013 INFO 8424 --- [ scheduling-1] com.example.demo.evt.MyEvtListener : 监听逻辑t2-evt msg:ret23t23t--1688525090013
2023-07-02 10:44:50.024 INFO 8424 --- [ scheduling-1] com.example.demo.evt.MyEvtListener : 监听逻辑t2-evt ts:1688525090013
2023-07-02 10:44:50.024 INFO 8424 --- [ scheduling-1] com.example.demo.evt.MyEvtListener : 监听逻辑t1---evt msg:ret23t23t--1688525090013
2023-07-02 10:44:50.024 INFO 8424 --- [ scheduling-1] com.example.demo.evt.MyEvtListener : 监听逻辑t1---evt ts:1688525090013