簡體   English   中英

如何在沒有發送/呼叫調解器的情況下使用聚合調解器

[英]How to use Aggregate Mediator with out send/call mediator

我們有一個用例,我們必須遍歷 json 對象數組並根據特定鍵值調用外部端點。 所以我們使用了迭代器中介器、開關中介器(以匹配條件)和聚合中介器。

<?xml version="1.0" encoding="UTF-8"?>
<api context="/propertycheck" name="propertyCheck" xmlns="http://ws.apache.org/ns/synapse">
    <resource methods="POST">
        <inSequence>
            <iterate attachPath="json-eval($)" expression="json-eval($.main)" id="testingid" preservePayload="true" sequential="true">
                <target>
                    <sequence>
                        <switch source="json-eval($.sub1)">
                            <case regex="a">
                                <log level="full" separator=","/>
                                <call>
                                    <endpoint>
                                        <http method="post" uri-template="http://localhost:3000/test">
                                            <suspendOnFailure>
                                                <initialDuration>-1</initialDuration>
                                                <progressionFactor>1</progressionFactor>
                                            </suspendOnFailure>
                                            <markForSuspension>
                                                <retriesBeforeSuspension>0</retriesBeforeSuspension>
                                            </markForSuspension>
                                        </http>
                                    </endpoint>
                                </call>
                            </case>
                            <case regex="b">
                                <log level="full" separator=","/>
                                <call>
                                    <endpoint>
                                        <http method="post" uri-template="http://localhost:3000/test">
                                            <suspendOnFailure>
                                                <initialDuration>-1</initialDuration>
                                                <progressionFactor>1</progressionFactor>
                                            </suspendOnFailure>
                                            <markForSuspension>
                                                <retriesBeforeSuspension>0</retriesBeforeSuspension>
                                            </markForSuspension>
                                        </http>
                                    </endpoint>
                                </call>
                            </case>
                            <case regex="c">
                                <log level="full" separator=","/>
                                <call>
                                    <endpoint>
                                        <http method="post" uri-template="http://localhost:3000/test">
                                            <suspendOnFailure>
                                                <initialDuration>-1</initialDuration>
                                                <progressionFactor>1</progressionFactor>
                                            </suspendOnFailure>
                                            <markForSuspension>
                                                <retriesBeforeSuspension>0</retriesBeforeSuspension>
                                            </markForSuspension>
                                        </http>
                                    </endpoint>
                                </call>
                            </case>
                            <default>
                                <log>
                                    <property name="default" value="defaultCase"/>
                                </log>
                                <payloadFactory media-type="json">
                                    <format>{
    "sub1":"My own Response"
}</format>
                                    <args/>
                                </payloadFactory>
                            </default>
                        </switch>
                    </sequence>
                </target>
            </iterate>
            <log/>
            <aggregate id="testingid">
                <correlateOn expression="json-eval($)"/>
                <completeCondition>
                    <messageCount max="-1" min="-1"/>
                </completeCondition>
                <onComplete aggregateElementType="root" expression="json-eval($)">
                    <log>
                        <property expression="json-eval($)" name="outout"/>
                    </log>
                </onComplete>
            </aggregate>
            <respond/>
        </inSequence>
        <outSequence/>
        <faultSequence/>
    </resource>
</api>

上面的用例工作正常,當調用外部端點並將響應返回到聚合中介時,但我們必須在默認情況下構建響應而不調用端點,這是如何實現的? 因為聚合中介只有在收到后端服務的響應后才會被觸發。

我們還遵循了帖子中提供的答案: WSO2 ESB,在迭代調解器中使用沒有發送/調用的聚合調解器

這似乎也不起作用,下面是根據帖子答案的實現

