• HZERO Asgard

    HZERO Asgard 是依赖于Choerodon Asgard服务进行开发的,想了解更多Saga的配置及使用信息请访问猪齿鱼官方文档(链接在下方),此处仅给出常用开发实例。

    使用Saga

    注意:@Saga@SagaTask注解标记的方法所在的类必须能够被Spring扫描到

    Asgard 使用示例

    <dependency>
        <groupId>io.choerodon</groupId>
        <artifactId>choerodon-starter-asgard</artifactId>
    </dependency>
    
    choerodon:
      saga:
        consumer:
          enabled: true # 配置当前服务是否作为Saga的消费端,true为启动消费端。
        service: hzero-asgard # 用于指定asgard服务的名称
    
    	@Override
        @Transactional(rollbackFor = Exception.class)
        @Saga(code="hiam-saga-update-tenant", 
              description = "iam更新租户", 
              inputSchemaClass = Tenant.class)
        public Tenant updateTenant(Long tenantId, Tenant tenant) {
            return tenantCommonService.updateTenant(tenantId, tenant);
        }
    
        @SagaTask(code = "hiam-saga-update-tenant-receiver",
              sagaCode = "hiam-saga-update-tenant", 
              description = "接收saga更新租户消息", 
              seq = 1)
        public Tenant updateTenantReceiver(String message) throws IOException {
            Tenant tenant = objectMapper.readValue(message, Tenant.class);
            LOGGER.info("receive update tenant message success, tenant is : {}", tenant);
            return tenant;
        }
    

    开启Saga

    由于使用SagaClient通过feign调用开启Saga的方式已经过时,所以此处仅介绍使用TransactionProducer的方式开启Saga

    	@Autowired
        private TransactionalProducer producer;
    
    
    producer.apply(StartSagaBuilder.newBuilder()
                    .withSagaCode("hiam-saga-update-tenant"),
                    builder -> {
                        // 更新租户
                        hiamTenantRepository.updateByPrimaryKey(tenantInDb);
                        // 更新标准租户
                        this.updateInitOrganization(tenantInDb);
                        builder.withPayloadAndSerialize(tenantInDb);
                    }
            );
            return tenantInDb;
    

    当然我们也可以使用producer.applyAndReturn的方式实现发消息及返回结果,代码示例如下:

    return producer.applyAndReturn(StartSagaBuilder.newBuilder()
                    .withSagaCode("hiam-saga-update-tenant"),
                    builder -> {
                        // 更新租户
                        hiamTenantRepository.updateByPrimaryKey(tenantInDb);
                        // 更新标准租户
                        this.updateInitOrganization(tenantInDb);
                        builder.withPayloadAndSerialize(tenantInDb);
                        return tenantInDb;
                    }
            );
    

    至此我们就完成了使用Saga的全部操作流程。