新网创想网站建设,新征程启航
为企业提供网站建设、域名注册、服务器等服务
这篇文章给大家分享的是有关SpringBoot如何发布ApplicationEventPublisher和监听ApplicationEvent事件的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。
创新互联服务项目包括新邱网站建设、新邱网站制作、新邱网页制作以及新邱网络营销策划等。多年来,我们专注于互联网行业,利用自身积累的技术优势、行业经验、深度合作伙伴关系等,向广大中小型企业、政府机构等提供互联网行业的解决方案,新邱网站推广取得了明显的社会效益与经济效益。目前,我们服务的客户以成都为中心已经辐射到新邱省份的部分城市,未来相信会继续扩大服务区域并继续获得客户的支持与信任!
实现方法
自定义需要发布的事件类,需要继承ApplicationEvent类或PayloadApplicationEvent
使用@EventListener来监听事件
使用ApplicationEventPublisher来发布自定义事件(@Autowired注入即可)
/** * 自定义保存事件 * @author peter * 2019/1/27 14:59 */ public class PersonSaveEvent extends ApplicationEvent { private DATA data; public PersonSaveEvent(DATA source) { super(source); this.data = source; } public DATA getData() { return data; } } //发布事件 public void savePerson(Person person){ personDao.save(person); publisher.publishEvent(new PersonSaveEvent<>(1)); } //监听事件 @EventListener public void listenEvent(PersonSaveEventevent) { System.out.println("监听到PersonSaveEvent事件; 接收到的值:" + event.getData() + ";发布的时间为" + Instant.ofEpochMilli(event.getTimestamp())); }
好处
可以使核心业务与子业务进行解耦,也方便后期的业务的扩展。如新用户注册之后,需要发放优惠券,此时可以在保存用户之后,发布一个新用户的注册成功事件,通过监听该事件来实现发放优惠券的功能。后期新增一个对新用户进行xxx功能,此时可以新写一个监听注册成功事件的监听器,来处理新的业务逻辑,而不需要修改之前的注册逻辑。
注意事项
1、监听器方法中一定要try-catch异常,否则会造成发布事件(有事物的)的方法进行回滚
2、可以使用@Order注解来控制多个监听器的执行顺序,@Order传入的值越小,执行顺序越高
3、对于需要进行事物监听或不想try-catch runtime异常,可以使用@TransactionalEventListener注解
@TransactionalEventListener 监听器
在该注解的源码中:
*If the event is not published within the boundaries of a managed transaction, the * event is discarded unless the {@link #fallbackExecution} flag is explicitly set. If a * transaction is running, the event is processed according to its {@code TransactionPhase}.
大意是:如果事件的发布不是在事物(@Transactional)范围内,则监听不到该事件,除非将fallbackExecution标志设置为true(@TransactionalEventListener(fallbackExecution = true));如果在事物中,可以选择在事物的哪个阶段来监听事件,默认在事物提交后监听。
修改监听事物的范围:@TransactionalEventListener(phase = TransactionPhase.AFTER_COMPLETION)
在监听器中重新开一个事物
@TransactionalEventListener(phase = TransactionPhase.AFTER_COMPLETION) public void listenEvent1(PersonSaveEventevent) { divide(event); } @Transactional(propagation = Propagation.REQUIRES_NEW) public void divide(PersonSaveEvent event) { System.out.println("监听到PersonSaveEvent事件; 接收到的值:" + event.getData() + ";接受的时间为" + Instant.ofEpochMilli(event.getTimestamp())); }
以上事件都是同步,如果需要异步则需要开启异步支持,在监听器方法加上@Async 注解即可。
/** * @author peter * @version 1.0 * @date 2019/04/18 08:47 */ @Configuration @EnableAsync public class AsyncEventConfiguration implements AsyncConfigurer { @Override public Executor getAsyncExecutor() { return Executors.newCachedThreadPool(); } }
一旦开始异步执行,方法的异常将不会抛出,只能在方法内部处理。
感谢各位的阅读!关于“SpringBoot如何发布ApplicationEventPublisher和监听ApplicationEvent事件”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!