使用Spring事件机制实现异步的方法
当把一个事件发布到Spring提供的ApplicationContext中,被监听器侦测到,就会执行对应的处理方法。
事件本身
事件是一个自定义的类,需要继承Spring提供的ApplicationEvent
。
@Data public class MyEvent extends ApplicationEvent { private String msg; public MyEvent(Object source, String msg) { super(source); this.msg = msg; } }
事件监听
基本方法是实现ApplicationListener
接口,自定义一个监听器,实现onApplicationEvent()
方法,然后添加到ApplicationContext
。
比如:
public class MyListener implements ApplicationListener<MyEvent> { @Override public void onApplicationEvent(MyEvent event) { System.out.print("监听到MyEvent事件"); } } ... // SpringBoot的启动类中添加监听器 public static void main(String[] args) { SpringApplication application = new SpringApplication(MyApplication.class); application.addListeners(new MyListener()); application.run(args); }
也可以使用注解@EventListener
(推荐):原理就是通过扫描这个注解,创建监听器并添加到ApplicationContext
。
@Component @Slf4j public class MyEventHandler { @EventListener public void handleEvent(MyEvent event) { log.info("------------处理事件:{}", event.getMsg()); try { Thread.sleep(5 * 1000L); log.info("事件1(5s)处理完成"); } catch (InterruptedException e) { e.printStackTrace(); } } }
事件发布
可以通过上下文对象的发布方法ConfigurableApplicationContext::publishEvent()
来发布。
也可以实现ApplicationEventPublisherAware
接口来发布(推荐)。
@Component @Slf4j public class EventService implements ApplicationEventPublisherAware { public ApplicationEventPublisher publisher; @Override public void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) { this.publisher = applicationEventPublisher; } public String doEventWork(String msg) { log.info("------------publish event:" + msg); MyEvent event = new MyEvent(this, msg); publisher.publishEvent(event); return "OK"; } }
测试代码
@SpringBootTest @RunWith(SpringRunner.class) public class EventServiceTest { @Autowired private EventService service; @Test public void eventTest() { String msg="Java Code"; service.doEventWork(msg); } }
注意
如果2个事件之间是继承关系,会先监听到子类事件,处理完再监听父类。
// MyEvent2 extends MyEvent @Component @Slf4j public class MyEventHandler { @EventListener public void handleEvent(MyEvent event) { log.info("------------处理事件:{}", event.getMsg()); try { Thread.sleep(5 * 1000L); log.info("事件1(5s)处理完成"); } catch (InterruptedException e) { e.printStackTrace(); } } @EventListener public void handleEvent2(MyEvent2 event) { log.info("------------处理事件2:{}", event.getMsg()); try { Thread.sleep(10 * 1000L); log.info("事件2(10s)处理完成"); } catch (InterruptedException e) { e.printStackTrace(); } } }
当我publish一个子类事件MyEvent2时,日志如下:
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
相关文章
SpringBoot整合RabbitMQ及生产全场景高级特性实战
本文主要介绍了SpringBoot整合RabbitMQ及生产全场景高级特性实战,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下2021-10-10Java实现读取项目中文件(.json或.properties)的方法详解
这篇文章主要为大家详细介绍了Java实现读取项目中文件的方法,例如.json或.properties,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一下2023-04-04启动Tomcat报错Unsupported major.minor version xxx的解决方法
这篇文章主要为大家详细介绍了启动Tomcat报错Unsupported major.minor version xxx的解决方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下2017-11-11SpringBoot整合EasyExcel实现Excel表格导出功能
这篇文章主要介绍了SpringBoot整合EasyExcel实现Excel表格导出功能,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的朋友可以参考一下2022-07-07
最新评论