使用 Spring 的 事件发布和监听机制,结合异步执行 的功能达到方法异步执行
设计思路
定义事件类:首先,我们需要定义一个事件类,该类将传递必要的参数(例如,null, “API”, Trade.getId())。
异步事件监听器:使用 Spring 的 @Async 注解将监听器设置为异步运行,从而实现异步执行的需求。
事件发布:在调用 init.tradeComparison() 方法之前,发布一个事件,事件会被异步监听器接收并执行。
定义事件类,必须继承ApplicationEvent 类:
public class OrderEvent extends ApplicationEvent {
private final String source;
private final String type;
private final String Id;
private final String Flag;
public OrderEvent(Object source, String type, String Id,String Flag) {
super(source);
this.source = type;
this.type = type;
this.Id = Id;
this.Flag = Flag;
}
public String getFlag() {
return Flag;
}
public String getSource() {
return source;
}
public String getType() {
return type;
}
public String getId() {
return Id;
}
}
异步事件监听器,有两种实现方法,这里只展示其中一种,必须实现ApplicationListener的onApplicationEvent方法,在这里处理业务逻辑,从event 中获取执行业务所需的数据:
@Component
OrderEventListener implements ApplicationListener<OrderEvent> {
@Autowired
private InitOut init;
@Async
@Override
public void onApplicationEvent(OrderEvent event) {
// 这里执行异步操作
logger.debug("异步执行 tradeComparisonOrder 方法...");
// 获取事件中的数据
String type = event.getType();
String id = event.gettId();
String flag = event.getFlag();
// 调用实际的业务逻辑方法
init.tradeComparison(flag,id);
logger.debug("异步执行结束...");
}
}
事件发布类,类名和方法名其实是随意的,主要是调用eventPublisher的publishEvent方法发布事件,当监听器监听到事件发布了,就会去执行,当有多个监听器时,会根据publishEvent传入的参数选择合适的类去执行:
@Component
public class OrderPublisher {
@Autowired
public ApplicationEventPublisher eventPublisher;
public void OrderEvent( String type, String id,String flag) {
// 创建事件
OrderEvent event = new OrderEvent( this, type, id,flag);
// 发布事件
eventPublisher.publishEvent(event);
}
}
其他地方调用,直接依赖注入后调用即可:
@Autowired
TradeComparisonOrderPublisher publisher;
public void do(){
publisher.OrderEvent(null, String.valueOf(trade.Id()),"API");
}