使用 RequestContextExecutor 的租户感知后台任务?
Tenant aware background task with RequestContextExecutor?
我正在 SAP SCP Neo 上开发一个 Java 应用程序,它使用 S/4 SDK 进行平台抽象。我正在努力创建租户感知的后台任务。这意味着,当使用 S/4SDK 平台抽象方法(如 com.sap.cloud.sdk.cloudplatform.tenant.TenantAccessor 或 DestinationAccessor 访问租户信息或检索目的地时,这些方法应 return 租户特定信息,就好像一个会从典型的租户特定 Web 请求调用它们。
当调用 S/4SDK 访问器方法时,我用一个可调用对象包装它们并用 RequestContextExecutor 执行它。这工作正常,但由于我看不到任何提供租户的方法,我不清楚如何解决我的问题。我看到 S/4 SDK 中使用了默认侦听器,因此我假设它在提供商帐户的上下文中是 运行。请在下方找到检索目的地的示例。
Destination getDestination(String destinationName) {
// Request Context is present when action is triggered by a web request
if (RequestContextAccessor.getCurrentRequest().isPresent()){
return DestinationAccessor.getDestination(destinatioName);
}
// Use RequestContextExecutor if we are called from a background task
Callable<Destination> callable = new Callable<Destination>() {
@Override
public Destination call() {
return DestinationAccessor.getDestination(destinatioName);
}
};
// TODO this defaults the contexts to the provider account.
return new RequestContextExecutor().execute(callable);
}
动机:
- 我们喜欢一次编写一些逻辑,如果它被针对 java 应用程序的 Web 请求调用或由后台 java 任务触发,它应该独立工作。
在 SAP CP Neo 上使用 RequestContextExecutor 时,这将 return 依赖于您正确注意到的提供商租户。
目前,S/4 SDK 不提供代表其他租户执行代码的通用方式。这主要是由于租户信息在 SAP CP 环境中的表示方式不同。例如,在 Cloud Foundry 上,租户被编码为 JSON Web 令牌中 "zid" 字段的一部分。因此,代表不同租户进行 运行 编码是很棘手的。因此,在 SAP CP Cloud Foundry 上,您实际上不会回退到提供商租户。
不过,对于 SAP CP Neo,我希望您能够使用以下方法,以便 运行 一个 Callable
基于另一个租户的上下文。然后,这应该允许您在相应 Callable
.
的上下文中按预期检索当前租户
ScpNeoTenant currentTenant = (ScpNeoTenant)TenantAccessor.getCurrentTenant();
TenantContext currentTenantContext = currentTenant.getTenantContext();
currentTenantContext.execute("anotherTenantId", new Callable<MyResult>() {
@Override
public MyResult call() {
return new RequestContextExecutor().execute(new Callable<MyResult>() {
@Override
public MyResult call() {
Tenant tenant = TenantAccessor.getCurrentTenant();
// ...
return myResult;
}
});
}
});
我还没有测试过,所以如果可行请告诉我!
我正在 SAP SCP Neo 上开发一个 Java 应用程序,它使用 S/4 SDK 进行平台抽象。我正在努力创建租户感知的后台任务。这意味着,当使用 S/4SDK 平台抽象方法(如 com.sap.cloud.sdk.cloudplatform.tenant.TenantAccessor 或 DestinationAccessor 访问租户信息或检索目的地时,这些方法应 return 租户特定信息,就好像一个会从典型的租户特定 Web 请求调用它们。
当调用 S/4SDK 访问器方法时,我用一个可调用对象包装它们并用 RequestContextExecutor 执行它。这工作正常,但由于我看不到任何提供租户的方法,我不清楚如何解决我的问题。我看到 S/4 SDK 中使用了默认侦听器,因此我假设它在提供商帐户的上下文中是 运行。请在下方找到检索目的地的示例。
Destination getDestination(String destinationName) {
// Request Context is present when action is triggered by a web request
if (RequestContextAccessor.getCurrentRequest().isPresent()){
return DestinationAccessor.getDestination(destinatioName);
}
// Use RequestContextExecutor if we are called from a background task
Callable<Destination> callable = new Callable<Destination>() {
@Override
public Destination call() {
return DestinationAccessor.getDestination(destinatioName);
}
};
// TODO this defaults the contexts to the provider account.
return new RequestContextExecutor().execute(callable);
}
动机:
- 我们喜欢一次编写一些逻辑,如果它被针对 java 应用程序的 Web 请求调用或由后台 java 任务触发,它应该独立工作。
在 SAP CP Neo 上使用 RequestContextExecutor 时,这将 return 依赖于您正确注意到的提供商租户。
目前,S/4 SDK 不提供代表其他租户执行代码的通用方式。这主要是由于租户信息在 SAP CP 环境中的表示方式不同。例如,在 Cloud Foundry 上,租户被编码为 JSON Web 令牌中 "zid" 字段的一部分。因此,代表不同租户进行 运行 编码是很棘手的。因此,在 SAP CP Cloud Foundry 上,您实际上不会回退到提供商租户。
不过,对于 SAP CP Neo,我希望您能够使用以下方法,以便 运行 一个 Callable
基于另一个租户的上下文。然后,这应该允许您在相应 Callable
.
ScpNeoTenant currentTenant = (ScpNeoTenant)TenantAccessor.getCurrentTenant();
TenantContext currentTenantContext = currentTenant.getTenantContext();
currentTenantContext.execute("anotherTenantId", new Callable<MyResult>() {
@Override
public MyResult call() {
return new RequestContextExecutor().execute(new Callable<MyResult>() {
@Override
public MyResult call() {
Tenant tenant = TenantAccessor.getCurrentTenant();
// ...
return myResult;
}
});
}
});
我还没有测试过,所以如果可行请告诉我!