使用 WSO2 ESB 从 HTTP 切换到 RabbitMQ

Posted

技术标签:

【中文标题】使用 WSO2 ESB 从 HTTP 切换到 RabbitMQ【英文标题】:Switching from HTTP to RabbitMQ using WSO2 ESB 【发布时间】:2014-02-27 22:58:12 【问题描述】:

按照 WSO2 ESB 站点 http://docs.wso2.org/display/ESB481/RabbitMQ+AMQP+Transport 上的示例,我正在尝试创建一个代理服务,该服务将通过 HTTP 接收消息并将此消息发布到 RabbitMQ 3.2.3 队列。

我已按照教程中的步骤安装 p2-repo.zip 并创建此代理服务:

<?xml version="1.0" encoding="UTF-8"?>
<proxy xmlns="http://ws.apache.org/ns/synapse"
       name="SendRabbitProxy"
       transports="http"
       statistics="enable"
       trace="enable"
       startOnLoad="true">
   <target>
      <inSequence>
         <log level="full"/>
         <property name="OUT_ONLY" value="true"/>
         <property name="FORCE_SC_ACCEPTED" value="true" scope="axis2"/>
      </inSequence>
      <endpoint>
         <address uri="rabbitmq:/SendRabbitProxy?rabbitmq.server.host.name=localhost&amp;rabbitmq.server.port=5672&amp;rabbitmq.server.user.name=guest&amp;rabbitmq.server.password=guest&amp;rabbitmq.queue.name=myqueue2&amp;rabbitmq.exchange.name=myexchange2"/>
      </endpoint>
   </target>
   <description/>
</proxy>

当我尝试发布消息时,exchange2/queue2 已添加到我的 rabbit 服务器,但引发了以下异常。

我有什么遗漏的吗?

TID[-1234] [ESB] [2014-02-27 22:51:07,470] ERROR
org.apache.axis2.transport.base.threads.NativeWorkerPool - Uncaught exception
org.apache.axis2.transport.rabbitmq.RabbitMQMessageSender.send(RabbitMQMessageSender.java:100)
org.apache.axis2.transport.rabbitmq.RabbitMQSender.sendOverAMQP(RabbitMQSender.java:85)
org.apache.axis2.transport.rabbitmq.RabbitMQSender.sendMessage(RabbitMQSender.java:72)
org.apache.axis2.transport.base.AbstractTransportSender.invoke(AbstractTransportSender.java:112)
org.apache.axis2.engine.AxisEngine.send(AxisEngine.java:442)
org.apache.axis2.description.OutOnlyAxisOperationClient.executeImpl(OutOnlyAxisOperation.java:297)
 org.apache.axis2.client.OperationClient.execute(OperationClient.java:149)
org.apache.synapse.core.axis2.Axis2FlexibleMEPClient.send(Axis2FlexibleMEPClient.java:482)
org.apache.synapse.core.axis2.Axis2Sender.sendOn(Axis2Sender.java:59)
org.apache.synapse.core.axis2.Axis2SynapseEnvironment.send(Axis2SynapseEnvironment.java:338)
org.apache.synapse.endpoints.AbstractEndpoint.send(AbstractEndpoint.java:333)
org.apache.synapse.endpoints.AddressEndpoint.send(AddressEndpoint.java:59)
org.apache.synapse.core.axis2.ProxyServiceMessageReceiver.receive(ProxyServiceMessageReceiver.java:187)
org.apache.axis2.engine.AxisEngine.receive(AxisEngine.java:180)
org.apache.synapse.transport.passthru.ServerWorker.processEntityEnclosingRequest(ServerWorker.java:411)
org.apache.synapse.transport.passthru.ServerWorker.run(ServerWorker.java:183)
org.apache.axis2.transport.base.threads.NativeWorkerPool$1.run(NativeWorkerPool.java:172)
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
java.lang.Thread.run(Thread.java:744)

【问题讨论】:

您可以将以下属性添加到您的端点并尝试吗? rabbitmq.queue.routing.key 我将 uri 更改为: 并且同样的错误出现在日志中...跨度> 【参考方案1】:

您使用的 ESB 版本是什么。如果它是

这是公共 jira - https://wso2.org/jira/browse/ESBJAVA-2449

【讨论】:

我使用的是 Wso2 ESB 4.8.1,您认为问题可能出在 p2-repo.zip 上吗?【参考方案2】:

这是解决 WSO2 ESB 4.8.1 中此问题的解决方法。 似乎 Content-Type 定义不正确,在此博客中解释如何使用自定义中介解决它。

https://luispenarrubia.wordpress.com/2015/05/04/how-to-integrate-wso2-esb-and-rabbitmq-using-amqp-transport-part-2/

问候。

【讨论】:

请注意 link-only answers 是不鼓励的,所以答案应该是寻找解决方案的终点(而不是另一个参考中途停留,随着时间的推移往往会变得陈旧)。请考虑在此处添加独立的概要,并保留链接作为参考。 你是对的。这里有2个问题,提供的链接解决了它。 1) 到 RabbitMQ 的端点不正确。将交换 (rabbitmq.exchange.name=amq.direct) 和路由密钥 (rabbitmq.queue.routing.key=myqueue2) 添加到 URL。 2) 正确添加 Content-Type 标头。关注博文。

以上是关于使用 WSO2 ESB 从 HTTP 切换到 RabbitMQ的主要内容,如果未能解决你的问题,请参考以下文章

WSO2 ESB:后端恢复后地址端点不恢复发送

如何从 wso2 ESB 中的另一个服务调用服务(或一个服务的参数)

WSO2 ESB XML定义语法

使用wso2 esb multipart / form数据

WSO2 ESB聚类概念

WSO2 ESB 代理与 IS 授权服务错误