Spring中的事件监听机制,事件驱动开发
可以用在以下这些场景:
1.业务代码入口在 下一级模块module, sender消息发送者在上一级模块module,不想循环依赖,就这样用
2.解耦合的事件驱动模式,观察者模式等
3.待补充
实例代码:
1. 业务代码testAAA,执行同步业务
private void testAAA(List<ChannelInventory> channelInventories){ try { List<SyncStockVO> syncRecords = new ArrayList<>(); for (ChannelInventory channelInventory : channelInventories) { SyncStockVO syncStockVO = new SyncStockVO(); syncStockVO.setId(channelInventory.getId()); syncStockVO.setSkuId(channelInventory.getSkuId()); ...... syncRecords.add(syncStockVO); } omsStockSyncHelper.sendStockStatusChangeMsg(syncRecords); log.error("同步 完成,request:{}", JSON.toJSONString(syncRecords)); } catch (Exception e) { String errMsg = "同步 异常"; log.error(errMsg, e); retrySyncStock(channelInventories); } }
2.事件发布助手 OmsStockSyncHelper
import org.springframework.context.ApplicationEventPublisher; import org.springframework.stereotype.Component; import javax.annotation.Resource; import java.util.List; @Component public class OmsStockSyncHelper { @Resource private ApplicationEventPublisher publisher; public void sendStockStatusChangeMsg(List<SyncStockVO> vos){ publisher.publishEvent(new OmsStockSyncEvent(vos)); } }
3.事件体,必须是ApplicationEvent的子类
import org.springframework.context.ApplicationEvent; import java.util.List; public class OmsStockSyncEvent extends ApplicationEvent { private static final long serialVersionUID = -2926756513711326075L; private List<SyncStockVO> vos; /** * 时间戳 */ private Long time; public List<SyncStockVO> getVos() { return vos; } public void setVos(List<SyncStockVO> vos) { this.vos = vos; } public Long getTime() { return time; } public void setTime(Long time) { this.time = time; } public OmsStockSyncEvent(List<SyncStockVO> volist) { super("OmsStockSyncEvent"); vos = volist; time = System.currentTimeMillis(); } }
4.事件捕获者,必定是实现了ApplicationListener的类
import lombok.extern.slf4j.Slf4j; import org.springframework.context.ApplicationListener; import org.springframework.stereotype.Service; import javax.annotation.Resource; @Slf4j @Service public class OmsStockSyncHandler implements ApplicationListener<OmsStockSyncEvent> { @Resource private OmsStockMsgSender sender; //事件捕获之后,你怎么处理,就按自己的业务处理咯,这里示例是发送MQ,所以写了一个sender @Override public void onApplicationEvent(OmsStockSyncEvent event) { sender.send(event); } }