ApplicationEvent事件处理

作者: supremecsp | 来源:发表于2021-01-08 22:38 被阅读0次

    ApplicationEvent用监听对象的创建并处理接下来的业务逻辑,是观察者模式的应用
    接下来简单演示下其用法及进阶用法,首先ApplicationEvent本身是同步的

    public class DemoEvent extends ApplicationEvent {
        
        private String msg;
    
        public DemoEvent(Object source,String msg) {
            super(source);
            this.msg = msg;
        }
    
        public String getMsg() {
            return msg;
        }
    
        public void setMsg(String msg) {
            this.msg = msg;
        }
    }
    
    @Component
    public class DemoPublisher {
    
        @Autowired
        ApplicationEventPublisher publisher;
    
        public void publish(String msg){
            publisher.publishEvent(new DemoEvent(this,msg));
        }
    }
    
    @Component
    public class DemoListener{
        
        @EventListener(DemoEvent.class)
        public void taskHandler(DemoEvent demoEvent) {
            String msg = demoEvent.getMsg();
            .....//消息处理
        }
    }
    
    @RestController
    @Slf4j
    public class controller {
    
       @Autowired
       DemoPublisher demoPublisher;
    
        @GetMapping("test")
        public void GetUser(){
            demoPublisher.publish("hello application event");
        }
    }
    

    其中Listener可以有多个,自定义顺序可以使用@Order注解
    如果想实现异步发送消息的功能就得加上@Async注解了

    @Component
    @EnableAsync
    public class DemoListener{
        
        @EventListener(DemoEvent.class)
        @Async
        public void taskHandler(DemoEvent demoEvent) {
            String msg = demoEvent.getMsg();
            .....//消息处理
        }
    }
    

    Spring还提供了一个关于事务的处理
    其中phase 有四个值可以选
    AFTER_COMMIT,BEFORE_COMMIT,AFTER_ROLLBACK,AFTER_COMPLETION
    @TransactionalEventListener(phase = TransactionPhase.AFTER_COMMIT)
    还有一个fallbackExecution属性代表没有事务的时候是否应该执行,默认为false,即是必须是有事务的时候才会执行
    因此@TransactionalEventListener注解需要配合事务一起使用

    @GetMapping("test")
    @Transactional
    public void GetUser(){
        demoPublisher.publish("hello application event");
    }
    
    @Component
    public class DemoListener{
        @TransactionalEventListener(classes = DemoEvent.class, phase = TransactionPhase.AFTER_COMMIT)
        public void taskHandler(DemoEvent demoEvent) {
            String msg = demoEvent.getMsg();
            .....//消息处理
        }
    }
    

    注:@TransactionalEventListener没必要和@Async一同使用,因为事务操作完毕意味着方法执行结束了,配合使用时异步功能是开启不了的

    相关文章

      网友评论

        本文标题:ApplicationEvent事件处理

        本文链接:https://www.haomeiwen.com/subject/yukqaktx.html