ApplicationEventPublisher 事件发布器

一、介绍
功能就是发布事件,也就是把某个事件告诉的所有与这个事件相关的监听器。
1、使用ApplicationEventPublisher 可以进行事件发布
2.ApplicationListener
  ApplicationListener接口是由 Spring 提供的事件订阅者必须实现的接口,我们一般把该 Service 关心的事件类型作为泛型传入

二、示例demo
1.定义事件

// 用户事件
@Getter
@AllArgsConstructor
public class UserEvent {
    private String username;
}

// 短信事件
@Getter
@AllArgsConstructor
public class SmsEvent {
    private String phone;
}

2.注册完成后发送短信 以及注册的事件


@Autowired
    private ApplicationEventPublisher publisher;
    @GetMapping("/zc")
    public String zc() {
        log.info("注册完成");
        publisher.publishEvent(new UserEvent("zhangsan"));
        publisher.publishEvent(new SmsEvent("1560000"));
        log.info("succs");
        return "succs";
    }

3、监听


@Component
@Slf4j
public class EventHandleListener {

    @Async
    @EventListener(UserEvent.class)
    public void zc(UserEvent userEvent){

        log.info( Thread.currentThread().getName()+ " 注册监听到:{}", JSONUtil.toJsonStr(userEvent));

    }

    @EventListener(SmsEvent.class)
    public void sms(SmsEvent smsEvent){
        log.info( Thread.currentThread().getName()+ " sms监听到:{}", JSONUtil.toJsonStr(smsEvent));
    }
}

如果有需要可以配置优先级
 @Order(Ordered.LOWEST_PRECEDENCE-1)
    @EventListener(MessageOwnerEvent.class)
    public void removeImportError(MessageOwnerEvent messageEvent)

4、开启异步

@EnableAsync
public class DemoApplication

 @Async
    @EventListener(UserEvent.class)
    public void zc(UserEvent userEvent)

配置异步线程池

@Configuration
@EnableAsync
public class AsyncEventConfiguration implements AsyncConfigurer {
    @Override
    public Executor getAsyncExecutor() {
        return Executors.newFixedThreadPool(10);
    }
}

测试

注册完成
http-nio-7000-exec-2 sms监听到:{"phone":"1560000"}
task-1 注册监听到:{"username":"zhangsan"}
succs

-- 异步实现了

5、事务处理
Spring事务监听机制—使用@TransactionalEventListener处理数据库事务提交成功后再执行操作
在项目中,往往需要执行数据库操作后,发送消息或事件来异步调用其他组件执行相应的操作,例如:
  用户注册后发送激活码等。
  但是,数据库的操作如果还未完成,此时异步调用的方法查询数据库发现没有数据,这就会出现问题。

为了解决上述问题,Spring为我们提供了两种方式:
  (1) @TransactionalEventListener注解

只有当前事务提交之后,才会执行事件监听器的方法。其中参数phase默认为AFTER_COMMIT

@TransactionalEventListener(phase = TransactionPhase.AFTER_COMMIT)
    @EventListener(SmsEvent.class)
    public void sms(SmsEvent smsEvent){
        log.info( Thread.currentThread().getName()+ " sms监听到:{}", JSONUtil.toJsonStr(smsEvent));
    }

参考:https://blog.csdn.net/u012843873/article/details/113364753
本地代码 learnCode

posted @ 2022-09-29 14:55  爱生活(^_-)  阅读(225)  评论(0)    收藏  举报