骡子3异步回复

时间:2012-07-11 15:58:24

标签: mule

我有一个流程,我通过webservice接收请求。我使用组件绑定将该请求转发到JMS队列。但是,我想从该队列中获取异步回复并将其用作对Web服务的响应。我是否需要在流程中使用reply-to和async-reply-router?或者在Mule 3中有没有其他方法可以做到这一点?有什么指针吗?

<flow name="mviService">
    <http:inbound-endpoint address="http://localhost:62005/mvi"
        exchange-pattern="request-response">
        <cxf:jaxws-service serviceClass="com.xyz.services.mvi.MVIServicePortType" />
    </http:inbound-endpoint>
    <component class="com.pennmutual.services.mvi.MVIServiceImpl">
        <binding interface="com.pennmutual.mvi.helper.XMLReqProcessorInterface"
            method="process121Order">
            <jms:outbound-endpoint queue="mviq.121.order" />
        </binding>
            </component>

            <async-reply>

            </async-reply>

      </flow>

============编辑 - 请参阅以下重新构思的问题=================

我认为我在描述场景方面做得不好。让我再尝试一次。这是场景 -

  1. 客户端调用此流程“mviService”中描述的服务。 mviService通过基于HTTP / SOAP的入站端点获取XML请求。我们将此请求称为XML121Request.4
  2. MVI“com.xyz.services.mvi.MVIServiceImpl”中定义的组件在XML121Request中进行了一些更改。
  3. 将此XML121转发到JMS队列“mviq.121.order”。它使用组件绑定。
  4. 此JMS队列的出站端点是转发此请求的第三方Web服务。第三方确认收到XML121和同步Web服务调用返回。
  5. 该第三方服务的响应是在稍后的时间点发出的,通常是几秒钟。响应是异步的。第三方在MVI上调用另一个Web服务端点并发送XML121Response。
  6. MVI将此响应放在名为“mviq.async.service.reply”的JMS队列中。
  7. “mviService”流程需要等待此响应并将此响应(经过一些修改后)发送给调用者(在步骤1中)。
  8. 我能够从第三方获得响应,并且此响应被命名为名为“mviq.async.service.reply”的队列。我想使用/使用此消息并将其作为对第一次调用MVI的响应返回。

    我正在尝试使用“请求回复”。

        <request-reply timeout="60000">
            <vm:outbound-endpoint path="request" />
            <jms:inbound-endpoint queue="mviq.async.service.reply"
                exchange-pattern="one-way" />
        </request-reply>
    

    问题在于,即使我不想在这种情况下使用出站端点,我仍然必须放置一个,因为request-reply标签需要它。流程在那个时间点等待60秒,但即使我在队列中放入了“mviq.async.service.reply”,相关ID也不匹配,因此服务超时并返回错误。

    流程如下所述。

    <flow name="mviService">
        <http:inbound-endpoint address="http://localhost:62005/mvi"
            exchange-pattern="request-response">
            <cxf:jaxws-service serviceClass="com.xyz.services.mvi.MVIServicePortType" />
        </http:inbound-endpoint>
        <component class="com.pennmutual.services.mvi.MVIServiceImpl">
            <binding interface="com.xyz.mvi.helper.XMLReqProcessorInterface"
                method="process121Order">
                <jms:outbound-endpoint queue="mviq.121.order" />
            </binding>
        </component>
    
        <!-- <logger message="XML Correlation ID 1 is #[mule:message.headers(all)]" /> -->
        <request-reply timeout="60000">
            <vm:outbound-endpoint path="request" /> <!-- we don't care about this -->
            <jms:inbound-endpoint queue="mviq.async.service.reply"
                exchange-pattern="one-way" />
        </request-reply>
            <!-- <component class="com.xyz.mvi.CreateMVIServiceResponse"/> -->
    </flow>
    

    ===== FLOW与REPLY TO =============

    <flow name="mviService">
        <http:inbound-endpoint address="http://localhost:62005/mvi"
            exchange-pattern="request-response">
            <cxf:jaxws-service serviceClass="com.xyz.services.mvi.MVIServicePortType" />
        </http:inbound-endpoint>
        <component class="com.xyz.services.mvi.MVIServiceImpl">
            <binding interface="com.xyz.mvi.helper.XMLReqProcessorInterface"
                method="process121Order">
                <jms:outbound-endpoint queue="mviq.121.order" exchange-pattern="request-response">
                    <message-properties-transformer scope="outbound">
                        <add-message-property key="MULE_REPLYTO" value="mviq.async.service.reply" />
                    </message-properties-transformer>
                </jms:outbound-endpoint>
            </binding>
         </component>
    </flow>
    

1 个答案:

答案 0 :(得分:2)

我建议您不要创建服务组件类,而是使用cxf:proxy-service,这将使您可以直接访问SOAP信封,并有机会以XML级别的方式组装响应

这将使您摆脱服务组件类对您施加的约束,因此无需使用绑定并打开使用request-response的大门。

请参阅this SO answer并查看(瘦)proxy service user guide以获取更多信息。