EventBus是Guava實現的的事件處理機制,是設計模式中的釋出訂/閱模式的優雅和簡單的解決方案。通過這種方式,我們既不需要建立複雜的類結構,也沒有複雜的介面層次結構,就可以快速實現基於事件模型的釋出/訂閱模式。
如果對事件監聽和釋出/訂閱模式的實現,只能推薦一種的話,那麼首選就是Guava的EventBus。
整合過程
整合Guava的EventBus非常簡單,只需要把自定義的Event
和EventListener
放入EventBus
,然後你就可以通過EventBus來發布訊息了。下面一步步講解一下。
增加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());
}
}
複製程式碼
事件註冊、釋出和取消註冊
EventBus
的register
方法可以將前面定義好的監聽器註冊到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"));
}
}
複製程式碼
總結
這篇文章,我們快速演示瞭如何使用Guava的EventBus來實現釋出/訂閱模式。EventBus作為一種事件機制的輕量、簡單、低侵入的實現方式,在簡單的事件處理場景下是非常推薦使用的。
如果你的事件處理機制有分散式或者條件過濾等要求,可以考慮使用之前介紹的 Redis 釋出/訂閱模式 或者 Spring Events 事件驅動模型。