Шаблон проектирования Шаблон публикации-подписки (4) Обработка событий Guava Eventbus

Шаблоны проектирования EventBus
Шаблон проектирования Шаблон публикации-подписки (4) Обработка событий Guava Eventbus

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"));

    }

}

Суммировать

Wechat-westcall

В этой статье мы быстро продемонстрировали, как реализовать шаблон публикации/подписки с помощью EventBus в Guava. EventBus, как облегченная, простая и малонавязчивая реализация механизма событий, настоятельно рекомендуется в простых сценариях обработки событий.

Если к вашему механизму обработки событий предъявляются такие требования, как распределенная или условная фильтрация, вы можете рассмотреть возможность использования представленного ранееМодель публикации/подписки RedisилиМодель, управляемая событиями Spring Events.

Wechat-westcall

Ссылки по теме