定义事件实体
这里可以自己增加字段存储事件的数据
@Data
@Builder
public class EventMessage {
/**
* 事件代码
*/
private String code;
/**
* 事件资源
*/
private String message;
/**
* byte资源
*/
private byte[] bytes;
}
定义事件
- 继承ApplicationEvent类。
- 在构造器中传入参数,可以是任何类型。
public class CustomEvent extends ApplicationEvent {
public CustomEvent(EventMessage source) {
super(source);
}
}
发布事件
- 这里可以设置String,主要是看数据类型来设置。
@Service
public class XXXService {
@Autowired
private ApplicationEventPublisher applicationEventPublisher;
public void doJob(String name) {
applicationEventPublisher.publishEvent(
new CustomEvent(EventMessage.builder().code("event_type_1").bytes(bytes).build()));
}
}
监听事件
不同的事件让不同的handler去执行
@Component
public class EventListener {
@Autowired
XXXHandler xxxHandler;
/**
* 处理事件
*
* @param event
*/
@org.springframework.context.event.EventListener
public void listenUserRegisterEvent(CustomEvent event) {
EventMessage eventMessage = (EventMessage) event.getSource();
if (eventMessage != null) {
logger.debug("收到监听事件,code = {} ,message= {}", eventMessage.getCode(), eventMessage.getMessage());
switch (eventMessage.getCode()) {
case "event_type_1":
xxxHandler.doJob(eventMessage.getBytes());
break;
}
}
}
}
执行任务
@Component
public class XXXHandler {
/**
* 服务对象
*/
@Resource
private XXXService xxxService;
/**
* 处理监听数据
*
* @param bytes
*/
public void doJob(byte[] bytes) {
logger.debug("在这里处理监听数据---开始");
//在这里处理数据
//省去转换的逻辑,这里直接把bytes假想成实体吧。
doSave(bytes);
logger.debug("在这里处理监听数据---结束");
}
/**
* 保存入库
*/
public void doSave(byte[] bytes) {
xxxService.save(bytes);
}
}