打个比方,当我们和其他公司进行业务接口对接时,我们这边需要保存或者修改某些数据,但是保存和修改这些数据对整个流程没有太大的影响,这个时候我们应该怎么做呢?是的,我们要考虑异步去保存或者修改数据,但怎么去异步保存数据呢?这个时候我们就可以使用事件广播来做这个操作
看过spring源码的大神都知道,当我们初始化容器的过程中,我们会有initApplicationEventMulticaster()--->此方法在org.springframework.context.support.AbstractApplicationContext.refresh()中,默认情况使用的事件广播是SimpleApplicationEventMulticaster这个类,这个类中有Executor接口,感觉是不是很熟悉?提示一下,线程池。如果还不熟悉的请自行百度,我们需要手动去设置这个线程池,该怎么配置呢?请看
<!--异步事件处理
在AbstractApplicationContext 初始化应用事件传播时,会从beanFactory中获取是否存在广播器,
如果不存在则用SimpleApplicationEventMulticaster
如果想自定义此广播器,则id='applicationEventMulticaster'-->
<bean id="applicationEventMulticaster" class="org.springframework.context.event.SimpleApplicationEventMulticaster">
<property name="taskExecutor" ref="coreTaskExecutor"/>
</bean>
<bean id="coreTaskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
<property name="corePoolSize" value="10"/>
<property name="maxPoolSize" value="20"/>
<property name="queueCapacity" value="25"/>
<property name="threadNamePrefix" value="coreTaskExecutor"/>
</bean>
在applicationContext.xml中配置,如果使用的springboot,可以使用
@ImportResource("classpath:applicationContext.xml")
来导入xml文件
配置好了之后,我们可以定义我们自己的事件和监听器了
创建事件类,需要继承ApplicationEvent
public class TestEvent extends ApplicationEvent {
public TestEvent(Object source) {
super(source);
}
}
Object对象就是我们需要传递的参数
接着,定义我们的监听,需要实现ApplicationListener这个接口
public class TestListener implements ApplicationListener {
@Override
public void onApplicationEvent(ApplicationEvent event) {
if(!(event instanceof TestEvent)){
return;
}
event.getSource();//获取传递的参数,即:和TestEvent中的source一样的
//再次处理业务逻辑 TODO
}
}
我们主要是在监听器中处理业务逻辑
是不是想到了个问题,参数怎么传递过来的呢?别着急,我们慢慢来
参数当然是从我们正常处理业务逻辑代码中传递过来的了,监听器中的代码只是处理分支的情况,正常情况,我们一般都是在service的实现类中进行事件广播并传递参数,此类必须实现ApplicationContextAware这个接口
public class TestServiceImpl implements ApplicationContextAware{
ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
}
public void test(){
String datas = "";//传递参数也可以是map、list、实体对象等
applicationContext.publishEvent(new TestEvent(datas));
}
}
那么在监听器中就可以接收到datas数据了,然后就可以愉快的进行代码编写了
努力成就非凡,请不要在最该奋斗的年纪选择安逸