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 asyncEventBus = new AsyncEventBus(executorService);
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()); } }
@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。
不吝指正。 java