HZERO Asgard
HZERO Asgard 是依赖于Choerodon Asgard服务进行开发的,想了解更多Saga的配置及使用信息请访问猪齿鱼官方文档(链接在下方),此处仅给出常用开发实例。
使用Saga
注意:@Saga与@SagaTask注解标记的方法所在的类必须能够被Spring扫描到
Asgard 使用示例
- 1.在项目中加入如下依赖:
 
<dependency>
    <groupId>io.choerodon</groupId>
    <artifactId>choerodon-starter-asgard</artifactId>
</dependency>
- 2.修改配置文件,在
application.yml文件中添加如下配置信息:(注意空格!) 
choerodon:
  saga:
    consumer:
      enabled: true # 配置当前服务是否作为Saga的消费端,true为启动消费端。
    service: hzero-asgard # 用于指定asgard服务的名称
- 3.在需要使用
Saga发送消息的方法上添加@Saga注解,指定code(注意code必须唯一,一般需要使用常量类来维护,这里为了能清晰的展示就不维护了),description(描述信息),inputSchemaClass(saga发送消息时传递参数的类型)。 
	@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);
    }
- 4.在需要接收
Saga发送消息参数的方法上添加@SagaTask注解,其中code为该SagaTask的唯一标识,不可重复,sagaCode需要对应@Saga注解的code,表示订阅该Saga,description为该task的描述信息,seq表示该task的执行顺序,由于同一Saga下可以存在多个task,这些task将会按照配置的seq值从小到大顺次执行。 
    @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。
- 1.在需要使用
Saga发送消息的方法所在类中注入TransactionalProducer 
	@Autowired
    private TransactionalProducer producer;
- 2.启用
Saga发送消息,以更新租户为例,可以将更新租户的代码与producer.apply()放在一个事务下。withSagaCode中传入@Saga注解对应的code中的内容,withPayloadAndSerialize传入@Saga注解定义的输入对象参数。 
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的全部操作流程。