您的位置:首页 > 运维架构 > 网站架构

《微服务架构设计》——Eventuate Tram框架订阅/消费模式源码解析

2021-11-29 13:57 393 查看

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只做到标记以保证出错时能打出日志,并不参与订阅消费的流程中,不要想当然的被误导了。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: