如何在SCP multitanant应用程序中获取订户的目的地

时间:2019-07-30 07:23:23

标签: sap-cloud-sdk

情况是我有一个在SCP上运行的multitanant应用程序。一些客户将订阅我的应用。他们将为外部系统定义自己的目的地。我已经建立了can-connector。另一件事是我的应用程序没有请求上下文,它只是基于计划任务。

Env:SCP Cloudfoundry

我已尝试成功从提供方获取目的地。但是在订阅者方面失败了。

下面的代码段是我到达目的地的方式

    log.info("==========Begin logic to get destination==========");
    Callable<Destination> callable = new Callable<Destination>() {
      @Override
      public Destination call() throws Exception {
        DestinationAccessor
            .setRetrievalStrategy("xxx", DestinationRetrievalStrategy.ALWAYS_SUBSCRIBER);
        return DestinationAccessor.getDestination("xxx");
      }
    };
    return new RequestContextExecutor().execute(callable);

1 个答案:

答案 0 :(得分:2)

对于SAP Cloud SDK版本2:

此版本需要一些额外的信息,JwtBasedRequestContextExecutor.onBehalfOfTenant才能正常工作。对于要操作的每个租户,都需要满足以下条件:

  1. 承租人ID。在准备好应用程序订阅时,您必须实现一个订阅回调回调端点,只要租户订阅您的应用程序,SCP就会调用该回调回调端点。 SCP调用的URL包含您可以提取的租户ID。现在,您的回调Servlet应该将这个租户ID保留在某个地方。

  2. 租户的XSUAA实例的完全限定URI。您还可以从订阅回调端点中获得部分信息。 SCP使用包含有效值subscribedSubdomain的JSON有效负载调用您的端点。您的回调Servlet现在应该将其与租户ID一起保留在某个地方。这样可以处理主机名部分,但是JwtBasedRequestContextExecutor需要完整的XSUAA URI(例如https://[subscribedSubdomain].[uaadomain])。一种方法是获取提供者的XSUAA信息并使用uaadomain提取VCAP_SERVICES参数(基本上是从CloudPlatformAccessor加载),如下所示:

    final String tenantXsuaaUri = "https://" + subscribedSubdomain + "." + ((ScpCfCloudPlatform)CloudPlatformAccessor.getCloudPlatform()).getXsuaaServiceCredentials().get("uaadomain").getAsString();
    
  3. 提供程序的XSUAA实例的
  4. XS应用程序名称。为此,您可以像这样使用CloudPlatformAccessor(再次从VCAP_SERVICES加载):

    final String xsAppName = ((ScpCfCloudPlatform)CloudPlatformAccessor.getCloudPlatform()).getXsAppName();
    

一旦您终于拥有了所有需要的参数,就可以像这样租用JwtBasedRequestContextExecutor.onBehalfOfTenant来运行所需的租户:

new JwtBasedRequestContextExecutor()
    .onBehalfOfTenant(tenantId, tenantXsuaaUri, Collections.singletonList(xsAppName))
    .withParentRequestContext()
    .execute(() -> {

    // your code goes here

});



对于SAP Cloud SDK版本3:

此版本已得到改进,可以更轻松地将代码作为另一个租户执行,因此,我建议尽可能升级到版本3。在版本3中,您仅需要租户ID和subscribedSubdomain值(无需形成完整的XSUAA URI)。代替JwtBasedRequestContextExecutor,您可以使用TenantAccessor类和executeWithTenant方法,如下所示:

final Tenant subscribedTenant = new ScpCfTenant(tenantID, subscribedSubdomain);

TenantAccessor.executeWithTenant(subscribedTenant, () -> {

    // your code goes here

});


SAP Cloud SDK版本3概述: https://blogs.sap.com/2019/08/01/version-3-of-the-sap-cloud-sdk-for-java-is-here/

第3版迁移指南: https://blogs.sap.com/2019/08/01/migrate-to-version-3.0.0-of-the-sap-cloud-sdk-for-java/

第3版发行说明: https://help.sap.com/doc/6c02295dfa8f47cf9c08a19f2e172901/1.0/en-US/index.html