WSO2-错误使用Clone Mediator将消息发送到端点

时间:2014-01-29 12:24:24

标签: proxy jms wso2 clone

我正在研究调用许多其他DSS服务的WSO2代理服务。我的要求是将其中一个DSS服务的响应发送到jms队列,同时继续代理服务中的现有流程,即继续调用和处理其他DSS服务。

我需要获得Simple Product Service的响应(序列密钥-if4_simpleProduct)并将其发送回队列,但之后继续使用放置在代理服务和序列中的逻辑。我尝试使用CLONE Mediator。但是我的prxy服务流程在进入CLONE Meditaor流程后停止了。以下是代理服务和序列的代码段。

    <?xml version="1.0" encoding="UTF-8"?>
<proxy xmlns="http://ws.apache.org/ns/synapse" name="SPE_Payload"
    transports="jms" startOnLoad="true" trace="enable">
    <description />
    <target>
        <inSequence>
            <transaction action="new" />
            <xslt key="StepToCommon" />
            <log level="full" />
            <enrich>
                <source type="body" clone="true" />
                <target type="property" property="MSG_PAYLOAD" />
            </enrich>

            <sequence key="if4_simpleProduct" />

            <filter xpath="boolean (//product/simpleProduct/altPrdCodes/pn_apc_id/text())">
                <enrich>
                    <source clone="true" xpath="//product/simpleProduct/altPrdCodes" />
                    <target type="property" property="ALT_PRDS" />
                </enrich>
                <sequence key="if4_alternateProducts" />
            </filter>
....
.....

<transaction action="commit" />
        </inSequence>

    </target>
    <parameter name="transport.jms.ContentType">application/xml</parameter>
    <parameter name="transport.jms.Destination">test</parameter>
</proxy>

以下是调用简单产品服务时序列的代码

<sequence xmlns="http://ws.apache.org/ns/synapse" name="if4_simpleProduct"
    onError="myErrorHandlerSeq">
    <payloadFactory>
        <format>
            <p:O_SimpleProduct xmlns:p="http://ws.wso2.org/dataservice">
                <p:PC_STEP_SKU_ID>$1</p:PC_STEP_SKU_ID>
                </p:O_SimpleProduct>
        </format>
        <args>
            <arg xmlns:m="http://wso2.org/services/product" evaluator="xml"
                expression="//product/simpleProduct/step_id/text()" />
        </args>
    </payloadFactory>
    <header name="Action" value="urn:O_SimpleProduct" />
    <callout serviceURL="local://localhost/services/productEnrichment"
        action="urn:O_SimpleProduct" useServerConfig="true">
        <source xmlns:ns="http://org.apache.synapse/xsd" xpath="$body/child::*[fn:position()=1]" />
        <target xmlns:ns="http://org.apache.synapse/xsd" xpath="$body/child::*[fn:position()=1]" />
    </callout>
    <clone sequential="false">
<property name="RESPONSE" value="true" />
    <header name="To" action="remove" />
      <target>
      <endpoint>
            <address
                uri="jms:/step.IF04Output?transport.jms.ConnectionFactoryJNDIName=QueueConnectionFactory&amp;java.naming.factory.initial=org.apache.activemq.jndi.ActiveMQInitialContextFactory&amp;java.naming.provider.url=tcp://localhost:61616&amp;transport.jms.DestinationType=queue" />
        </endpoint>
        </target>

      <target>
    <filter xmlns:ns="http://org.apache.synapse/xsd" xmlns:ds="http://wso2.org/services/product"
        source="//ds:result/ds:set/ds:PC_STATUS/text()" regex="0">
        <then>
            <log level="custom">
                <property name="STATUS"
                    value="************DONE INSERTING SIMPLE ATTRIBUTES***************" />
            </log>
        </then>
        <else>
            <log level="full" category="ERROR">
                <property name="STATUS"
                    value="************ERROR OCCURED WHILE INSERTING SIMPLE ATTRIBUTES. ROLLBACKING THE TRANSACTION***************" />
                <property name="PC_RP_ID" expression="get-property('GEN_RP_ID')" />
            </log>
            <transaction action="rollback" />
            <drop />
        </else>
    </filter>
    <property xmlns:ds="http://wso2.org/services/product" name="GEN_RP_ID"
        expression="//ds:result/ds:set/ds:PC_RP_ID/text()" />
    <enrich>
        <source type="property" clone="true" property="MSG_PAYLOAD" />
        <target type="body" />
    </enrich>
    </target>
</clone>
</sequence>

自从过去两天以来,我一直在努力解决这个问题。试过在几个地方唱克隆勋章。但它不起作用。你能否尽快提供你的建议,因为我明天有一个演示,我需要解决它:(

干杯, Aanchal

1 个答案:

答案 0 :(得分:0)

我认为这是你正在努力的部分;

<callout serviceURL="local://localhost/services/productEnrichment"
        action="urn:O_SimpleProduct" useServerConfig="true">
        <source xmlns:ns="http://org.apache.synapse/xsd" xpath="$body/child::*[fn:position()=1]" />
        <target xmlns:ns="http://org.apache.synapse/xsd" xpath="$body/child::*[fn:position()=1]" />
    </callout>
    <clone sequential="false">
<property name="RESPONSE" value="true" />
    <header name="To" action="remove" />
      <target>
      <endpoint>
            <address
                uri="jms:/step.IF04Output?transport.jms.ConnectionFactoryJNDIName=QueueConnectionFactory&amp;java.naming.factory.initial=org.apache.activemq.jndi.ActiveMQInitialContextFactory&amp;java.naming.provider.url=tcp://localhost:61616&amp;transport.jms.DestinationType=queue" />
        </endpoint>
        </target>

由于您的要求是从DS服务之一获得响应并将其发送到队列..我认为它失败了,因为您要删除“To”标题。在克隆调解器的“{{3}”中使用标注调解器发送到JMS队列之后的配置将消息放在那里。在另一个目标中,定义你的其余逻辑..