使用 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);
}

动机:

在 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;
            }
        });
    }
});

我还没有测试过,所以如果可行请告诉我!