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的,避免冒泡

posted @   trump2  阅读(208)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示