設計模式之釋出訂閱模式(4) Guava Eventbus 事件處理

西召發表於2019-05-02

EventBus是Guava實現的的事件處理機制,是設計模式中的釋出訂/閱模式的優雅和簡單的解決方案。通過這種方式,我們既不需要建立複雜的類結構,也沒有複雜的介面層次結構,就可以快速實現基於事件模型的釋出/訂閱模式。

如果對事件監聽和釋出/訂閱模式的實現,只能推薦一種的話,那麼首選就是Guava的EventBus。

整合過程

整合Guava的EventBus非常簡單,只需要把自定義的EventEventListener放入EventBus,然後你就可以通過EventBus來發布訊息了。下面一步步講解一下。

? 本文原始碼Github地址

增加Guava依賴

首先為專案增加guava依賴,同時我們引入了Lombok來簡化JavaBean的定義。

<dependency>
  <groupId>com.google.guava</groupId>
  <artifactId>guava</artifactId>
  <version>27.1-jre</version>
</dependency>

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <optional>true</optional>
  </dependency>
複製程式碼

自定義Event

你可以看到我們自定義的Event不需要實現Guava的任何介面,只要把自己需要用到的事件引數定義好就行了。這裡我們只提供一個message引數。

package net.ijiangtao.tech.designpattern.pubsub.guava;

import lombok.AllArgsConstructor;
import lombok.Data;

/**
 * CustomEvent
 *
 * @author ijiangtao
 * @create 2019-05-02 18:21
 **/
@AllArgsConstructor
@Data
public class CustomEvent {
    private String message;
}
複製程式碼

自定義EventListener

通過在方法上新增Guava的@Subscribe註解,我們可以讓方法監聽某個Event。

package net.ijiangtao.tech.designpattern.pubsub.guava;

import com.google.common.eventbus.Subscribe;
import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.extern.slf4j.Slf4j;

import java.util.List;

/**
 * EventListener
 *
 * @author ijiangtao
 * @create 2019-05-02 18:15
 **/
@Slf4j
@Data
@AllArgsConstructor
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public class CustomEventListener {

    private List<String> listenedMessageList;

    @Subscribe
    public void onEvent(CustomEvent event) {
        log.info("Guava EventListener listened one message : {}", event.getMessage());
        listenedMessageList.add(event.getMessage());
    }

}
複製程式碼

事件註冊、釋出和取消註冊

EventBusregister方法可以將前面定義好的監聽器註冊到EventBus中,post方法可以釋出事件並通知到所有訂閱該事件的監聽器,unregister方法可以把指定的監聽器從EventBus中移除。

package net.ijiangtao.tech.designpattern.pubsub.guava;

import com.google.common.eventbus.EventBus;
import lombok.extern.slf4j.Slf4j;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import java.util.ArrayList;
import java.util.List;

/**
 * guava event bus tests
 *
 * @author ijiangtao
 * @create 2019-05-02 18:24
 **/
@RunWith(SpringRunner.class)
@SpringBootTest
@Slf4j
public class GuavaEventBusTests {

    @Test
    public void test() {

        EventBus eventBus = new EventBus();

        List<String> listenedMessageList = new ArrayList<>();
        CustomEventListener customEventListener = new CustomEventListener(listenedMessageList);

        eventBus.register(customEventListener);

        eventBus.post(new CustomEvent("post a custom event ---- 1"));

        eventBus.unregister(customEventListener);

        eventBus.post(new CustomEvent("post a custom event ---- 2"));

    }

}
複製程式碼

總結

Wechat-westcall

這篇文章,我們快速演示瞭如何使用Guava的EventBus來實現釋出/訂閱模式。EventBus作為一種事件機制的輕量、簡單、低侵入的實現方式,在簡單的事件處理場景下是非常推薦使用的。

如果你的事件處理機制有分散式或者條件過濾等要求,可以考慮使用之前介紹的 Redis 釋出/訂閱模式 或者 Spring Events 事件驅動模型

Wechat-westcall

相關連結

相關文章