大家好,又见面了,我是你们的朋友全栈君。
使用场景:多线程消费
1.异步注解@EnableAsync配置
2.配置线程池bean(启动类者单独配置bean),可参考本菜鸟的其他文章
3.启动消费者;生产者可以通过其他方式
4.实际业务处理,配置异步处理注解和线程池名称 @Async(“redisThread”)
步骤一:配置异步注解和线程池
@SpringBootApplication
@EnableAsync
public class ImRedisApplication {
public static void main(String[] args) {
SpringApplication.run(ImRedisApplication.class, args);
}
@Bean("redisThread")
public ThreadPoolTaskExecutor initRedisPool(){
ThreadPoolTaskExecutor threadPoolTaskExecutor = new ThreadPoolTaskExecutor();
/**
* 核心线程数
*/
threadPoolTaskExecutor.setCorePoolSize(4);
/**
* 最大线程数
*/
threadPoolTaskExecutor.setMaxPoolSize(9);
/**
* 存活
*/
threadPoolTaskExecutor.setKeepAliveSeconds(10 * 60);
/**
* 队列容量
*/
threadPoolTaskExecutor.setQueueCapacity(10);
/**
* 线程名称
*/
threadPoolTaskExecutor.setThreadNamePrefix("redisThread" + "-");
/**
* 拒绝策略,关于拒绝策略可以看实现 RejectedExecutionHandler 的类,当然也可以自定义拒接策略,也就是现实RejectedExecutionHandler接口方法
*/
threadPoolTaskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.AbortPolicy());
return threadPoolTaskExecutor;
}
}
2.通过 @PostConstruct和线程启动消费者,(生产者可以使用xxl-job,MQ或者其他方式产生,基于自己的实际业务需求)
@Component
@Slf4j
public class RedisConsumerInit {
@Autowired
private IdConsumerService idConsumerService;
@PostConstruct
public void init() {
/**
* 初始化启动
*/
new PoolConsumerThread().start();
}
class PoolConsumerThread extends Thread {
@Override
public void run() {
while (true) {
/**
* 从redis,MQ等拿消息
*/
int i = new Random().nextInt();
try {
idConsumerService.execute(i);
} catch (RejectedExecutionException e) {
log.error("异常了:{}", e.getMessage());
/**
* 如遇到线程池拒绝抛异常,做其他业务处理,比如继续放置到redis队列处理或者其他
*/
} catch (Exception e) {
log.error("异常了:{}", e.getMessage());
}
try {
TimeUnit.NANOSECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
3.具体业务处理,特别注意开启异步注解并配置线程池的bean
@Service
@Slf4j
public class IdConsumerService {
@Async("redisThread")
public void execute(Integer num){
try {
log.info("当前消费:{}", num);
/**
* 实际业务处理
*/
} catch (Exception e) {
e.printStackTrace();
}
}
}
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/149658.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...