从 rabbitmq 队列获取答案时,从端点类型地址设置答案类型

Setting answer type from endpoint type address, when getting answer from rabbitmq queue

我有一个对 rabbitmq 队列的调用,它在 return 中以 json 负载响应。

        <inSequence>
            <call>
                <endpoint>
                    <address statistics="enable" trace="enable" uri="rabbitmq:/AMQPProducerSample?rabbitmq.server.host.name=10.0.0.2&amp;rabbitmq.server.port=5672&amp;rabbitmq.server.virtual.host=dev&amp;rabbitmq.server.vhost=devAuth&amp;rabbitmq.queue.name=hello&amp;rabbitmq.queue.durable=false&amp;rabbitmq.queue.auto.ack=true&amp;rabbitmq.queue.exclusive=false&amp;rabbitmq.replyto.name=false">
                        <suspendOnFailure>
                            <initialDuration>-1</initialDuration>
                            <progressionFactor>-1</progressionFactor>
                            <maximumDuration>0</maximumDuration>
                        </suspendOnFailure>
                        <markForSuspension>
                            <retriesBeforeSuspension>0</retriesBeforeSuspension>
                        </markForSuspension>
                    </address>
                </endpoint>
            </call>
            <header name="Content-Type" scope="transport" value="application/json"/>
            <respond description="respond whatever"/>
        </inSequence>

但是当来自队列 return 的答案时,控制台显示: [2020-10-19 19:20:39,741] 警告 {RabbitMQUtils} - 无法确定消息 urn:uuid:88BF095D7137B387921603153239744 设置为 text/plain[= 的内容类型11=]

并将“文本”添加到我已经 json 的负载中: {"text":"{"jwt":"5f8e2d21c2184","error":false}"}

如何将 rabbitmq 的答案设置为 json 或者我是否需要转换该答案?因为它得到了所有条带保护。

请尝试以下Synapse神器。

<proxy xmlns="http://ws.apache.org/ns/synapse"
    name="RabbitMQRPCProxy"
    startOnLoad="true"
    trace="enable"
       transports="http">
   <description/>
   <target>
    <inSequence>
        <log level="full">
            <property name="received" value="true"/>
        </log>
        <call>
            <endpoint>
                 <address uri="rabbitmq://?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=rpc_queue&amp;rabbitmq.queue.routing.key=rpc_queue&amp;rabbitmq.replyto.name=dummy"/>
            </endpoint>
        </call>
        <log level="full">
            <property name="response" value="true"/>
        </log>
        <respond/>
    </inSequence>
    <outSequence/>
   </target>
</proxy>

这里,

  • 当 WSO2 Enterprise Integrator(WSO2 EI) 启动时,它会创建一个匿名的、独占的回调队列。
  • 对于远程过程调用请求,WSO2 EI 发送具有以下属性的消息:
    • reply_to : 这个设置到回调队列
    • correlation_id :为每个请求设置一个唯一值。
  • 然后将请求发送到 rpc_queue。
  • RPC 服务器等待该队列上的请求。当请求出现时,它会完成工作并使用来自 reply_to 字段的具有相同 correlation_id.
  • 的队列将带有结果的消息发送回 WSO2 EI 服务器
  • WSO2 EI 等待 reply_to 队列中的数据。出现消息时,它会检查 correlation_id 属性。如果它与请求中的值匹配,它 returns 对应用程序的响应。

有关更多详细信息,请查看 RabbitMQ listener and sender 文档。

答案的类型由端点设置为消息的属性,如 de rabbitmq 文档所述: https://www.rabbitmq.com/consumers.html#message-properties 在 php rabbitmq 库的情况下,将 'content_type'=>'application_json' 添加到 属性消息数组。