事件总线类 OrderEventBus:
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import com.google.common.eventbus.AsyncEventBus;
public class OrderEventBus {
private static final int invokerPoolSize = 50;
private static final int load_factor = 10;
private static BlockingQueue<Runnable> queue = new ArrayBlockingQueue<Runnable>(invokerPoolSize
* load_factor);
private static ThreadPoolExecutor executor = new ThreadPoolExecutor(
invokerPoolSize,
invokerPoolSize,
60L,
TimeUnit.SECONDS,
queue,
new ThreadPoolExecutor.CallerRunsPolicy());
private static AsyncEventBus asyncEventBus = new AsyncEventBus(executor);
/**
* 发布异步处理事件
*/
public static void asyncPost(Object event) {
asyncEventBus.post(event);
}
/**
* 注册处理器
*
* @param handler
*/
public static void register(Object handler) {
asyncEventBus.register(handler);
}
/**
* 注销处理器
*
* @param handler
*/
public static void unregister(Object handler) {
asyncEventBus.unregister(handler);
}
}
保存订单事件 SaveOrderEvent:
public class SaveOrderEvent {
private String orderContext;
private Long customerId;
private String customerName;
public String getOrderContext() {
return orderContext;
}
public void setOrderContext(String orderContext) {
this.orderContext = orderContext;
}
public Long getCustomerId() {
return customerId;
}
public void setCustomerId(Long customerId) {
this.customerId = customerId;
}
public String getCustomerName() {
return customerName;
}
public void setCustomerName(String customerName) {
this.customerName = customerName;
}
}
订单保存事件处理器 OrderSaveHandler:
如果是使用spring,可以利用Java 的 @PostConstruct自动注册
package com.zhushuai.event;
import javax.annotation.PostConstruct;
import com.google.common.eventbus.Subscribe;
public class OrderSaveHandler {
@PostConstruct
public void init() {
OrderEventBus.register(this);
}
@Subscribe
public void handle(SaveOrderEvent event) {
System.out.println(
"orderContext: " + event.getOrderContext() + "\n" + "customerId: " + event.getCustomerId() + "\n"
+ "customerName: " + event.getCustomerName());
}
}
测试:
public class eventBusTest {
public static void main(String[] args){
OrderSaveHandler handler = new OrderSaveHandler();
OrderEventBus.register(handler);
SaveOrderEvent saveOrderEvent = new SaveOrderEvent();
saveOrderEvent.setOrderContext("eventBus 测试,保存订单");
saveOrderEvent.setCustomerId(250L);
saveOrderEvent.setCustomerName("隔壁老王");
OrderEventBus.asyncPost(saveOrderEvent);
}
}