以下代码显示了我如何将标头和消息类型设置为AMQP消息。
MessageProperties properties = new MessageProperties();
properties.setHeader("KEY", "HOUSE");
properties.setContentType(MessageProperties.CONTENT_TYPE_JSON);
Message message = new Message("1234567;Branch A;SALES;3000.50;Pending approval".getBytes(), properties);
rabbitTemplate.sendAndReceive("", QUEUE_NAME, message);
在队列中发送消息后,Transformer会收到消息。
@Transformer(inputChannel = "inboundChannel", outputChannel = "toutboundChannel")
public Property buildProperty(Message<String> property){
LOGGER.info("message received :: HEADERS: {}, PAYLOAD :{}", property.getHeaders(), property.getPayload());
....
}
在日志中,标题“KEY:HOUSE”丢失,甚至消息类型也不是JSON和“text / plain”。
LOGS:
[SimpleAsyncTaskExecutor-1] INFO com.demo.maven.spring.integration.endpoint.TransformerRequestBuilder - message received :: HEADERS: {amqp_receivedRoutingKey=mobile.queue, amqp_deliveryTag=2, amqp_replyTo=amq.rabbitmq.reply-to.g2dkABByYWJiaXRAbG9jYWxob3N0AAAW9QAAAAAD.tTIFOS2gsM7qIlGYaybfrg==, amqp_deliveryMode=PERSISTENT, amqp_redelivered=true, id=399dda4f-4ba1-7cf4-2310-03dbfbac82b6, contentType=text/plain, timestamp=1421649922840}, PAYLOAD :1234567;Branch A;SALES;3000.50;Pending approval
答案 0 :(得分:3)
MessagePropertiesBuilder
上课就是为了这个。
默认情况下,Spring Integration AMQP入站端点(AmqpInboundChannelAdapter
和AmqpInboundGateway
)仅映射标准AMQP标头。这是DefaultAmqpHeaderMapper
的默认行为。要接受任何用户特定标头,您应该使用选项AmqpHeaderMapper
将setHeaderMapper
(setRequestHeaderNames("*")
)注入该入站端点。或提供所需自定义标题的完整名称列表。
重新。 contentType=text/plain
:我认为AMQP入站端点和@Transformer(inputChannel = "inboundChannel"
之间的某些内容会覆盖从AMQP contentType
标头收到的内容。由于RabbitTemplate
没有这样做,因此如果您发送Message
而不发送任何其他对象。请为消息接收者分享DEBUG
类别的org.springframework.integration
日志。当然,当您收到@Transformer
答案 1 :(得分:0)
这将有效,您必须正确构建messageproperties。
MessageProperties properties = new MessageProperties();
properties.builder()
.contentType(MediaType.APPLICATION_JSON)
//headers here
.headers(Map<String, Object>)
.build();