事件机制在java的设计模式中也可以叫监听器模式或者是观察者模式。当有事件发生时,向关注这个事件的对象发送消息,告诉它有一个事件发生了,那么怎么知道通知谁呢? 那必须要在对这个事件感兴趣的对象中定义这个事件,一旦有事件发生了,对事件有兴趣的对象就知道了。在springboot中使用异步事件监听,需要在应用启动类上加入注解@EnableAsync,如下:
@EnableAutoConfiguration
@ComponentScan(basePackages = "cn.lovecto.promotion")
@EnableAsync//支持异步
public class Application {
public static void main(String[] args) {
//放到自定义的res目录下的方式
PropertyConfigurator.configure(System.getProperty("logging.config", "res/log4j.properties"));
SpringApplication.run(Application.class, args);
}
}
在application.properties中配置异步线程池的相关参数:
##异步任务线程池大小
spring.asyn.core.size=2
spring.asyn.max.size=20
spring.asyn.queue.size=128
线程池执行器配置类:
@Configuration
public class ApplicationConfig {
/***
* 创建异步任务执行器
*
* @return
*/
@Bean("taskExecutor")
public TaskExecutor getAsyncExecutor(Environment env) {
ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
taskExecutor.setMaxPoolSize(Integer.valueOf(env.getProperty("spring.asyn.max.size")));
taskExecutor.setCorePoolSize(Integer.valueOf(env.getProperty("spring.asyn.core.size")));
taskExecutor.setQueueCapacity(Integer.valueOf(env.getProperty("spring.asyn.queue.size")));
taskExecutor.initialize();
return taskExecutor;
}
}
自定义应用事件PromotionProductBatchOperateEvent机场自ApplicationEvent:
package cn.lovecto.promotion.event;
import org.springframework.context.ApplicationEvent;
import cn.lovecto.promotion.param.PromotionProductBatchParam;
/**
* 促销产品批量操作事件,主要针对批量添加和批量删除
*
*/
public class PromotionProductBatchOperateEvent extends ApplicationEvent{
private static final long serialVersionUID = 1L;
public PromotionProductBatchOperateEvent(PromotionProductBatchParam source) {
super(source);
}
}
自定义事件监听器PromotionProductBatchOperateListener实现ApplicationListener接口,在onApplicationEvent方法上加上@Async注解实现异步处理:
package cn.lovecto.promotion.listener;
import org.springframework.context.ApplicationListener;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;
import cn.lovecto.promotion.event.PromotionProductBatchOperateEvent;
import cn.lovecto.promotion.param.PromotionProductBatchParam;
/**
* 促销产品批量添加或删除事件处理监听器
*
*
*/
@Component
public class PromotionProductBatchOperateListener implements
ApplicationListener<PromotionProductBatchOperateEvent> {
@Override
@Async//异步
public void onApplicationEvent(PromotionProductBatchOperateEvent event) {
if (!(event instanceof PromotionProductBatchOperateEvent)) {
return;
}
PromotionProductBatchParam param = (PromotionProductBatchParam) event
.getSource();
// 添加
if (PromotionProductBatchParam.Operate.ADD.equals(param.getOperate())) {
} else if (PromotionProductBatchParam.Operate.DEL.equals(param
.getOperate())) {// 删除
} else {// 其他不确定操作
}
}
}
发布事件非常简单:
//注入应用上下文
@Autowired
private ApplicationContext applicationContext;
//发送异步事件,由异步线程处理
applicationContext.publishEvent(new PromotionProductBatchOperateEvent(param));
是不是感觉很简单的!!!