Guava发布订阅组件EventBus

huiyugan
发布于 2022-11-10 11:10
浏览
0收藏

前言

Guava是一个谷歌开发的开源库。Guava工程中包含了很多被Google的 Java项目广泛依赖的核心库。

本文主要介绍Guava中的EventBus组件。

EventBus

​Eventbus​​​是一种机制,它允许不同的组件在不了解彼此的情况下相互通信。组件可以将​​Event​​​发送到​​Eventbus​​​,而不知道谁将接收它,或者有多少其他组件将接收它。组件还可以监听​​Eventbus​​​上的事件,而不知道是谁发送了事件。这样,组件就可以在不依赖彼此的情况下进行通信。另外,替换一个组件也很容易。只要新组件理解正在发送和接收的​​Events​​,其他组件就永远不会知道。

Guava发布订阅组件EventBus-鸿蒙开发者社区

引入依赖

<dependency>
      <groupId>com.google.guava</groupId>
      <artifactId>guava</artifactId>
      <version>18.0</version>
  </dependency>

快速使用

创建EventBus

使用​​Eventbus​​时,首先,为了注册监听器和发布事件,你需要一个总线:

EventBus eventBus=new EventBus();

创建监听器

然后需要创建一个监听器,用于订阅​​EventBus​​上的事件。

public class MyEventListener{
 private static int numberEvents;
 private static List<String> eventsList=new ArrayList<>();
 @Subscribe
 public void myEvent(String event){
  System.out.println(event);
  numberEvents++;
 }

注册监听器并发布事件

可以看到,处理程序方法使用​​@Subscribe​​​注解;现在​​Listener​​​应该被添加到​​Eventbus​​和发布事件。下面是一个简单的例子:

import com.google.common.eventbus.EventBus;
import com.google.common.eventbus.Subscribe;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;

public class EventBusTest {

   class EventListener{
      private  int numberEvents;
      @Subscribe
      public void myEvent(String event){
          System.out.println(event);
          numberEvents++;
      }
      public  int getNumberEvents(){
          return  numberEvents;
      }
 }

 @Test
 public void testEventBusSimpleTest(){
  EventBus eventBus=new EventBus();
  EventListener listener = new EventListener();
  eventBus.register(listener);
  eventBus.post("event1");
  eventBus.post("event2");
  assertEquals(2, listener.getNumberEvents());
 }
}

实际案例

是不是很简单!我们可以通过​​EventBus​​解决一些实际场景中的问题,在单个JVM中进行异步处理。比如在一些交易系统中,在付款成功以后,需要将结果通知给付款方,同时也要通知收款方。

Guava发布订阅组件EventBus-鸿蒙开发者社区


在这个例子中,我们需要两个监听器,一个用于发送付款成功的消息给用户,一个用于发送消息给收款方。


首先有一个用于表示交易的类。

class Transaction {
    private final String transactionName;
    private double amount = 0.0;
    public Transaction(String transactionName, Double amount){
        this.transactionName = transactionName;
        this.amount = amount;
    }
    public String getTransactionName(){
        return transactionName;
    }
    public double getAmount(){
        return amount;
    }
    @Override
    public String toString(){
        return "[transaction with name " + transactionName + " and amount " + amount + "]";
    }
}

然后建立两个监听器,用于监听交易完成的事件,并作出响应。

class SendPaymentListener {
    @Subscribe
    private void sendToPayment(Transaction transaction){
        System.out.println("【付款方】交易" + transaction.getTransactionName() + "交易完成,金额:" + transaction.getAmount());
        // to do something...
    }
}

class SendReceiveListener {
    @Subscribe
    private void sendToPayment(Transaction transaction){
        System.out.println("【收款方】交易" + transaction.getTransactionName() + "交易完成,金额:" + transaction.getAmount());
        // to do something...
    }
}

有了事件的订阅方之后,我们建立​​EventBus​​​,并将监听器注册在​​EventBus​​​上,然后将​​Event​​发布。

public class PaymentService {

    static class EventBusFactory {
        //create an asynch bus in new Thread
        private static EventBus eventBus
            = new AsyncEventBus(Executors.newCachedThreadPool());
        public static EventBus getEventBus(){
            return eventBus;
        }
    }
    
    @Test
    public void testPayment(){
        //registering listeners
        EventBusFactory.getEventBus().register(new SendPaymentListener());
        EventBusFactory.getEventBus().register(new SendReceiveListener());
        EventBusFactory.getEventBus().post(new Transaction("交易001", 100.0));
    }
}

我们执行测试用例后,结果如下:

Guava发布订阅组件EventBus-鸿蒙开发者社区

可以看出,我们并不用显式的去调用​​SendPaymentListener​​​和​​SendReceiveListener​​​的方法,​​EventBus​​内部便可以替我们完成事件的发布。

小结

​Guava EventBus​​​的内容比较简单,所以上面内容也写的很简单,你可以动手试试,体验一下​​Guava​​的发布订阅模式。如果对你有所帮助,点个赞就是对我最大的鼓励!

分类
标签
已于2022-11-10 11:10:02修改
收藏
回复
举报
回复
    相关推荐