GoogleのグアバイベントバスEventBus
Java言語とクラスライブラリに似た、GoogleのグアバとApache Commonsのは、拡張ライブラリを強化しています。
グアバの誕生は、Java Googleのエンジニアの多くの効率的な方法は、日常業務のコレクションから抽出されていることです。
サブスクリプションのライブラリで実装されオブザーバーデザインパターンを簡単に便利なビジネスコードを切り離すことができる-のGoogleグアバライブラリは、イベントにニュースリリースを提供してバス集合(EventBus)、があります。
例えば、我々はすぐにEventBusにより、プロセス内のプログラムのメッセージキューを確立することができます。EventBusは、私はクロスプロセスの使用をサポートしていないので、メモリ内のメッセージのキューを維持することであるため。
あなたが必要とするすべては、クロスプロセスの場合はもちろん、それはメッセージキューミドルウェア(RabbitMQの、カフカなど)から直接配布される必要があります
EventBusは、同期および非同期(AsyncEventBus)に分割されます。
イベントは、現在のイベントバスを扱うことができ、リスナーの任意EventBusなしで送信された場合、このイベントはDeadEventの再送信に再パッケージ化されます。
イベントバスのプロセスを作成します。
関連する概念イベントバスは、次のとおりです。
イベントニュースプロデューサー
イベントメッセージ
イベントリスナー(イベントメッセージコンシューマとして理解することができる)
イベントハンドラ
バスのための新しいイベント処理フローを作成します。
- カテゴリイベントのニュースを選択または作成します
- イベントリスナクラスを作成します。
- あなたはこの時点でエグゼキュータオブジェクトを作成するために、非同期イベントバスの必要性を使用したい場合(例えば、スレッド・プールなど)
- 新しいイベント処理バスを作成します(EventBus、AsyncEventBus)
- 登録イベントリスナー(以上であってもよいです)
- イベントメッセージを送信
- アンバンドリングイベントリスナー
コードコード
依存性の導入
<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();
}
}