イベント・メッセージ・キュー・プロセスバスEventBusでのGoogleグアバ

ここに画像を挿入説明

Java言語とクラスライブラリに似た、GoogleのグアバとApache Commonsのは、拡張ライブラリを強化しています。
グアバの誕生は、Java Googleのエンジニアの多くの効率的な方法は、日常業務のコレクションから抽出されていることです。

サブスクリプションのライブラリで実装されオブザーバーデザインパターンを簡単に便利なビジネスコードを切り離すことができる-のGoogleグアバライブラリは、イベントにニュースリリースを提供してバス集合(EventBus)、があります。

例えば、我々はすぐにEventBusにより、プロセス内のプログラムのメッセージキューを確立することができます。

EventBusは、私はクロスプロセスの使用をサポートしていないので、メモリ内のメッセージのキューを維持することであるため。

あなたが必要とするすべては、クロスプロセスの場合はもちろん、それはメッセージキューミドルウェア(RabbitMQの、カフカなど)から直接配布される必要があります

EventBusは、同期および非同期(AsyncEventBus)に分割されます。

イベントは、現在のイベントバスを扱うことができ、リスナーの任意EventBusなしで送信された場合、このイベントはDeadEventの再送信に再パッケージ化されます。

イベントバスのプロセスを作成します。

関連する概念イベントバスは、次のとおりです。

イベントニュースプロデューサー
イベントメッセージ
イベントリスナー(イベントメッセージコンシューマとして理解することができる)
イベントハンドラ

バスのための新しいイベント処理フローを作成します。

  1. カテゴリイベントのニュースを選択または作成します
  2. イベントリスナクラスを作成します。
  3. あなたはこの時点でエグゼキュータオブジェクトを作成するために、非同期イベントバスの必要性を使用したい場合(例えば、スレッド・プールなど)
  4. 新しいイベント処理バスを作成します(EventBus、AsyncEventBus)
  5. 登録イベントリスナー(以上であってもよいです)
  6. イベントメッセージを送信
  7. アンバンドリングイベントリスナー

コードコード

依存性の導入

        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>28.2-jre</version>
        </dependency>

シンプルなイベント処理

リスナー

/**
 * 事件监听类
 */
@Slf4j
class OrderEventListener{

    /**
     * @Subscribe 监听事件的处理方法;监听的事件对象类型可以是继承自Object的任何类。
     * @AllowConcurrentEvents 是在ASyncEventBus(异步事件总线中必要的),如果是EventBus则不用加上此注解
     * @param msg
     */
    @AllowConcurrentEvents
    @Subscribe
    public void eventFunc(JSONObject msg) {
        log.debug("*************" + this.getClass().getCanonicalName()+"************************");
        log.info("on message {} ", msg.toJSONString());
    }
}

