架构&系统设计设计模式Spring Cloud微服务框架及相关实践

ApplicationEvent事件处理

2021-01-08  本文已影响0人  supremecsp

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一同使用,因为事务操作完毕意味着方法执行结束了,配合使用时异步功能是开启不了的

上一篇下一篇

猜你喜欢

热点阅读