自定义Spring容器防止重复执行的两种实现方式
一 背景ContextRefreshedEvent 事件会在Spring容器初始化完成会触发该事件。我们在实际工作也可以能会监听该事件去做一些事情,但是有时候使用不当也会带来一些问题。1 防止重复触发主要因为对于web应用会出现父子容器,这样就会触发两次,那么如何避免呢?下面给出一种简单的解决方案。二 解决方案方案一@Componentpublic class TestTask implement
·
一 背景
ContextRefreshedEvent 事件会在Spring容器初始化完成会触发该事件。我们在实际工作也可以能会监听该事件去做一些事情,但是有时候使用不当也会带来一些问题。
1 防止重复触发
主要因为对于web应用会出现父子容器,这样就会触发两次,那么如何避免呢?下面给出一种简单的解决方案。
二 解决方案
方案一
@Component
public class TestTask implements ApplicationListener<ContextRefreshedEvent> {
private volatile AtomicBoolean isInit=new AtomicBoolean(false);
@Override
public void onApplicationEvent(ContextRefreshedEvent event) {
//防止重复触发
if(!isInit.compareAndSet(false,true)) {
return;
}
start();
}
private void start() {
//开启任务
System.out.println("****-------------------init---------------******");
}
}
方案二
@Slf4j
public class ApacheDubboServiceBeanPostProcessor implements ApplicationListener<ContextRefreshedEvent> {
@Override
public void onApplicationEvent(final ContextRefreshedEvent contextRefreshedEvent) {
if (Objects.nonNull(contextRefreshedEvent.getApplicationContext().getParent())) {
return;
}
// Fix bug(https://github.com/dromara/soul/issues/415), upload dubbo metadata on ContextRefreshedEvent
Map<String, ServiceBean> serviceBean = contextRefreshedEvent.getApplicationContext().getBeansOfType(ServiceBean.class);
for (Map.Entry<String, ServiceBean> entry : serviceBean.entrySet()) {
executorService.execute(() -> handler(entry.getValue()));
}
}
}
更多推荐
已为社区贡献48条内容
所有评论(0)