事件总线是guava开发的轻量级的消息发布订阅模式框架,非常适合在单体应用中进行使用
相比MQ它更加轻量,易用,但一般只用于进程内部的通信,不能像MQ一样用于分布式系统的服务与服务之间的通信。
下面是简单使用
引入依赖
<dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>32.1.3-jre</version> </dependency>
首先创建EventBus对象,这个用于我们的事件发送
EventBus eventBus = new EventBus(); //或者异步 AsyncEventBus asyncEventBus = new AsyncEventBus(Executors.newCachedThreadPool());
然后我们需要自己创建消费端,并且建立对应参数类型消费方法,这里使用@Subscribe注解来进行绑定
@Slf4j public class EventBusSubscriber{ @Subscribe public void integerSubscriber(Integer integer){ System.out.println("integer类型的订阅者收到的订阅消息 = " + integer); } @Subscribe public void stringSubscriber(String str){ System.out.println("String类型的订阅者收到的订阅消息str = " + str); } @Subscribe public void deadEventSubscriber(DeadEvent deadEvent){ log.error("接收到了没有对应类型的消息{}",deadEvent); } }
可以尝试使用post方法进行消息发布
public class Test { static class Person{ private String name; private Integer age; private String idCard; } public static void main(String[] args) { EventBus eventBus = new EventBus(); //或者异步 AsyncEventBus asyncEventBus = new AsyncEventBus(Executors.newCachedThreadPool()); eventBus.register(new EventBusSubscriber()); eventBus.post(1); eventBus.post("hello world"); eventBus.post(new Person()); } }
查看控制台并验证
integer类型的订阅者收到的订阅消息 = 1 String类型的订阅者收到的订阅消息str = hello world 23:43:50.465 [main] ERROR com.example.activitydemo.test.EventBusSubscriber - 接收到了没有对应类型的消息DeadEvent{source=EventBus{default}, event=com.example.activitydemo.test.Test$Person@4fb61f4a} 进程已结束,退出代码0
代码执行无误,这里最后一个方法的DeadEvent是用于描述无法被消费端处理的消息,称为死信消息,都归于这中类型可以进行统一异常处理