博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
spring event发布及监听实例
阅读量:6594 次
发布时间:2019-06-24

本文共 2644 字,大约阅读时间需要 8 分钟。

本文主要介绍下如何在spring中进行发布时间以及接收事件

定义事件

public class DemoEvent extends ApplicationEvent {    private String message;    public DemoEvent(Object source, String message) {        super(source);        this.message = message;    }    public String getMessage() {        return message;    }}

发布事件

@Autowired    private ApplicationEventPublisher applicationEventPublisher;    @GetMapping("/send-event")    public Object sendEvent(@RequestParam String msg){        DemoEvent demoEvent = new DemoEvent(this,msg);        applicationEventPublisher.publishEvent(demoEvent);        LOGGER.info("finish publish event");        return "success";    }

这里在mvc中发布,仅仅是为了演示。

接收事件(默认同步)

@Componentpublic class DemoEventListener implements ApplicationListener
{ private static final Logger LOGGER = LoggerFactory.getLogger(DemoEventListener.class); @Override public void onApplicationEvent(DemoEvent demoEvent) { LOGGER.info("receive event:{}",demoEvent.getMessage()); }}

这里是同步接收

异步处理事件

@Configurationpublic class AsyncEventConfig {    @Bean(name = "applicationEventMulticaster")    public ApplicationEventMulticaster simpleApplicationEventMulticaster() {        SimpleApplicationEventMulticaster eventMulticaster                = new SimpleApplicationEventMulticaster();        eventMulticaster.setTaskExecutor(new SimpleAsyncTaskExecutor());        return eventMulticaster;    }}

加上这个配置就ok了,不然要注意,这里自己new的task executor,要优雅关闭的话,需要自己shutdown

SimpleApplicationEventMulticaster

spring-context-4.3.11.RELEASE-sources.jar!/org/springframework/context/event/SimpleApplicationEventMulticaster.java

@Override    public void multicastEvent(ApplicationEvent event) {        multicastEvent(event, resolveDefaultEventType(event));    }    @Override    public void multicastEvent(final ApplicationEvent event, ResolvableType eventType) {        ResolvableType type = (eventType != null ? eventType : resolveDefaultEventType(event));        for (final ApplicationListener
listener : getApplicationListeners(event, type)) { Executor executor = getTaskExecutor(); if (executor != null) { executor.execute(new Runnable() { @Override public void run() { invokeListener(listener, event); } }); } else { invokeListener(listener, event); } } } private ResolvableType resolveDefaultEventType(ApplicationEvent event) { return ResolvableType.forInstance(event); }

可以看到,使用applicationEventMulticaster的时候,如果有线程池,则用线程池异步执行;否则则知直接调用listener的执行方法同步执行。

doc

转载地址:http://eqcio.baihongyu.com/

你可能感兴趣的文章
线程池以及四种常见线程池
查看>>
网络编程-第一节
查看>>
基于JAVA的银行卡实名认证接口调用代码实例
查看>>
Centos下安装并设置nginx开机自启动
查看>>
bzoj3195: [Jxoi2012]奇怪的道路
查看>>
C# 使用 CancellationTokenSource 终止线程
查看>>
idea创建springboot工程
查看>>
Web中间件漏洞
查看>>
简单轮播图
查看>>
微信公众号页面无法唤起输入框
查看>>
day 32并行 并发
查看>>
Mac上安装stf
查看>>
介绍几个移动web app开发框架
查看>>
十六进制转十进制(蓝桥杯)
查看>>
搭建Easyui环境在Myeclipse或Eclipse中
查看>>
bin log、redo log、undo log和MVVC
查看>>
ubuntu 重启网络方法--通过杀死进程重启网络
查看>>
深度优先搜索(DFS)(Java)
查看>>
Java --Serializable序列化
查看>>
He angrily answer MBT Tunisha
查看>>