1. 程式人生 > 其它 >《微服務架構設計》——Eventuate Tram框架訂閱/消費模式原始碼解析

《微服務架構設計》——Eventuate Tram框架訂閱/消費模式原始碼解析

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;

  @Test
  
public 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只做到標記以保證出錯時能打出日誌,並不參與訂閱消費的流程中,不要想當然的被誤導了。