版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
(一)、事件发布
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);
}
}