EventBus — это механизм обработки событий, реализованный Guava, и представляет собой элегантное и простое решение шаблона публикации-подписки/подписки в шаблоне проектирования. Таким образом, мы можем быстро реализовать шаблон публикации/подписки на основе модели событий, не создавая ни сложной структуры классов, ни сложной иерархии интерфейсов.
Если вы можете порекомендовать только одну реализацию мониторинга событий и режима публикации/подписки, то первым выбором будет EventBus от Guava.
процесс интеграции
Интеграция EventBus в Guava очень проста, вам нужно только установить пользовательскийEvent
иEventListener
положить вEventBus
, а затем вы можете публиковать сообщения через EventBus. Давайте объясним это шаг за шагом.
🚜Адрес Github исходного кода этой статьи
Добавить зависимость от Гуавы
Сначала добавим в проект зависимости guava, и мы введем Lombok, чтобы упростить определение JavaBeans.
<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>
пользовательское событие
Вы можете видеть, что нашему пользовательскому событию не нужно реализовывать какой-либо интерфейс Guava, просто определите параметры события, которые вам нужно использовать. Здесь мы предоставляем только параметр сообщения.
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;
}
Пользовательский прослушиватель событий
Добавляя гуаву в метод@Subscribe
Аннотация, мы можем заставить метод прослушивать событие.
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"));
}
}
Суммировать
В этой статье мы быстро продемонстрировали, как реализовать шаблон публикации/подписки с помощью EventBus в Guava. EventBus, как облегченная, простая и малонавязчивая реализация механизма событий, настоятельно рекомендуется в простых сценариях обработки событий.
Если к вашему механизму обработки событий предъявляются такие требования, как распределенная или условная фильтрация, вы можете рассмотреть возможность использования представленного ранееМодель публикации/подписки RedisилиМодель, управляемая событиями Spring Events.