热爱技术,追求卓越
不断求索,精益求精

springboot或spring观察者模式使用ApplicationEvent实现异步事件监听

事件机制在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));

是不是感觉很简单的!!!

赞(3)
未经允许不得转载:LoveCTO » springboot或spring观察者模式使用ApplicationEvent实现异步事件监听

热爱技术 追求卓越 精益求精