首页 文章

Spring集成MessageTransformationException无法转换消息

提问于
浏览
2

我正在尝试使用spring integration v2.2.6.RELEASE运行这个(https://github.com/cloudfoundry-samples/wgrus/tree/master/spring-integration)wgrus示例应用程序并继续获取MessageTransformationException . 该应用程序分为3个组件 - 商店UI,库存服务和送货服务(此服务与此无关),并使用AMQP协议向RabbitMQ发送消息 . 简而言之,您在UI中输入订单详细信息,并以消息的形式将它们发送到订单渠道 . 在幕后,应用程序执行声明检查,它将消息存储在Mongo中(我可以看到它被存储)并返回一条新消息,其有效负载是存储消息的id - 到目前为止一直很好,消息存储我可以看到amqpOut通道返回存储消息的Id,即826bcbfb-21fa-424d-aecd-0bab3d1a690b - 这可以在我的问题底部显示的调试中看到 . 接下来,消息通过出站AMQP通道发送到RabbitMQ,并且应该由库存服务接收,此时将引发异常 . 我可以看到,在某些时候,当调试打印时,存储的消息的id会发生一些事情 Payload=???sr?java.util.UUID????m?/

有没有人遇到这个问题,知道如何解决它?

商店UI使用的配置:

<int:object-to-json-transformer input-channel="orderChannel" output-channel="jsonOrders" content-type="text/x-json"/>

<int:claim-check-in input-channel="jsonOrders" output-channel="amqpOut" message-store="messageStore"/>

<amqp:outbound-channel-adapter id="amqpOut" amqp-template="rabbitTemplate" routing-key="orders"/>
...

库存服务使用的配置:

<int:claim-check-out message-store="messageStore" input-channel="orderChannel" output-channel="inventoryChannel" remove-message="true" />

<amqp:inbound-channel-adapter channel="orderChannel"
  connection-factory="rabbitConnectionFactory"
  queue-names="orders"
  error-channel="errorLogger" />

<int:logging-channel-adapter id="errorLogger" log-full-message="true" level="INFO"/>

<int:chain input-channel="inventoryChannel" output-channel="amqpOut">
  <int:json-to-object-transformer type="org.wgrus.Order"/>
  <int:enricher request-channel="creditCheck">
    <int:property name="approved" expression="payload.startsWith('OK')"/>
  </int:enricher>
  <int:enricher request-channel="inventoryRouter">
    <int:property name="reserved" expression="payload"/>
  </int:enricher>
  <int:object-to-json-transformer content-type="text/x-json" />
  <int:claim-check-in/>
</int:chain>
...

DEBUG:

DEBUG:http-bio-8080-exec-3 org.springframework.integration.channel.DirectChannel - postSend(sent = true)在 Channels 'amqpOut'上,消息:[Payload = 826bcbfb-21fa-424d-aecd-0bab3d1a690b] [ Headers = {timestamp = 1384617973920,id = e98cd0c1-bd8c-4786-be31-1e77b0200934,content-type = text / x-json}] DEBUG:http-bio-8080-exec-3 org.springframework.integration.channel.DirectChannel - Channels 'jsonOrders'上的postSend(sent = true),消息:[Payload = {“id”:1,“approved”:false,“reserved”:false,“customerId”:“”,“quantity”:1, “productId”:“widget”}] [Headers = {timestamp = 1384617973852,id = 826bcbfb-21fa-424d-aecd-0bab3d1a690b,content-type = text / x-json}] DEBUG:http-bio-8080-exec- 3 org.springframework.integration.channel.DirectChannel - postSend(sent = true)在 Channels 'orderChannel'上,消息:[Payload = Order#1:1 Widgets for] [Headers = {timestamp = 1384617973824,id = 1b700a4b-35e1- 4d16-8ca0-7cd20ccfb85e}] DEBUG:SimpleAsyncTaskExecutor-1 org.springframework.integration.amqp.support.DefaultAmqpHeaderMapper - headerName = [c将映射,匹配模式=内容类型DEBUG:SimpleAsyncTaskExecutor-1 org.springframework.integration.amqp.support.DefaultAmqpHeaderMapper - headerName = [amqp_receivedRoutingKey]将被映射,匹配模式= amqp_receivedRoutingKey DEBUG:SimpleAsyncTaskExecutor-1 org .springframework.integration.amqp.support.DefaultAmqpHeaderMapper - headerName = [amqp_deliveryMode]将被映射,匹配模式= amqp_deliveryMode DEBUG:SimpleAsyncTaskExecutor-1 org.springframework.integration.amqp.support.DefaultAmqpHeaderMapper - headerName = [amqp_redelivered]将被映射, matches pattern = amqp_redelivered DEBUG:SimpleAsyncTaskExecutor-1 org.springframework.integration.amqp.support.DefaultAmqpHeaderMapper - headerName = [amqp_deliveryTag]将被映射,匹配pattern = amqp_deliveryTag DEBUG:SimpleAsyncTaskExecutor-1 org.springframework.integration.amqp.support.DefaultAmqpHeaderMapper - headerName = [content-type]将被映射,匹配模式= content-type DEBUG:SimpleAsyncT askExecutor-1 org.springframework.integration.channel.DirectChannel - preSend在通道'orderChannel'上,消息:[Payload = ??? sr?java.util.UUID ???? m?/?J?leastSigBitsJ?mostSigBitsxp ?? ?= i?k ??!?] [Headers = {timestamp = 1384617974260,id = 81a2fb77-0f1e-4be7-9148-84da86a30ed8,content-type = text / x-json,amqp_receivedRoutingKey = orders,amqp_deliveryMode = PERSISTENT,amqp_redelivered = false,amqp_deliveryTag = 1}] DEBUG:SimpleAsyncTaskExecutor-1 org.springframework.integration.transformer.MessageTransformingHandler - org.springframework.integration.transformer.MessageTransformingHandler#1收到消息:[Payload = ??? sr?java.util.UUID? ???毫升/?J〜

1 回答

  • 3

    好吧,你的问题在这里:

    <int:object-to-json-transformer input-channel="orderChannel" output-channel="jsonOrders" content-type="text/x-json"/>
    

    你能解释一下设置 content-type 的原因是什么,如果你之后使用 <claim-check-in> ,谁只返回 UUID - 存储消息的id?

    发生了什么事?

    您的 UUIDSimpleMessageConverter 转换为序列化字节,此转换器将 contentType 设置为 application/x-java-serialized-objectMessageProperties . 但之后被称为 AmqpHeaderMapper ,谁更改 contentType 与你的值 text/x-json MessageHeaders . 这对制片人来说很好 .

    但消费者无法正确转换Body,因为默认情况下此处也可以正常工作 SimpleMessageConverter . 它会检查 contentType.startsWith("text") . 只需从序列化 UUID 的字节创建简单的String .

    希望很清楚

    UPDATE

    不幸的是 <object-to-json-transformer> 无论如何设置了 content-type Headers ,默认为 application/json .

    为了防止它,你应该像这样配置 content-type="" .

相关问题