订单入库后异步推送

 注意:异步推送,并不会等到当前方法执行完后再执行,而是在当前线程外再开启一个线程,并行执行,所以在项目中如果有配置主从,

或者异步执行的方法查询数据库的信息的语句更新在推送异步之后,要进行适当的线程休眠,等待主线程执行完毕、等待主线程的数据库事务提交、等待主从数据库之间的数据延迟!

    @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);
          }
    }
}
posted @ 2019-08-29 17:14  huanghaunghui  阅读(530)  评论(0编辑  收藏  举报