天天看點

Guava event bus 簡單例子

最近項目中用到了GUAVA的eventbus來做異步操作,感覺很順手,這裡寫了個小demo,作為備忘:(引入guava 18.0版本)

1.AppEventBus類:用來注冊,執行和解除安裝事件,内部執行個體化了一個AsyncEventBus類,用線程池開了四個線程。

2.StringMessageEvent:事件類。

3.StringMessageListener類:監聽者,會執行個體化一個AppEventBus和一個具體業務處理類StringMsgHandler。當監聽到StringMessageEvent事件的時候,會執行 帶有 @Subscribe 注解的方法。

4.StringMsgHandler:具體處理業務的類。

上代碼:

public class AppEventBus {

    private final AsyncEventBus eventBus;

    public AppEventBus(){
        this.eventBus = new AsyncEventBus(Executors.newFixedThreadPool(4));
    }

    /**
     * 注冊事件
     */
public void register(Object object){
        eventBus.register(object);
    }

    /**
     * 執行事件
     * @param object
*/
public void post(Object object){
        eventBus.post(object);
    }

    /**
     * 解除安裝事件
     * @param object
*/
public void unRegister(Object object){
        eventBus.unregister(object);
    }

}



      
public class StringMessageEvent {
    private String message;

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public StringMessageEvent(String message) {
        this.message = message;
    }
}



      
public class StringMessageListener {

    private  AppEventBus eventBus;

    private  StringMsgHandler msgHandler;

    public StringMessageListener(AppEventBus eventBus, StringMsgHandler msgHandler) {
        this.eventBus = eventBus;
        this.msgHandler = msgHandler;
    }

    public void init(){
        this.eventBus.register(this);
    }

    @Subscribe
public void handle(StringMessageEvent messageEvent){
        for(int i = 0;i<100;i++) {
            StringBuilder stringBuilder = new StringBuilder();
            stringBuilder.append(messageEvent.getMessage()).append(" thread : ").append(Thread.currentThread().getId());
            msgHandler.printMsg(stringBuilder.toString());
        }
    }
}




      
public class StringMsgHandler {

    public void printMsg(String msg){
        StringBuilder  stringBuilder = new StringBuilder();
        stringBuilder.append(msg).append(" in ").append(new Date());
        System.out.println(stringBuilder.toString());
    }
}


//test類      
public class TestGuava {
    public static void main(String[] args){
        AppEventBus appEventBus = new AppEventBus();
        StringMsgHandler handler = new StringMsgHandler();
        StringMessageListener listener = new StringMessageListener(appEventBus,handler);
        listener.init();
        for(int i = 0;i<10;i++) {
            appEventBus.post(new StringMessageEvent("hello World" + i));
        }
    }
}

運作結果裡可以清晰的看到四個線程之間的切換。      

繼續閱讀