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

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

本文关键字:可更新 全局变量 WSO2ESB 创建      更新时间:2023-09-26

我已经编写了一个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],这样我就可以编写一个脚本来运行它,并生成一个有效负载来返回如下内容:

{
  "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>

您可以使用对所有"值"进行iter

<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>$1</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>