发布ApplicationEventPublisher和监听ApplicationEvent事件的简单配置(注解实现)

1.功能介绍

通过事件的发布和监听联动,可以使核心业务与子业务进行解耦,也方便后期的业务的扩展。如新用户注册之后,需要发放优惠券,此时可以在保存用户之后,发布一个新用户的注册成功事件,通过监听该事件来实现发放优惠券的功能。后期新增一个对新用户进行xxx功能,此时可以新写一个监听注册成功事件的监听器,来处理新的业务逻辑,而不需要修改之前的注册逻辑。

2.主要依赖

 <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.3.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

 <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
  <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>

3.代码实现

事件类

@Data
@AllArgsConstructor
public class ReadNoteEvent {
    private List<Long> noteIds;
    private String userId;
}

@Data
@AllArgsConstructor
public class SaveUserEvent{
    private List<Long> noteIds;
    private String userId;

}

监听器
@TransactionalEventListener(phase = TransactionPhase.AFTER_COMMIT) 事务提交后再触发

@Component
@AllArgsConstructor
public class ReadNoteListener {

    private final SysUserService sysUserService;

    @EventListener
    @Async
    public void readNoteListener(ReadNoteEvent event){
        System.out.println("1===="+sysUserService);
        System.out.println("1===="+event);
    }

    @TransactionalEventListener(phase = TransactionPhase.AFTER_COMMIT)
    public void saveNoteListener(SaveUserEvent event){
        System.out.println("2===="+sysUserService);
        System.out.println("2===="+event);
    }
}

@Component
@AllArgsConstructor
public class SaveUserListener {

    private final SysUserService sysUserService;

    @Async
    @TransactionalEventListener(phase = TransactionPhase.AFTER_COMMIT)
    public void saveUserListener(SaveUserEvent saveUserEvent) {
        System.out.println("3===="+sysUserService);
        System.out.println("3===="+saveUserEvent);
    }
}

测试接口
@Transactional(rollbackFor = Exception.class) 不能缺少,不然@TransactionalEventListener无法触发

 @Autowired
    private ApplicationEventPublisher applicationContext;

 @Transactional(rollbackFor = Exception.class)
    @ApiOperation("订阅事件测试")
    @GetMapping(value = "/event")
    public ResultJson event(){

        List<Long> ids=new ArrayList<>();
        ids.add(1L);
        ids.add(2L);
        ids.add(3L);
        applicationContext.publishEvent(new ReadNoteEvent(ids,"11111111111"));

        SysUser user=new SysUser();
        user.setId(777L);
        user.setName("11114122");
        user.setAccount("3332333333333233");
        user.setPassword("44444");
        user.setStatus(0);
        user.setAvatar("222222222222222");
        userService.save(user);
        applicationContext.publishEvent(new SaveUserEvent(ids,"11111111111"));
        return ResultJson.ok();
    }

异步支持
@Async 需要配置异步支持

@Configuration
@EnableAsync
public class AsyncConfig {

    @Bean
    public ThreadPoolTaskExecutor taskExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        // 设置核心线程数,它是可以同时被执行的线程数量
        executor.setCorePoolSize(5);
        // 设置最大线程数,缓冲队列满了之后会申请超过核心线程数的线程
        executor.setMaxPoolSize(10);
        // 设置缓冲队列容量,
        executor.setQueueCapacity(20);
        // 设置线程生存时间(秒),当超过了核心线程出之外的线程在生存时间到达之后会被销毁
        executor.setKeepAliveSeconds(60);
        // 设置线程名称前缀
        executor.setThreadNamePrefix("threadpool-");
        // 设置拒绝策略
        executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
        // 等待所有任务结束后再关闭线程池
        executor.setWaitForTasksToCompleteOnShutdown(true);
        //初始化
        executor.initialize();
        return executor;
    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值