- 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<String> 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<String, Object> 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){
}