設計モードのパブリケーション購読モード(4)Guava Eventbusイベント処理


EventBusはGuavaが実現したイベント処理メカニズムであり、設計モードにおけるパブリケーション/閲覧モードの優雅で簡単な解決策である.このようにして、複雑なクラス構造を作成する必要もなく、複雑なインタフェース階層もなく、イベントモデルベースのパブリケーション/サブスクリプションモードを迅速に実現できます.
イベントリスニングとパブリッシュ/サブスクリプションモードの実装が1つしか推奨できない場合は、GuavaのEventBusが優先です.
統合プロセス
統合GuavaのEventBusは非常に簡単で、カスタムのEventEventListenerEventBusに入れるだけで、EventBusでメッセージを公開することができます.次は少しずつ説明します.
? 本明細書のソースコードGithubアドレス
Guava依存性の増加
まずプロジェクトにguava依存性を増やし,同時にLombokを導入してJavaBeanの定義を簡略化した.
<dependency>
  <groupId>com.google.guavagroupId>
  <artifactId>guavaartifactId>
  <version>27.1-jreversion>
dependency>

<dependency>
    <groupId>org.projectlombokgroupId>
    <artifactId>lombokartifactId>
    <optional>trueoptional>
  dependency>

カスタムイベント
私たちがカスタマイズしたEventはGuavaのインタフェースを実装する必要はありません.自分が使用するイベントパラメータを定義すればいいのです.ここではmessageパラメータを1つだけ提供します.
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 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から削除することができる.
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 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イベント駆動モデルを使用することを考慮してください.
関連リンク
  • 一文はサブスクリプションモード
  • を発表することを理解します
  • Redisパブリケーション/サブスクリプションモード
  • Spring Eventsイベント駆動モデル
  • に深く入り込む
    転載先:https://juejin.im/post/5ccad3f4f265da03af27e3ed