HZERO Asgard
HZERO Asgard
是依赖于Choerodon Asgard
服务进行开发的,想了解更多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
的全部操作流程。