<?xml version="1.0" encoding="UTF-8"?>
<api context="/propertycheck" name="propertyCheck" xmlns="http://ws.apache.org/ns/synapse">
    <resource methods="POST">
        <inSequence>
            <iterate attachPath="json-eval($)" expression="json-eval($.main)" id="testingid" preservePayload="true" sequential="true">
                <target>
                    <sequence>
                        <switch source="json-eval($.sub1)">
                            <case regex="a">
                                <log level="full" separator=","/>
                                <call>
                                    <endpoint>
                                        <http method="post" uri-template="http://localhost:3000/test">
                                            <suspendOnFailure>
                                                <initialDuration>-1</initialDuration>
                                                <progressionFactor>1</progressionFactor>
                                            </suspendOnFailure>
                                            <markForSuspension>
                                                <retriesBeforeSuspension>0</retriesBeforeSuspension>
                                            </markForSuspension>
                                        </http>
                                    </endpoint>
                                </call>
                            </case>
                            <case regex="b">
                                <log level="full" separator=","/>
                                <call>
                                    <endpoint>
                                        <http method="post" uri-template="http://localhost:3000/test">
                                            <suspendOnFailure>
                                                <initialDuration>-1</initialDuration>
                                                <progressionFactor>1</progressionFactor>
                                            </suspendOnFailure>
                                            <markForSuspension>
                                                <retriesBeforeSuspension>0</retriesBeforeSuspension>
                                            </markForSuspension>
                                        </http>
                                    </endpoint>
                                </call>
                            </case>
                            <case regex="c">
                                <log level="full" separator=","/>
                                <call>
                                    <endpoint>
                                        <http method="post" uri-template="http://localhost:3000/test">
                                            <suspendOnFailure>
                                                <initialDuration>-1</initialDuration>
                                                <progressionFactor>1</progressionFactor>
                                            </suspendOnFailure>
                                            <markForSuspension>
                                                <retriesBeforeSuspension>0</retriesBeforeSuspension>
                                            </markForSuspension>
                                        </http>
                                    </endpoint>
                                </call>
                            </case>
                            <default>
                                <log>
                                    <property name="default" value="defaultCase"/>
                                </log>
                                <payloadFactory media-type="json">
                                    <format>{
    "sub1":"My own Response"
}</format>
                                    <args/>
                                </payloadFactory>
                                <property name="RESPONSE" scope="default" type="STRING" value="true"/>
                                <sequence key="AggregateSequence"/>
                            </default>
                        </switch>
                    </sequence>
                </target>
            </iterate>
            <log/>
            <aggregate id="testingid">
                <correlateOn expression="json-eval($)"/>
                <completeCondition>
                    <messageCount max="-1" min="-1"/>
                </completeCondition>
                <onComplete aggregateElementType="root" expression="json-eval($)">
                    <log>
                        <property expression="json-eval($)" name="outout"/>
                    </log>
                </onComplete>
            </aggregate>
            <respond/>
        </inSequence>
        <outSequence/>
        <faultSequence/>
    </resource>
</api>

聚合序列

<?xml version="1.0" encoding="UTF-8"?>
<sequence name="AggregateSequence" statistics="enable" trace="enable" xmlns="http://ws.apache.org/ns/synapse">
    <log>
        <property expression="json-eval($)" name="request to mediator"/>
    </log>
    <aggregate id="testingid">
        <correlateOn expression="json-eval($)"/>
        <completeCondition>
            <messageCount max="-1" min="-1"/>
        </completeCondition>
        <onComplete aggregateElementType="root" expression="json-eval($)">
            <log>
                <property expression="json-eval($)" name="inside Aggregator"/>
            </log>
        </onComplete>
    </aggregate>
</sequence>

要求

{
    "main":[
        {
            "sub1":"a"
        },
        {
            "sub1":"b"
        },
        {
            "sub1":"c"
        },
        {
            "sub1":"d"
        }
    ]
}

任何幫助表示贊賞。 謝謝

當沒有調用后端時,認為我有完全相同的問題。 不確定它是否在文檔中有說明,無論如何我在不應該進行后端調用時調用本地“echo”EI/ESB 服務“解決了這個問題。

這是我如何解決它的片段。

        <iterate xmlns:m0="http://ws.wso2.org/dataservice" expression="$body//m0:Entry" id="iteratorID" sequential="true">
            <target>
                <sequence>
                    <filter xpath="contains(get-property('schedulerHour'), get-property('currentHour')) and (contains($ctx:schedulerMinutes, $ctx:currentMinute))">
                       <then>
                        .... real backend should be called...
                          <call>
                            <endpoint>
                                <http uri-template="https://someURL"/>
                            </endpoint>
                        </call>
                          ....
                       </then>
                    <else>
                          .... fake backend call...
                          <payloadFactory media-type="xml">
                            <format>
                                <p:echoInt xmlns:p="http://echo.services.core.carbon.wso2.org">
                                    <in>123</in>
                                </p:echoInt>
                            </format>
                            <args/>
                        </payloadFactory>
                        <call>
                            <endpoint>
                                <http method="POST" uri-template="http://localhost:8280/services/echo"/>
                            </endpoint>
                        </call>
                        .....
                    </else>
                </filter>
            </sequence>
        </target>
    </iterate>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM