情况是我有一个在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);
答案 0 :(得分:2)
此版本需要一些额外的信息,JwtBasedRequestContextExecutor.onBehalfOfTenant
才能正常工作。对于要操作的每个租户,都需要满足以下条件:
承租人ID。在准备好应用程序订阅时,您必须实现一个订阅回调回调端点,只要租户订阅您的应用程序,SCP就会调用该回调回调端点。 SCP调用的URL包含您可以提取的租户ID。现在,您的回调Servlet应该将这个租户ID保留在某个地方。
租户的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();
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
});
此版本已得到改进,可以更轻松地将代码作为另一个租户执行,因此,我建议尽可能升级到版本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