wso2 - 如何从 RESTful API WSO2EI 6.2.0 中的 OnComplete AggregateMediator 获取属性?
问题描述
我尝试了几种方法从 OnComplete AggregateMediator 获取属性并将其用于 ForEach 调解器的 Expression 道具,但这些都没有成功。我也在谷歌搜索过,但一点运气都没有。
这是我的 RESTful API(短模式):
这是 inSequence 部分
<api xmlns="http://ws.apache.org/ns/synapse" context="/path/to/context" name="NamedAPI">
<resource methods="POST" protocol="http">
<inSequence>
<property expression="count(//parameter/objects)" name="count" scope="default" type="STRING"/>
<iterate expression="//parameter/objects" id="iterate1" sequential="true">
<target>
<sequence>
<property expression="//objects/text()" name="element1" scope="default" type="STRING"/>
<sequence key="getIdOfElement1"/>
<property expression="json-eval($.result.id)" name="el1id" scope="default" type="STRING"/>
<payloadFactory media-type="xml">
<format>
<ids xmlns="">
<id>$1</id>
</ids>
</format>
<args>
<arg evaluator="xml" expression="get-property('el1id')"/>
</args>
</payloadFactory>
</sequence>
</target>
</iterate>
<aggregate id="iterate1">
<completeCondition timeout="10">
<messageCount max="-1" min="{get-property('count')}"/>
</completeCondition>
<onComplete expression="//ids">
<property expression="$body" name="message" scope="operation" type="OM"/>
</onComplete>
</aggregate>
<payloadFactory media-type="xml">
<format>
<result xmlns="">$1</result>
</format>
<args>
<arg evaluator="xml" expression="get-property('operation','message')"/>
</args>
</payloadFactory>
<send>
<endpoint key="NamedEP"/>
</send>
</inSequence>
这是 OutSequence 部分:
<outSequence>
<property expression="get-property('operation', 'message')" name="IDs"/>
<log level="custom">
<property expression="//ids" name="========== LIST IDs =========="/>
</log>
<foreach expression="//ids" id="foreach1">
<sequence>
<log level="custom">
<property expression="//id" name="========== ID =========="/>
</log>
<log level="full"/>
<dbreport>
<connection>
<pool>
<dsName>A_DS</dsName>
</pool>
</connection>
<statement>
<sql>INSERT INTO "table" ("field1", "id") VALUES (?,?)</sql>
<parameter expression="get-property('field1')" type="VARCHAR"/>
<parameter expression="//id" type="INTEGER"/>
</statement>
</dbreport>
</sequence>
</foreach>
<payloadFactory media-type="json">
<format>
[{ "field1" : "$1" }]
</format>
<args>
<arg evaluator="xml" expression="get-property('field1')"/>
</args>
</payloadFactory>
<property name="messageType" scope="axis2" type="STRING" value="application/json"/>
<property expression="json-eval($.)" name="response" scope="default" type="STRING"/>
<send/>
</outSequence>
这是故障序列部分
<faultSequence>
<payloadFactory media-type="json">
<format>
[{ "fault" : { "responsecode" : "999", "responsedesc" : "General error", "errordetails" : "$1" } }]
</format>
<args>
<arg evaluator="xml" expression="$ctx:ERROR_MESSAGE"/>
</args>
</payloadFactory>
<respond/>
<send/>
</faultSequence>
</resource>
</api>
我试过这个:
<foreach expression="//ids" id="foreach1">
这没用。DBReport 未在 ForEach Mediator 中执行,Log Mediator 也是如此
我试过这个:
<foreach expression="get-property('operation', 'message')" id="foreach1">
WSO2EI 显示错误
我试图将 OutSequence 部分中的所有调解器(ForEach 和 DBReport)移动到 InSequence 部分,但它也不起作用。
请帮我。任何帮助将不胜感激。
提前致谢。
这是根据@Arunan 的评论的日志
TID: [-1234] [] [2019-08-21 10:00:06,176] INFO {org.apache.synapse.mediators.builtin.LogMediator} - ========== START COUNTER ========== = 1 {org.apache.synapse.mediators.builtin.LogMediator}
TID: [-1234] [] [2019-08-21 10:00:06,176] INFO {org.apache.synapse.mediators.builtin.LogMediator} - ========== START ITERATE NO : = 2.0 {org.apache.synapse.mediators.builtin.LogMediator}
TID: [-1234] [] [2019-08-21 10:00:06,177] INFO {org.apache.synapse.mediators.builtin.LogMediator} - ========== NIP FROM ITERATE : = 198910202001020001 {org.apache.synapse.mediators.builtin.LogMediator}
TID: [-1234] [] [2019-08-21 10:00:06,180] INFO {org.apache.synapse.mediators.builtin.LogMediator} - ========== START ITERATE NO : = 2.0 {org.apache.synapse.mediators.builtin.LogMediator}
TID: [-1234] [] [2019-08-21 10:00:06,181] INFO {org.apache.synapse.mediators.builtin.LogMediator} - ========== NIP FROM ITERATE : = 199509142005010001 {org.apache.synapse.mediators.builtin.LogMediator}
TID: [-1234] [] [2019-08-21 10:00:06,230] INFO {org.apache.synapse.mediators.builtin.LogMediator} - ========== RPID FROM SEQUENCE IN ITERATE ========== = 3 {org.apache.synapse.mediators.builtin.LogMediator}
TID: [-1234] [] [2019-08-21 10:00:06,230] INFO {org.apache.synapse.mediators.builtin.LogMediator} - ========== RPID FROM SEQUENCE IN ITERATE ========== = 1 {org.apache.synapse.mediators.builtin.LogMediator}
TID: [-1234] [] [2019-08-21 10:00:06,262] INFO {org.apache.synapse.mediators.builtin.LogMediator} - ========== EXIST RICE DOCUMENT ========== = 0 {org.apache.synapse.mediators.builtin.LogMediator}
TID: [-1234] [] [2019-08-21 10:00:06,348] INFO {org.apache.synapse.mediators.builtin.LogMediator} - ========== LIST RPIDs ========== = {org.apache.synapse.mediators.builtin.LogMediator}
解决方案
Alhamdulillah,我已经尽力了,而且效果很好。
如何在 InSequence 和 OutSequence 之间共享消息(在我的例子中:从 inSequence 部分中的 Aggregate Mediator 到 OutSequence 部分中的 Expression ForEach 中介者)。
您必须声明新属性,并从消息属性中获取值,例如:
<property expression="get-property('operation', 'message')" name="rpidList" scope="default" type="OM"/>
并且,在 ForEach 表达式中,您在下面给出代码
<foreach expression="$ctx:rpidList//rpids" id="foreach1">
谢谢大家。谢谢你StackOverflow.com
推荐阅读
- java - 为 Firebase 实时数据库读取操作实现“失败状态”
- c# - 使用输入框过滤 asp.net core razor with dapper
- java - How to call variables from another class
- python - 我应该在整个程序中多次打开同一个文件吗?
- python - ERROR: Twisted-20.3.0-cp39-cp39-win_amd64.whl is not a supported wheel on this platform
- docker - 如何在docker上集成rabbitmq和prometheus
- typescript - 如何键入没有可选参数的函数变体 - 使用映射元组
- java - SharedPreference 在一个单独的类中?
- mysql - 通过 Internet 连接将数据发送到 MySQL 服务器
- linux - 需要为带有 VFP 支持的 arm 构建 libxml2