zoukankan      html  css  js  c++  java
  • 《微服务架构设计》——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只做到标记以保证出错时能打出日志,并不参与订阅消费的流程中,不要想当然的被误导了。

  • 相关阅读:
    Django (五) modeld进阶
    django (四) model模型
    django (三) admin后台系统
    Django (二) url 和 模板
    django (一) 环境的配置及Django文件简介
    Thinkphp5之Bootstrap自定义BootstrapDetailed分页插件的实现
    Thinkphp5之laypage分页插件的实现
    Thinkphp5之ajax分页实现_paginate()参数详细
    Thinkphp5 日期与时间戳相互转换
    dedecms后台一些时间等验证方法(plus/diy.php)
  • 原文地址:https://www.cnblogs.com/linchenguang/p/15619119.html
Copyright © 2011-2022 走看看