イベントバスのプロデューサーを作成し、イベントを送信するイベントリスナーを登録します

    @GetMapping("startEvent")
    public void testProc2(){
        log.info( "test starting ... ");
//        Creates a new EventBus with the given identifier.
        EventBus eventBus = new EventBus("orderEventBus");
//        Registers all subscriber methods on object to receive events.
        eventBus.register(new OrderEventListener());
//      新建一个事件消息对象
        JSONObject msg = new JSONObject();
        msg.put("orderNo", "orderNo000001");
        msg.put("userNo", "ochsaofhdhfodhfos00");
//      咱们来使用一个线程去发送事件消息
        Thread t1 = new Thread(()->{
            int i = 0;
            while (i < 100) {
                i++;
                try {
                    Thread.sleep(1000);
//                    发送事件消息
                    eventBus.post(msg);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });

        t1.start();
    }

業績

ここに画像を挿入説明

スプレッド

同時に行うためのインタフェースクラスバネでホストされているリスナー、DeadEventの使用を使用する複数のイベントリスナを登録します。

複数のイベントリスナープラスDeadEvent処理

クラスのインターフェイス

/**
 * 事件处理接口
 */
public interface IEventListener{
    public void eventFunc(JSONObject msg);
}
/**
 * 事件监听类 扩展的
 */
@Component
@Slf4j
public class OrderEventListenerExt implements IEventListener {

    /**
     * @Subscribe 监听事件的处理方法;监听的事件对象类型可以是继承自Object的任何类。
     * @AllowConcurrentEvents 是在ASyncEventBus(异步事件总线中必要的),如果是EventBus则不用加上此注解
     * @param msg
     */

    @Override
    @AllowConcurrentEvents
    @Subscribe
    public void eventFunc(JSONObject msg) {
        log.debug("*************************************");
        log.info("on message {} ", msg.toJSONString());
    }
}

DeadEventモニター

/**
 * DeadEvent事件监听类(可选的)
 * 当一个EventBus发送的一个事件在当前事件总线中没有任何一个监听者可以处理,那么这个事件会被重新包装成DeadEvent重新发送。
 */
@Slf4j
class DeadEventListener{

    /**
     * @Subscribe 监听事件的处理方法;监听的事件对象类型可以是继承自Object的任何类。
     * @AllowConcurrentEvents 是在ASyncEventBus(异步事件总线中必要的),如果是EventBus则不用加上此注解
     * @param msg
     */
    @AllowConcurrentEvents
    @Subscribe
    public void eventFunc(DeadEvent msg) {
        log.debug("*************" + this.getClass().getCanonicalName()+"************************");
        log.info("on message {} ", msg.toString());
    }
}

    @Autowired
    private IEventListener eventListener;

    @GetMapping("startEvent2")
    public void testProc4(){
        log.info( "test starting ...  ");
//        Creates a new EventBus with the given identifier.
        EventBus eventBus = new EventBus("orderEventBus");
//        Registers all subscriber methods on object to receive events.
        eventBus.register(eventListener);
        eventBus.register(new OrderEventListener());
        eventBus.register(new DeadEventListener());
//      新建一个事件消息对象
        JSONObject msg = new JSONObject();
        msg.put("orderNo", "orderNo000001");
        msg.put("userNo", "ochsaofhdhfodhfos00");
//      咱们来使用一个线程去发送事件消息
        Thread t1 = new Thread(()->{
            int i = 0;
            while (i < 100) {
                i++;
                try {
                    Thread.sleep(1000);
//                    发送事件消息
                    eventBus.post(msg);
                    eventBus.post(new String("deadeventmessage"));
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });

        t1.start();
    }


業績

ここに画像を挿入説明

結果を見ることができます:
あなたは、このイベントのJSONのイベントが処理をn回されます送信するとJSONにn型のリスニングに登録イベントバスは、オブジェクト。
プロデューサーが送信する場合は登録されたリスナーは、このイベントが戻っDeadEventに梱包送信されることを、イベントを処理することはできません。

非同期イベントバス

    @GetMapping("startEventAsync")
    public void testProc3(){
        log.info( "test starting async event ... ");

        /**
         * 使用google guava async eventbus 我们需要一个线程池对象来管理事件处理线程
         * 我们可以选择jdk或者spring的线程池类
         */

//        JDK提供的线程池类
        ThreadPoolExecutor threadPoolExecutor = new ScheduledThreadPoolExecutor(1);
        threadPoolExecutor.setMaximumPoolSize(1);
        threadPoolExecutor.setKeepAliveTime(1, TimeUnit.SECONDS);
        threadPoolExecutor.allowCoreThreadTimeOut(false);
/**
 *      spring 提供的线程池类
        ThreadPoolTaskExecutor threadPoolTaskExecutor = new org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor();
        threadPoolTaskExecutor.setCorePoolSize(1);
        threadPoolTaskExecutor.setMaxPoolSize(1);
        threadPoolTaskExecutor.setQueueCapacity(100);
        threadPoolTaskExecutor.setAllowCoreThreadTimeOut(true);
        threadPoolTaskExecutor.setKeepAliveSeconds(1000);
        threadPoolTaskExecutor.initialize();*/

//        AsyncEventBus eventBus = new AsyncEventBus("orderEventBusAsync", threadPoolTaskExecutor);
        AsyncEventBus eventBus = new AsyncEventBus("orderEventBusAsync", threadPoolExecutor);

//      不多说,依然是注册事件
//        不要忘记异步事件总线监听方法要加 @AllowConcurrentEvents
        eventBus.register(new OrderEventListener());

//      咱们来使用一个线程去发送事件消息
        Thread t1 = new Thread(()->{
            int i = 0;
            while (i < 100) {
                i++;
                try {
                    Thread.sleep(2000);
                    //      新建事件消息
                    JSONObject msg = new JSONObject();
                    msg.put("orderNo", "orderNo000001Async"+i);
                    msg.put("userNo", "ochsaofhdhfodhfos00");
                    eventBus.post(msg);
                    log.info("post message");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }

        });

        t1.start();
    }

}

業績

ここに画像を挿入説明

公開された58元の記事 ウォン称賛11 ビュー20000 +

おすすめ

転載: blog.csdn.net/wangxudongx/article/details/104869047