java 异步总线guava eventBus
参见: https://blog.csdn.net/winy_lm/article/details/88076968?spm=1001.2101.3001.6650.14&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EESLANDING%7Edefault-14-88076968-blog-108793655.pc_relevant_landingrelevant&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EESLANDING%7Edefault-14-88076968-blog-108793655.pc_relevant_landingrelevant&utm_relevant_index=15
步骤:
1.pom添加依赖
1 2 3 4 5 | < dependency > < groupId >com.google.guava</ groupId > < artifactId >guava</ artifactId > < version >31.0.1-jre</ version > </ dependency > |
2.写一个EventBus的@Bean,全局总线;
1 2 3 4 5 | @Bean public EventBus eventBus() { // return new EventBus(); 同步的 return new AsyncEventBus(ThreadPoolUtil.executorAsyncEvent); // 异步的 } |
3.写一个EventListener的@Component类, 通过@PostConstruct初始化时注册. 然后写诺干个@Subscribe注解的方法
@Component
@Slf4j
public class EventListener {
@Autowired
private EventBus eventBus;
@PostConstruct
public void register(){
eventBus.register(this);
}
@Subscribe
private void do1(String msg) {
log.info(Thread.currentThread().getId() + ", do1=" + msg);
}
@Subscribe
private void do2(Integer i) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
log.info(Thread.currentThread().getId() + ", do2=" + i);
}
@Subscribe
private void do3(Object o) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
log.info(Thread.currentThread().getId() + ", do3=" + o.toString());
}
}
4.测试通过eventBus.post(xxx) 即可调用到xxx对应参数类型的方法.
@RestController
@Slf4j
public class TestController {
@Autowired
private EventBus eventBus;
@GetMapping("/tt/tt")
public JsonResult test(int i) {
log.info("test线程的id=" + Thread.currentThread().getId());
eventBus.post(i);
return JsonResult.successResult(null);
}
}
运行结果: 因为参数是int, 所以do2执行; 同时Object参数类型的do3也执行. (同步执行线程id不变, 异步执行3个线程id都可能不同; 如果同步执行肯定是先执行参数类型相同的)
5.扩展: 因为AsyncEventBus接受线程池作为参数, 所以实现自己的拒绝策略.(拒绝时会通知主线程).
6.适用性: 可以少写些if判断,优雅的实现异步处理. (其实手写runnable也行,感觉就是装B而已, 而且会带来逻辑混乱的问题.) 如果要用建议约定好全局一个只有一个EventListener(注册,监听), 而且@Subscribe注解的所有方法参数类型是finall的,避免冒泡
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!