发布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;
    }
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在Spring Boot中,你可以通过使用Spring的事件机制来实现监听事件。下面是一些步骤来实现它: 1. 创建一个事件类:首先,你需要创建一个表示事件的类。这个类可以是任何POJO,但最好继承`ApplicationEvent`类。 ```java public class CustomEvent extends ApplicationEvent { public CustomEvent(Object source) { super(source); } // 自定义事件的其他属性和方法 } ``` 2. 创建一个事件监听器:接下来,你需要创建一个监听器来处理该事件监听器可以是任何POJO,但需要实现`ApplicationListener`接口,并指定要监听事件类型。 ```java @Component public class CustomEventListener implements ApplicationListener<CustomEvent> { @Override public void onApplicationEvent(CustomEvent event) { // 处理事件逻辑 } } ``` 3. 发布事件:当某个条件满足时,你可以通过使用`ApplicationEventPublisher`接口的`publishEvent()`方法来发布事件。 ```java @Service public class EventPublisherService { private final ApplicationEventPublisher eventPublisher; public EventPublisherService(ApplicationEventPublisher eventPublisher) { this.eventPublisher = eventPublisher; } public void someMethod() { // 执行一些逻辑 CustomEvent customEvent = new CustomEvent(this); eventPublisher.publishEvent(customEvent); } } ``` 在上面的示例中,我们在`someMethod()`方法中发布了自定义事件`CustomEvent`。 这样,当事件发布时,监听器`CustomEventListener`会被调用,并执行监听事件的逻辑。 这就是使用Spring Boot实现监听事件的基本步骤。你可以根据具体需求,扩展和定制事件监听器的逻辑。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值