我尝试过几种从OnComplete AggregateMediator获取属性的方法,并将其用于ForEach Mediator的表达式支柱中,但这些方法都不成功。我也在谷歌搜索过,但一点运气都没有。
下面是我的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组
<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,日志中介程序也未执行
我试过这个:
<foreach expression="get-property('operation', 'message')" id="foreach1">WSO2EI给我看了一个错误
我尝试将OutSequence区段中的所有中介(ForEach和DBReport)迁移到InSequence区段,但它也没有工作。
求你帮帮我。任何帮助都将不胜感激。
提前谢谢。
以下是per @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}发布于 2019-08-22 04:32:57
Alhamdulillah,我已经尽力了,而且效果很好。
如何在InSequence和OutSequence之间共享消息传递(在我的示例中:从inSequence节中的聚合中介到OutSequence部分中的表达式ForEach Mediator )。
必须声明新属性,并从message属性中获取值,如下所示:
<property expression="get-property('operation', 'message')" name="rpidList" scope="default" type="OM"/>并且,在ForEach表达式中,您将给出以下代码
<foreach expression="$ctx:rpidList//rpids" id="foreach1">谢谢大家。谢谢你,StackOverflow.com
https://stackoverflow.com/questions/57555139
复制相似问题