EventBus是一个publisher/subscribe消息总线,简化了应用程序内各组件间、组件与后台线程间的通信。
作为一个消息总线主要有三个组成部分:
com.dzg.gm2.common
gm2-ddd-event
${gm2-common.version}
@Configuration
@EnableEvent
public class EventConfiguration {
@Bean("asyncEventBus")
public EventBus asyncEventBus() {
ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(5, 5, 0, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<>(10000), new NameThreadFactory("async-event-bus-thread"),
new ThreadPoolExecutor.CallerRunsPolicy())
DefaultEventBus eventBus = new DefaultEventBus(threadPoolExecutor);
eventBus.setOrder(2);
return eventBus;
}
}
@Service
public class DemoDomainService {
@Resource
private EventCenter eventCenter;
public Result commitOrderDraft(SeaOrder orderDraft, UserOperatorContext operator) {
Result seaOrderResult = super.commitOrderDraft(orderDraft, operator);
if (orderDraft.getOrderId() != null) {
// 发布事件
eventCenter.publish(CommitOrderDraftDomainEvent.builder().order(orderDraft).build());
}
return seaOrderResult;
}
}
-- 基于@TransactionalEventListener 将领域事件绑定在事务提交之后执行
@EventHandlers(eventBus = EventConstant.TRANSACTION_EVENT_BUS)
public class DemoDomainServiceEventHandler {
@UseEventHandler
public void commitOrderDraft(CommitOrderDraftDomainEvent event) {
}
}
-- 同步处理事件
@EventHandlers(eventBus = EventConstant.DEFAULT_EVENT_BUS)
public class DemoDomainServiceEventHandler {
@UseEventHandler
public void commitOrderDraft(CommitOrderDraftDomainEvent event) {
}
}
-- 异步处理事件
@EventHandlers(eventBus = "asyncEventBus")
public class DemoDomainServiceEventHandler {
@UseEventHandler
public void commitOrderDraft(CommitOrderDraftDomainEvent event) {
}
}
-- MQ处理事件 RocketMqEvent里面需要指订Topic与Tag
@EventHandlers(eventBus = EventConstant.ROCKET_EVENT_BUS)
public class DemoDomainServiceEventHandler {
@UseEventHandler
public void commitOrderDraft(RocketMqEvent event) {
}
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
if (bean instanceof EventBus) {
eventCenter.register((EventBus)bean);
}
return bean;
}
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
EventHandlers eventHandlers = AnnotationUtils.findAnnotation(bean.getClass(), EventHandlers.class);
if (Objects.nonNull(eventHandlers)) {
ImmutableList annotatedMethods = EventHandlerRegistry.getAnnotatedMethods(bean.getClass());
for (Method method : annotatedMethods) {
UseEventHandler useEventHandler = AnnotationUtils.findAnnotation(method, UseEventHandler.class);
if (Objects.nonNull(useEventHandler)) {
// 事件名称和 evnet bus名称
String eventBusName = useEventHandler.eventBus();
if (StringUtils.isEmpty(eventBusName)) {
eventBusName = eventHandlers.eventBus();
}
if (StringUtils.isEmpty(eventBusName)) {
eventBusName = EventConstant.DEFAULT_EVENT_BUS;
}
EventBus eventBus = (EventBus)this.applicationContext.getBean(eventBusName);
eventBus.register(new MethodEventHandlerWrapper(bean, method, method.getParameterTypes()[0]),
method.getParameterTypes()[0]);
}
}
}
return bean;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
UseEventHandler useEventHandler = AnnotationUtils.findAnnotation(bean.getClass(), UseEventHandler.class);
if (Objects.nonNull(useEventHandler)) {
if (bean instanceof EventHandler) {
// 注解定义的bus名称和eventName
String eventBusName = useEventHandler.eventBus();
if (StringUtils.isEmpty(eventBusName)) {
eventBusName = EventConstant.DEFAULT_EVENT_BUS;
}
EventBus eventBus = (EventBus) this.applicationContext.getBean(eventBusName);
eventBus.register((EventHandler) bean, getActualType((EventHandler)bean));
}
}
return bean;
}