java ddd 事件总线_走近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 buyEvents = Lists.newArrayList();

private List 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());

}

}

依赖注入

我们可以通过DI框架(Spring或Guice)来注入同样的EventBus

@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 tradeEvents =

Lists.newArrayList();

@Autowired

public SimpleTradeAuditor(EventBus eventBus){

checkNotNull(eventBus,"EventBus can't be null");

eventBus.register(this);

}

} 以上就介绍了Guava的EventBus。

不吝指正。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值