EventBusノート

4087 ワード

  • EventBus(AsyncEventBus)同期(非同期)イベントバス
  • *Bus.register(listener)登録イベント、listenerはbean
  • であってもよい
  • *Bus.post(Object event)コミットイベント
  • @Subscribeはイベントを購読して、注釈は方法の上で用いて、このクラスはイベントを登録する必要がありますか?
  • @Component
    public class BizEventBus implements ApplicationContextAware{
    
        private static final Logger log= LoggerFactory.getLogger(BizEventBus.class);
    
        @Resource
        private ExecutorService executorService;
    
        private EventBus eventBus;
        private AsyncEventBus asyncEventBus;
    
        private Set listenerNameSet = Sets.newHashSet();
    
        public void register(Object listener){
            if(Objects.equal(null,listener))return;
            String listenerName = listener.getClass().getSimpleName();
            listenerNameSet.add(listenerName);
            eventBus.register(listener);
            asyncEventBus.register(listener);
            log.info("{} ",listenerName);
        }
    
        /**
         *  
         * @param event
         */
        public void post(Object event){
            try {
                ValidatorTool.valid(event);
                if(event.getClass().isAnnotationPresent(AsyncEvent.class)){
                    log.info(" ");
                    asyncEventBus.post(event);
                }else{
                    eventBus.post(event);
                }
            }catch(Exception e){
                log.error(" , :"+event.getClass().getSimpleName(), e);
                throw new QihoException(e.getMessage());
            }
        }
    
        public String showAllListener(){
            Joiner joiner = Joiner.on(",").skipNulls();
            return joiner.join(listenerNameSet);
        }
    
        @Override
        public void setApplicationContext(ApplicationContext applicationContext) {
            eventBus = new EventBus();
            asyncEventBus = new AsyncEventBus(executorService);
    
            Map listenerMap = applicationContext.getBeansWithAnnotation(BizEventListener.class);
            for(Object listener:listenerMap.values()){
                register(listener);
            }
        }
    
    
    }
    TestEvent event = new TestEvent();
    TestEvent.setId(11L);
    EventBus.post(event);
    @Subscribe
    public void listener(TestEvent event){
        //do something
    }