Guava(イベントバス):イベントバスEventBus


EventBus:


EventBusインスタンスを作成するには、次の手順に従います。

EventBus eventBus = new EventBus();
// 
EventBus eventBus = new EventBus(TradeAccountEvent.class.getName());// , 

イベントの購読:

  • は、取引プロセスをシミュレートします.
  • イベントクラス:
  • /**
     *  
     */
    public class TradeAccountEvent {
        private double amount;
        private Date tradeExecutionTime;
        private TradeType tradeType;
        private TradeAccount tradeAccount;
     
        public TradeAccountEvent(TradeAccount account, double amount,
                Date tradeExecutionTime, TradeType tradeType) {
            this.amount = amount;
            this.tradeExecutionTime = tradeExecutionTime;
            this.tradeAccount = account;
            this.tradeType = tradeType;
        }
    }
     
    /**
     *  
     */
    public class BuyEvent extends TradeAccountEvent {
        public BuyEvent(TradeAccount tradeAccount, double amount,
                Date tradExecutionTime) {
            super(tradeAccount, amount, tradExecutionTime, TradeType.BUY);
        }
    }
     
    /**
     *  
     */
    public class SellEvent extends TradeAccountEvent {
        public SellEvent(TradeAccount tradeAccount, double amount,
                Date tradExecutionTime) {
            super(tradeAccount, amount, tradExecutionTime, TradeType.SELL);
        }
    }
  • 購読者
  • /**
     *  , 
     */
    public class AllTradesAuditor {
        private List<BuyEvent> buyEvents = Lists.newArrayList();
        private List<SellEvent> sellEvents = Lists.newArrayList();
     
        public AllTradesAuditor(EventBus eventBus) {
            eventBus.register(this);
        }
     
        /**
         *  
         */
        @Subscribe
        public void auditSell(SellEvent sellEvent) {
            sellEvents.add(sellEvent);
            System.out.println("Received TradeSellEvent " + sellEvent);
        }
     
        /**
         *  
         */
        @Subscribe
        public void auditBuy(BuyEvent buyEvent) {
            buyEvents.add(buyEvent);
            System.out.println("Received TradeBuyEvent " + buyEvent);
        }
    }
  • パブリッシャ
  • /**
     *  ,  
     */
    public class SimpleTradeExecutor {
        private EventBus eventBus;
     
        public SimpleTradeExecutor(EventBus eventBus) {
            this.eventBus = eventBus;
        }
     
        /**
         *  
         */
        public void executeTrade(TradeAccount tradeAccount, double amount,
                TradeType tradeType) {
            TradeAccountEvent tradeAccountEvent = processTrade(tradeAccount,
                    amount, tradeType);
            eventBus.post(tradeAccountEvent); //  
        }
     
        /**
         *  
         * 
         * @return  
         */
        private TradeAccountEvent processTrade(TradeAccount tradeAccount,
                double amount, TradeType tradeType) {
            Date executionTime = new Date();
            String message = String.format(
                    "Processed trade for %s of amount %n type %s @ %s",
                    tradeAccount, amount, tradeType, executionTime);
            TradeAccountEvent tradeAccountEvent;
            if (tradeType.equals(TradeType.BUY)) { // 
                tradeAccountEvent = new BuyEvent(tradeAccount, amount,
                        executionTime);
            } else { // 
                tradeAccountEvent = new SellEvent(tradeAccount, amount,
                        executionTime);
            }
            System.out.println(message);
            return tradeAccountEvent;
        }
    }
  • 試験例
  • EventBus eventBus = new EventBus();
    AllTradesAuditor auditor = new AllTradesAuditor(eventBus);
    SimpleTradeExecutor tradeExecutor = new SimpleTradeExecutor(eventBus);
    tradeExecutor.executeTrade(new TradeAccount(), 1000, TradeType.SELL);
    tradeExecutor.executeTrade(new TradeAccount(), 2000, TradeType.BUY);

    購読解除:

  • 購読者が登録をキャンセルする
  • public void unregister(){
          this.eventBus.unregister(this);
    }

    AsyncEventBusクラス

  • はその名を聞いて、非同期イベントバスで、時間のかかる処理を処理するときに役立ち、Executorsに依存して非同期イベントバス
  • を実現しなければならない.
    AsyncEventBus asyncEventBus = new AsyncEventBus(executorService);

    DeadEvents:

  • バスがパブリッシャーからの発信情報を受信すると、このとき購読者がいない場合、このイベントはDeadEventイベント
  • としてパッケージされる.
    public class DeadEventSubscriber {
        private static final Logger logger = 
                Logger.getLogger(DeadEventSubscriber.class.getName());
     
        public DeadEventSubscriber(EventBus eventBus) {
            eventBus.register(this);
        }
         
        /**
         *  
         */
        @Subscribe
        public void handleUnsubscribedEvent(DeadEvent event){
            logger.warning("No subscribers for "+event.getEvent());
        }
    }

    依存注入

  • 同じEventBus
  • をDIフレームワーク(SpringまたはGuice)で注入できます.
    @Component
    public class SimpleTradeExecutor {
           private EventBus eventBus;
           @Autowired
           public SimpleTradeExecutor(EventBus eventBus) {
               this.eventBus = checkNotNull(eventBus, "EventBus can't be null");                                             }
    }
    @Component
    public class SimpleTradeAuditor {
           private List<TradeAccountEvent> tradeEvents =
        Lists.newArrayList();
        @Autowired
        public SimpleTradeAuditor(EventBus eventBus){
               checkNotNull(eventBus,"EventBus can't be null");
               eventBus.register(this);
       }
    }

    以上、GuavaのEventBusについてご紹介しました.