在 WSDL 中介 WSO2 中为 URI 使用变量

Posted

技术标签:

【中文标题】在 WSDL 中介 WSO2 中为 URI 使用变量【英文标题】:Use variables for URI in WSDL mediators WSO2 【发布时间】:2020-07-27 05:40:16 【问题描述】:

我正在重构一个 wso2 项目,我想知道如何/是否可以执行以下操作。该项目旨在将数据发送到 SOAP Api。在每个环境中,此 API 都会公开一个 .wsdl 文件,并且 URL 和凭据是从一个环境到另一个环境的唯一变化。最自然的事情就是这样

Registry和中创建 像这样在作业开始时加载它
<propertyGroup>
  <property expression="get-property('registry', 'gov:/endpoints/sap_constructionSiteUser')" name="sap_constructionSiteUser" scope="default" type="STRING"/>
  <property expression="get-property('registry', 'gov:/endpoints/sap_constructionSitePassword')" name="sap_constructionSitePassword" scope="default" type="STRING"/>
  <property expression="get-property('registry', 'gov:/endpoints/sap_constructionSiteUrl')" name="uri.var.sap_constructionSiteUrl" scope="default" type="STRING"/>
</propertyGroup>

但我找不到在端点定义中使用此uri.var.sap_constructionSiteUrl直接方法。以下不起作用

<call>
  <endpoint>
     <wsdl optimize="mtom" uri="uri.var.sap_constructionSiteUrl" port="OUVERTURE_CHANTIER" service="OUVERTURE_CHANTIER" statistics="enable">
       <suspendOnFailure>
       <initialDuration>-1</initialDuration>
       <progressionFactor>-1</progressionFactor>
       <maximumDuration>0</maximumDuration>
       </suspendOnFailure>
       <markForSuspension>
       <retriesBeforeSuspension>0</retriesBeforeSuspension>
       </markForSuspension>
     </wsdl>
  </endpoint>
</call>

看起来uri= 只接受普通值。有没有一种方法可以在不将整个端点写入Registry 的情况下实现动态化(重点是让客户保持简单)

[环境]

wso2ei 6.5.0

====================编辑=================== =====

我刚刚创建了一个模板:

<template name="crm4sap-constructionSiteTemplate" xmlns="http://ws.apache.org/ns/synapse">
    <axis2ns488:parameter name="port" xmlns:axis2ns488="http://ws.apache.org/ns/synapse"/>
    <axis2ns489:parameter name="service" xmlns:axis2ns489="http://ws.apache.org/ns/synapse"/>
    <axis2ns490:parameter name="uri" xmlns:axis2ns490="http://ws.apache.org/ns/synapse"/>
    <endpoint name="$name">
        <wsdl port="$port" service="$service" uri="$uri">
            <suspendOnFailure>
                <initialDuration>-1</initialDuration>
                <progressionFactor>1.0</progressionFactor>
            </suspendOnFailure>
            <markForSuspension>
                <retriesBeforeSuspension>0</retriesBeforeSuspension>
            </markForSuspension>
        </wsdl>
    </endpoint>
</template>

我用它来称呼它

<call>
  <endpoint name="constructionSiteEndpoint" template="crm4sap-constructionSiteTemplate">
    <axis2ns468:parameter name="port" value="OUVERTURE_CHANTIER" xmlns:axis2ns468="http://ws.apache.org/ns/synapse"/>
    <axis2ns469:parameter name="service" value="OUVERTURE_CHANTIER" xmlns:axis2ns469="http://ws.apache.org/ns/synapse"/>
    <axis2ns469:parameter name="uri" value="$ctx:sap_constructionSiteUrl" xmlns:axis2ns469="http://ws.apache.org/ns/synapse"/>
  </endpoint>
</call>

变量替换似乎没有发生:

[2020-04-15 12:30:54,032] []  WARN - TemplateEndpointFactory Could not read the WSDL endpoint $ctx:sap_constructionSiteUrl
java.net.MalformedURLException: no protocol: $ctx:sap_constructionSiteUrl
        at java.net.URL.<init>(URL.java:600)
        at java.net.URL.<init>(URL.java:497)
        at java.net.URL.<init>(URL.java:446)

看起来像common problem

【问题讨论】:

【参考方案1】:

您可以尝试将此端点模板化,然后使用参数调用模板。您可以在运行时将动态值传递给模板。 https://docs.wso2.com/display/EI650/Endpoint+Template

【讨论】:

【参考方案2】:

我能够按顺序使用以下代码来做到这一点:

 <call-template target="template-for-calling-soap">
        <with-param name="url" value="get-property('soap-uri')"/>
 </call-template>

soap-uri 是一个本地条目或简单属性,名为 template-for-calling-soap 的序列模板将 url 值作为参数,代码如下:

<template name="template-for-calling-soap" 
xmlns="http://ws.apache.org/ns/synapse">
    <parameter name="url"/>
    <sequence>
       <property expression="$func:url" name="uri.var" scope="default" 
        type="STRING"/>
       <send>
            <endpoint>
                <address format="soap11" uri="$uri.var"/>
            </endpoint>
       </send>
    </sequence>
</template>

【讨论】:

以上是关于在 WSDL 中介 WSO2 中为 URI 使用变量的主要内容,如果未能解决你的问题,请参考以下文章

如何在 WSO2 ESB 中访问注册表

使用聚合消息*(没有continueParent)聚合*后退出迭代中介 - WSO2

可以在wso2 esb或ei中缓存中介组相同的请求吗?

WSO2 ESB PayloadFactory 中介器中的 JSON 格式

WSO2 - 如何让调用中介忽略有效负载(比如它是空的,甚至不是空的)?

任何人都可以解释下面wso2 esb synapse.xml文件的语法和功能。消息中介发生了