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添加依赖
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>31.0.1-jre</version>
</dependency>
2.写一个EventBus的@Bean,全局总线;
@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的,避免冒泡

浙公网安备 33010602011771号