EventBus是Guava實現的的事件處理機制,是設計模式中的發佈訂/閱模式的優雅和簡單的解決方案。經過這種方式,咱們既不須要建立複雜的類結構,也沒有複雜的接口層次結構,就能夠快速實現基於事件模型的發佈/訂閱模式。java
若是對事件監聽和發佈/訂閱模式的實現,只能推薦一種的話,那麼首選就是Guava的EventBus。git
集成Guava的EventBus很是簡單,只須要把自定義的Event
和EventListener
放入EventBus
,而後你就能夠經過EventBus來發布消息了。下面一步步講解一下。github
🚜 本文源碼Github地址 spring
首先爲項目增長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不須要實現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;
}
複製代碼
經過在方法上添加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
中移除。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"));
}
}
複製代碼
這篇文章,咱們快速演示瞭如何使用Guava的EventBus來實現發佈/訂閱模式。EventBus做爲一種事件機制的輕量、簡單、低侵入的實現方式,在簡單的事件處理場景下是很是推薦使用的。google
若是你的事件處理機制有分佈式或者條件過濾等要求,能夠考慮使用以前介紹的 Redis 發佈/訂閱模式 或者 Spring Events 事件驅動模型。spa