Spring事件機制的使用

(一)、事件發佈

1.啓動SpringBoot項目

@SpringBootApplication
public class SpringEventApplication {

    public static void main(String[] args) throws Exception {
        SpringApplication.run(SpringEventApplication.class, args);
        OrderPo orderPo = new OrderPo();
        orderPo.setId(1);
        orderPo.setOrderId("1234");
        orderPo.setPayOrderId("p1234");
        ApplicationContextUtil.publishEvent(new PublisEvent(orderPo));
    }
}

2.創建工具類 

@Component
class ApplicationContextUtil implements ApplicationContextAware {
    private static final Logger logger = LoggerFactory.getLogger(ApplicationContextUtil.class);
    private static ApplicationContext APPLICATION_CONTEXT;
    /**
     * 設置spring上下文
     * @param applicationContext spring上下文
     * @throws BeansException
     */
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        logger.debug("ApplicationContext registed-->{}", applicationContext);
        APPLICATION_CONTEXT = applicationContext;
    }
    public static ApplicationContext getApplicationContext() { return APPLICATION_CONTEXT;  }
    /**
     * 發佈事件,基於JVM內部的事件通知。必須運行在Spring環境中。
     * @param event
     */
    public static void publishEvent(ApplicationEvent event) throws Exception {
        if(event==null){
            logger.error("Spring發佈事件失敗,入參爲null");
            return;
        }
        try{
            getApplicationContext().publishEvent(event);
            logger.info("Spring發佈事件成功");
        }catch(Exception e){
            logger.error("Spring發佈事件失敗" + event, e);
            throw new Exception("Spring發佈事件失敗" + event);
        }
    }
}
/**
 * 當前Spring的上下文工具類,包含一些常用的工具方法,必須運行在Spring環境中
 */
public class SpringContextUtil  {

    private static final Logger logger = LoggerFactory.getLogger(SpringContextUtil.class);

    private static ApplicationContext applicationContext;

    /**必須運行在Spring環境中*/
    public static Object getBean(Class clazz){
        return ContextLoader.getCurrentWebApplicationContext().getBean(clazz);
    }

    /**必須運行在Spring環境中*/
    public static Object getBean(String beanName){
        return getApplicationContext().getBean(beanName);
    }

    public static void setApplicationContext(ApplicationContext applicationContext){
        if (SpringContextUtil.applicationContext == null){
            SpringContextUtil.applicationContext = applicationContext;
        }
    }

    public static ApplicationContext getApplicationContext(){
        return SpringContextUtil.applicationContext;
    }

    /**
     * 發佈事件,基於JVM內部的事件通知。必須運行在Spring環境中。
     * @param event
     */
    public static void publishEvent(ApplicationEvent event) throws Exception {
        if(event==null){
            logger.error("Spring發佈事件失敗,入參爲null");
            return;
        }
        try{
            getApplicationContext().publishEvent(event);
            logger.info("Spring發佈事件成功");
        }catch(Exception e){
            logger.error("Spring發佈事件失敗" + event, e);
            throw new Exception("Spring發佈事件失敗" + event);
        }
    }

}

3.創建PO 

public class OrderPo {
    private int id;
    private String orderId;
    private String payOrderId;
    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getOrderId() {
        return orderId;
    }

    public void setOrderId(String orderId) {
        this.orderId = orderId;
    }

    public String getPayOrderId() {
        return payOrderId;
    }

    public void setPayOrderId(String payOrderId) {
        this.payOrderId = payOrderId;
    }

    @Override
    public String toString() {
        return "OrderPo{" +
                "id=" + id +
                ", orderId='" + orderId + '\'' +
                ", payOrderId='" + payOrderId + '\'' +
                '}';
    }
}

4.創建發佈事件類 

public class PublisEvent extends ApplicationEvent {

	private static final long serialVersionUID = 2256159793354152460L;

	public PublisEvent(Object source) {
		super(source);
	}

}

5.創建事件接收類

@Component
public class ListenerPublisEvent implements SmartApplicationListener {
    private Logger logger = LoggerFactory.getLogger(getClass());
    @Override
    public boolean supportsEventType(Class<? extends ApplicationEvent> eventType) {
        return eventType == PublisEvent.class;
    }

    @Override
    public boolean supportsSourceType(Class<?> sourceType) {
        return sourceType == OrderPo.class;
    }
    //監聽處理對象
    @Override
    public int getOrder() {
        return 0;
    }

    @Override
    public void onApplicationEvent(ApplicationEvent applicationEvent) {
        if (applicationEvent == null || applicationEvent.getSource() == null) {
            logger.info("[推送xx消息事件]====參數爲空,取消本次處理.");
            return;
        }
        //執行業務邏輯
        System.out.println("接收推送的消息事件");
        OrderPo orderPo = (OrderPo) applicationEvent.getSource();
        System.out.println(orderPo);
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章