我正在尝试使用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 回答
好吧,你的问题在这里:
你能解释一下设置
content-type
的原因是什么,如果你之后使用<claim-check-in>
,谁只返回UUID
- 存储消息的id?发生了什么事?
您的
UUID
被SimpleMessageConverter
转换为序列化字节,此转换器将contentType
设置为application/x-java-serialized-object
为MessageProperties
. 但之后被称为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=""
.