注意:异步推送,并不会等到当前方法执行完后再执行,而是在当前线程外再开启一个线程,并行执行,所以在项目中如果有配置主从,
或者异步执行的方法查询数据库的信息的语句更新在推送异步之后,要进行适当的线程休眠,等待主线程执行完毕、等待主线程的数据库事务提交、等待主从数据库之间的数据延迟!
@Autowired//注入ConfigurableApplicationContext private ConfigurableApplicationContext context; private void push(Order order){ insertOrder(order); //消息通知新增订单 context.publishEvent(new OrderInsertEvent(order)); }
/** * 订单插入事件 */ public class OrderInsertEvent extends ApplicationEvent { public OrderInsertEvent(Order order) { super(order); } }
@Log4j2 @Component public class OrderInsertListener { @Autowired @Lazy private OrderNoticeService orderNoticeService; @EventListener public void onApplicationEvent(OrderInsertEvent event) { Order order = (OrderBasicRequestEntity) event.getSource(); //消息推送订单入库通知 orderNoticeService.notice(order); } }
public interface OrderNoticeService { void notice(Order order); }
@Service @Log4j2 public class OrderNoticeServiceImpl implements OrderNoticeService { @Async//开启异步 @Override public void notice(Order order) { log.info("通知其他服务 :" + order.getId()); try { //执行通知代码,try住异常,不让异常影响其他通知执行 } catch (Exception e) { log.error("质控部分添加出错:", e); } } }