设计思路
定义事件类:首先,我们需要定义一个事件类,该类将传递必要的参数(例如,null, “API”, Trade.getId())。
异步事件监听器:使用 Spring 的 @Async 注解将监听器设置为异步运行,从而实现异步执行的需求。
事件发布:在调用 init.tradeComparison() 方法之前,发布一个事件,事件会被异步监听器接收并执行。
定义事件类,必须继承ApplicationEvent 类:
java">
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 中获取执行业务所需的数据:
java">
@Component
OrderEventListener implements ApplicationListener<OrderEvent> {@Autowiredprivate InitOut init;@Async@Overridepublic 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传入的参数选择合适的类去执行:
java">
@Component
public class OrderPublisher {@Autowiredpublic ApplicationEventPublisher eventPublisher;public void OrderEvent( String type, String id,String flag) {// 创建事件OrderEvent event = new OrderEvent( this, type, id,flag);// 发布事件eventPublisher.publishEvent(event);}
}
其他地方调用,直接依赖注入后调用即可:
java">@AutowiredTradeComparisonOrderPublisher publisher;public void do(){publisher.OrderEvent(null, String.valueOf(trade.Id()),"API");}