使WebMQ同步

时间:2015-06-16 15:34:07

标签: mule mule-studio

我试图让WebMQ在MULE中同步操作,以便将消息队列转换为内部项目的REST API。不幸的是,我对MULE知之甚少。

经过一番工作后,我开始理解Request-Reply范围,并尝试使用WMQ Connector,只是发现WMQ只在流程结束后发送。

我尝试使用VM将请求放入不同的流程中以触发它

但到目前为止,只是导致它永远等待WMQ永远不会发生。

我也尝试过来回使用虚拟机:

但它似乎做了与没有相同的事情,它只是忽略了输入。

现在我知道WMQ的输入和输出正在工作,因为我之前设置了一个使用http与自身通信的流程,并让它知道消息何时通过。

我真正想要的是这个,但使用HTTP而不是AJAX

我最近的,也许是最接近的尝试看起来像这样:

XML正在:

<?xml version="1.0" encoding="UTF-8"?>
<mule xmlns:vm="http://www.mulesoft.org/schema/mule/vm" xmlns:http="http://www.mulesoft.org/schema/mule/http" version="EE-3.6.0" xmlns="http://www.mulesoft.org/schema/mule/core" xmlns:ajax="http://www.mulesoft.org/schema/mule/ajax" xmlns:core="http://www.mulesoft.org/schema/mule/core" xmlns:doc="http://www.mulesoft.org/schema/mule/documentation" xmlns:ee="http://www.mulesoft.org/schema/mule/ee/core" xmlns:json="http://www.mulesoft.org/schema/mule/json" xmlns:spring="http://www.springframework.org/schema/beans" xmlns:stdio="http://www.mulesoft.org/schema/mule/stdio" xmlns:test="http://www.mulesoft.org/schema/mule/test" xmlns:tracking="http://www.mulesoft.org/schema/mule/ee/tracking" xmlns:wmq="http://www.mulesoft.org/schema/mule/ee/wmq" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.mulesoft.org/schema/mule/ajax http://www.mulesoft.org/schema/mule/ajax/current/mule-ajax.xsd
http://www.mulesoft.org/schema/mule/ee/wmq http://www.mulesoft.org/schema/mule/ee/wmq/current/mule-wmq-ee.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-current.xsd
http://www.mulesoft.org/schema/mule/core http://www.mulesoft.org/schema/mule/core/current/mule.xsd
http://www.mulesoft.org/schema/mule/ee/core http://www.mulesoft.org/schema/mule/ee/core/current/mule-ee.xsd
http://www.mulesoft.org/schema/mule/stdio http://www.mulesoft.org/schema/mule/stdio/current/mule-stdio.xsd
http://www.mulesoft.org/schema/mule/test http://www.mulesoft.org/schema/mule/test/current/mule-test.xsd
http://www.mulesoft.org/schema/mule/json http://www.mulesoft.org/schema/mule/json/current/mule-json.xsd
http://www.mulesoft.org/schema/mule/ee/tracking http://www.mulesoft.org/schema/mule/ee/tracking/current/mule-tracking-ee.xsd
http://www.mulesoft.org/schema/mule/http http://www.mulesoft.org/schema/mule/http/current/mule-http.xsd
http://www.mulesoft.org/schema/mule/vm http://www.mulesoft.org/schema/mule/vm/current/mule-vm.xsd">

    <wmq:connector channel="MAGENTO.SVRCONN" doc:name="WMQ Connector" hostName="[ip]" name="wmqConnector" port="1414" queueManager="MAGENTO" transportType="CLIENT_MQ_TCPIP" validateConnections="true" />
    <vm:connector name="VM" validateConnections="true" doc:name="VM">
        <vm:queue-profile maxOutstandingMessages="500">
            <default-persistent-queue-store/>
        </vm:queue-profile>
    </vm:connector>
    <http:listener-config name="HTTP_Listener_Configuration" host="0.0.0.0" port="8081" doc:name="HTTP Listener Configuration"/>
    <flow  name="Input">
        <http:listener config-ref="HTTP_Listener_Configuration" path="/mq" doc:name="HTTP"/>
        <set-payload value="#[message.inboundProperties.'http.query.params'.xml]" doc:name="Set Payload"/>
        <logger message="Entering Request-Reply Payload: #[payload]" level="INFO" doc:name="Logger"/>
        <request-reply doc:name="Request-Reply">
            <vm:outbound-endpoint exchange-pattern="one-way" path="mq" connector-ref="VM" doc:name="VM_TriggerSend" />
            <vm:inbound-endpoint exchange-pattern="request-response" path="mq-return" connector-ref="VM" doc:name="VM_Receive" />
        </request-reply>
        <logger message="Request-Reply has ended. Payload: #[payload]" level="INFO" doc:name="Logger"/>
    </flow>
    <flow name="Send_Message">
        <vm:inbound-endpoint exchange-pattern="one-way" path="mq" connector-ref="VM" doc:name="VM_Send"/>
        <logger message="(Preparing to Dispatch) Payload: #[payload]" level="INFO" doc:name="Logger"/>
        <wmq:outbound-endpoint queue="PUT_QUEUE" connector-ref="wmqConnector" doc:name="WMQ"/>
        <logger message="Message presumably being dispatched after this log" level="INFO" doc:name="Logger"/>
    </flow>
    <flow name="Receive_Message">
        <wmq:inbound-endpoint queue="GET_QUEUE" connector-ref="wmqConnector" doc:name="WMQ_Receive" />
        <logger message="Triggering Receive" level="INFO" doc:name="Logger"/>
        <vm:outbound-endpoint exchange-pattern="request-response" path="mq-return" connector-ref="VM" doc:name="VM_TriggerReceive" />
    </flow>
</mule>

这几乎可以工作,但它无限期挂起而不会将响应发送回HTTP服务器。将Request-Reply流中的vm:inbound-endpoint设置为单向使其不会挂起,但不会发送已收到的新有效负载,而是发送先前的有效负载(就好像它&# 39;被跳过了。)

任何帮助都将非常感谢!

2 个答案:

答案 0 :(得分:2)

如果我理解正确,您只是尝试将队列上的请求和已知队列上的响应公开为REST API。

那里不需要VM队列,并且作为JMS传输的请求 - 应答元素都不能模拟请求响应交换模式。

JMS队列只是一种方式。您必须在不同的队列上进行必要的回复。请求 - 响应方案背后的逻辑是具有出站属性的出站端点:MULE_REPLYTO。此属性应使用众所周知的队列回复名称进行设置:GET_QUEUE(如果未提供此类标头,则将创建临时队列。)

当在服务中收到mesasge时,MULE_REPLY to标头将成为标准JMSReplyTo。服务必须遵守此标头将回复发送回该队列。如果服务是在Mule上实现的,这将自动发生,否则可能不会发生。你应该仔细检查它是否被尊重。

如果您希望将请求 - 回复范围与单向端点而不是一个请求 - 响应端点一起使用,那么它应该可以正常工作但代码更多。

答案 1 :(得分:-1)

制作异步数据源同步确实很棘手。但我真的没有看到您的请求 - 回复策略存在问题。

尝试在双方使用WMQ端点的请求 - 回复。然后监视队列,看到消息和回复按原样到达。您是否对请求和回复使用相同的队列?最简单的方案是使用不同的方案,这可能是你的用例吗?