《微服務架構設計》——Eventuate Tram框架訂閱/消費模式原始碼解析
阿新 • • 發佈:2021-11-29
Eventuate Tram框架官方文件:https://eventuate.io/docs/manual/eventuate-tram/latest/getting-started-eventuate-tram.html#getting-started
Eventuate Tram架構在DDD架構時使用了其消費/訂閱模式,官網給的樣例如下:
領域事件釋出程式碼:
public abstract class AbstractTramEventTest { @Autowired private DomainEventPublisher domainEventPublisher; @Testpublic void shouldReceiveEvent() throws InterruptedException { long uniqueId = config.getUniqueId(); String accountId = ...; DomainEvent domainEvent = new AccountDebited(...); domainEventPublisher.publish("Account", accountId, Collections.singletonList(domainEvent));
消費領域事件程式碼:
首先,定義DomainEventHandlers
public class TramEventTestEventConsumer { public DomainEventHandlers domainEventHandlers() { return DomainEventHandlersBuilder .forAggregateType("Account") .onEvent(AccountDebited.class, this::handleAccountDebited) .build(); } public void handleAccountDebited(DomainEventEnvelope<AccountDebited> event) { ... } }
匯入TramEventSubscriberConfiguration
並配置一個DomainEventDispatcher
:
@Configuration @Import(TramEventSubscriberConfiguration.class) public class AbstractTramEventTestConfiguration { @Bean public DomainEventDispatcher domainEventDispatcher(DomainEventDispatcherFactory domainEventDispatcherFactory, AbstractTramEventTestConfig config, TramEventTestEventConsumer target) { return domainEventDispatcherFactory.make("eventDispatcherId" + config.getUniqueId(),target.domainEventHandlers()); } @Bean public TramEventTestEventConsumer tramEventTestTarget(AbstractTramEventTestConfig config) { return new TramEventTestEventConsumer(); }
官方的案例讓我沒看明白他們到底通過什麼進行訂閱消費,於是扒了下原始碼:
可以下載儲存後本地放大觀看。
通過原始碼發現Eventuate Tram是通過領域事件型別和事件Class類來進行訂閱消費,引數中的xxxxId只做到標記以保證出錯時能打出日誌,並不參與訂閱消費的流程中,不要想當然的被誤導了。