如何在 WSO2 ESB 中创建全局变量 - 必须是可更新的

How to create a global variable in WSO2 ESB - must be updatable

我已经编写了一个 ESB 资源,它包含一个测试用例列表,如下例所示:

{
    "tests": [
          { "type": "DSS", "url": "http://localhost:8280/testsuite/general/test" },
          { "type": "ESB", "url": "http://localhost:8280/testsuite/general/test" },
          { "type": "GREG", "url": "http://localhost:8280/testsuite/general/test" },
          { "type": "GW", "url": "http://localhost:8280/testsuite/general/test" },
          { "type": "MB", "url": "http://localhost:8280/testsuite/general/test" },
          { "type": "ID", "url": "http://localhost:8280/testsuite/general/test" },
          { "type": "BOGUS", "url": "http://localhost:8280/testsuite/general/test" }
 ]
}

资源将其作为 JSON 数组并使用 XPATH 表达式 //tests/type 遍历元素并生成状态消息(200 如果它可以执行任何操作,ERR 如果没有)。

理想情况下,我希望能够将类型逐步添加到某种全局数组 属性 中,最终会变成 [DSS, ESB, GREG, GW, MB, ID, BOGUS] 这样我就可以编写一个脚本到 运行 通过这个并产生一个有效载荷到 return 如下所示:

{
  "results": [
    { "TYPE": "DSS", "STATUS": "200" },
    { "TYPE": "ESB", "STATUS": "200" },
    { "TYPE": "GREG", "STATUS": "200" },
    { "TYPE": "GW", "STATUS": "200" },
    { "TYPE": "MB", "STATUS": "200" },
    { "TYPE": "ID", "STATUS": "200" },
    { "TYPE": "BOGUS", "STATUS": "ERR" }
  ]
}

几天来我一直在寻找一种方法来做到这一点,但无济于事,所以如果根本不可能或者我一直在寻找错误的东西,我不知道但我真的很想避免生成静态资源,以便在以后的扩展中对我的参与最少。

您可以使用此脚本将有效负载保存在政府注册表中:

<script language="js"><![CDATA[
  importPackage(Packages.org.apache.synapse.config);
  mc.getConfiguration().getRegistry().newResource("gov:/trunk/Test/TestTypes",false);
  mc.getConfiguration().getRegistry().updateResource("gov:/trunk/Test/TestTypes",mc.getPayloadXML().toString());
]]></script> 
  • newResource 如果不存在则创建资源
  • 你可以使用 mc.getPayloadJSON() 而不是 mc.getPayloadXML()

带有资源 'TESTSOF' 的示例:

<root>
<value><child>1</child></value>
<value><child>2</child></value>
<value><child>3</child></value>
</root>

您可以迭代所有 "value" :

<property name="TESTSOF" expression="get-property('registry','gov:/trunk/TESTSOF')" type="OM"/>
<iterate continueParent="true" sequential="false" preservePayload="false" expression="$ctx:TESTSOF//value">
    <target>
        <sequence>
            <log level="full"/>
        </sequence>
    </target>
</iterate>

带有 JSON 的示例: 加载 JSON 作为当前消息:

<payloadFactory media-type="json">
    <format></format>
    <args>
        <arg evaluator="xml" expression="get-property('registry','gov:/trunk/Test/TestTypes')"/>
    </args>
</payloadFactory>

迭代:

<iterate continueParent="true" sequential="false" preservePayload="false" expression="//tests">
    <target>
        <sequence>
            <log level="full"/>
        </sequence>
    </target>
</iterate>