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

EventBus是Guava實現的的事件處理機制,是設計模式中的發佈訂/閱模式的優雅和簡單的解決方案。經過這種方式,咱們既不須要建立複雜的類結構,也沒有複雜的接口層次結構,就能夠快速實現基於事件模型的發佈/訂閱模式。java

若是對事件監聽和發佈/訂閱模式的實現,只能推薦一種的話,那麼首選就是Guava的EventBus。git

集成過程

集成Guava的EventBus很是簡單,只須要把自定義的EventEventListener放入EventBus,而後你就能夠經過EventBus來發布消息了。下面一步步講解一下。github

🚜 本文源碼Github地址 spring

增長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參數。springboot

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中移除。post

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做爲一種事件機制的輕量、簡單、低侵入的實現方式,在簡單的事件處理場景下是很是推薦使用的。google

若是你的事件處理機制有分佈式或者條件過濾等要求,能夠考慮使用以前介紹的 Redis 發佈/訂閱模式 或者 Spring Events 事件驅動模型spa

Wechat-westcall

相關連接

相關文章
相關標籤/搜索