在单体项目中,使用RabbitMQ等不利于项目的实现落地,但是仍然想完成业务逻辑的异步,可以使用Spring内置的Event事件来完成。
- 首先我们先创建多线程的配置
@Configuration
@EnableAsync
public class SpringAsyncConfig implements AsyncConfigurer {
private static final int MAX_POOL_SIZE = 100;
private static final int CORE_POOL_SIZE = 75;
private static final int QUEUE_CAPACITY = 75;
@Override
public Executor getAsyncExecutor() {
ThreadPoolTaskExecutor threadPoolTaskExecutor = new ThreadPoolTaskExecutor();
threadPoolTaskExecutor.setMaxPoolSize(MAX_POOL_SIZE);
threadPoolTaskExecutor.setCorePoolSize(CORE_POOL_SIZE);
threadPoolTaskExecutor.setQueueCapacity(QUEUE_CAPACITY);
threadPoolTaskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
threadPoolTaskExecutor.setTaskDecorator(new MDCTaskDecorator());
threadPoolTaskExecutor.initialize();
return threadPoolTaskExecutor;
}
}
-
Event类
@Getter @Setter @ToString public class GetAll extends ApplicationEvent(){ private Integer xxx1; pivate String xxx2; public GetAll(Object source, Integer xxx1, String xxx2) { super(source); this.xxx1 = xxx1; this.xxx2 = xxx2; } }
-
在具体的业务后面发布event事件
private final ApplicationEventPublisher applicationEventPublisher; function{ ... this.applicationEventPublisher.publishEvent(new GetAll(xxx1, xxx2)); }
-
监听事件
public class GetAllListener{ @Async @EventListener public void onApplicationEvent(GetAll event) { Thread.sleep(1000L); log.info("事件: {}", event); ... }