我正在尝试运行此(https://github.com/cloudfoundry-samples/wgrus/tree/master/spring-integration)使用spring集成v2.2.6.RELEASE的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?/
有没有人遇到过这个问题,并且知道如何解决?
商店用户界面使用的配置:
<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>
...
调试:
调试:http-bio-8080-exec-3 org.springframework.integration.channel.DirectChannel-通道“ amqpOut”上的postSend(sent = true),消息:[Payload = 826bcbfb-21fa-424d-aecd-0bab3d1a690b] [标题= {timestamp = 1384617973920,id = e98cd0c1-bd8c-4786-be31-1e77b0200934,content-type = text / x-json}]]
调试:http-bio-8080-exec-3 org.springframework.integration.channel.DirectChannel-通道'jsonOrders'上的postSend(sent = true),消息:[有效载荷= {“ id”:1,“已批准”:false ,“ reserved”:false,“ customerId”:“”,“ quantity”:1,“ productId”:“ widget”}]] [Headers = {timestamp = 1384617973852,id = 826bcbfb-21fa-424d-aecd-0bab3d1a690b,content -type = text / x-json}]
调试:http-bio-8080-exec-3 org.springframework.integration.channel.DirectChannel-通道“ orderChannel”上的postSend(sent = true),消息:[有效载荷=订单#1:1个用于[[Headers = { timestamp = 1384617973824,id = 1b700a4b-35e1-4d16-8ca0-7cd20ccfb85e}]
调试:SimpleAsyncTaskExecutor-1 org.springframework.integration.amqp.support.DefaultAmqpHeaderMapper-headerName = [content-type]将被映射,匹配的pattern = content-type
调试:SimpleAsyncTaskExecutor-1 org.springframework.integration.amqp.support.DefaultAmqpHeaderMapper-headerName = [amqp_receivedRoutingKey]将被映射,匹配的模式= amqp_receivedRoutingKey
调试:SimpleAsyncTaskExecutor-1 org.springframework.integration.amqp.support.DefaultAmqpHeaderMapper-headerName = [amqp_deliveryMode]将被映射,匹配的模式= amqp_deliveryMode
调试:SimpleAsyncTaskExecutor-1 org.springframework.integration.amqp.support.DefaultAmqpHeaderMapper-headerName = [amqp_redelivered]将被映射,匹配的模式= amqp_redelivered
调试:SimpleAsyncTaskExecutor-1 org.springframework.integration.amqp.support.DefaultAmqpHeaderMapper-headerName = [amqp_deliveryTag]将被映射,匹配的模式= amqp_deliveryTag
调试:SimpleAsyncTaskExecutor-1 org.springframework.integration.amqp.support.DefaultAmqpHeaderMapper-headerName = [content-type]将被映射,匹配的pattern = content-type
调试:SimpleAsyncTaskExecutor-1 org.springframework.integration.channel.DirectChannel-在频道“ orderChannel”上预发送,消息:[有效载荷=?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}]]
调试:SimpleAsyncTaskExecutor-1 org.springframework.integration.transformer.MessageTransformingHandler-org.springframework.integration.transformer.MessageTransformingHandler#1收到消息:[Payload = ??? sr?java.util.UUID ???? m?/? ??
好吧,您的问题在这里:
<int:object-to-json-transformer input-channel="orderChannel" output-channel="jsonOrders" content-type="text/x-json"/>
您能解释一下设置的原因是什么content-type
,如果您在使用完之后<claim-check-in>
,谁又返回UUID
存储的Message的ID?
发生什么事了?
你UUID
就是转换为通过序列化字节SimpleMessageConverter
和该转换器设置contentType
为application/x-java-serialized-object
到MessageProperties
。但在那之后叫AmqpHeaderMapper
,谁改变了contentType
你的价值text/x-json
的MessageHeaders
。对生产者来说很好。
但是Consumer无法正确转换Body,因为SimpleMessageConverter
默认情况下,此处也可以正常工作。并检查contentType.startsWith("text")
。只需从serialized的字节创建简单的String即可UUID
。
希望很清楚
更新
不幸的是,无论如何都<object-to-json-transformer>
将content-type
标头设置为application/json
默认值。
为了防止这种情况,您应该像这样进行配置content-type=""
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句