无法使用MessageProperties将标头设置为AMQP消息

时间:2015-01-19 07:01:34

标签: rabbitmq spring-integration spring-amqp

以下代码显示了我如何将标头和消息类型设置为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

2 个答案:

答案 0 :(得分:3)

  1. MessagePropertiesBuilder上课就是为了这个。

  2. 默认情况下,Spring Integration AMQP入站端点(AmqpInboundChannelAdapterAmqpInboundGateway)仅映射标准AMQP标头。这是DefaultAmqpHeaderMapper的默认行为。要接受任何用户特定标头,您应该使用选项AmqpHeaderMappersetHeaderMappersetRequestHeaderNames("*"))注入该入站端点。或提供所需自定义标题的完整名称列表。

  3. 重新。 contentType=text/plain:我认为AMQP入站端点和@Transformer(inputChannel = "inboundChannel"之间的某些内容会覆盖从AMQP contentType标头收到的内容。由于RabbitTemplate没有这样做,因此如果您发送Message而不发送任何其他对象。请为消息接收者分享DEBUG类别的org.springframework.integration日志。当然,当您收到@Transformer

  4. 之前的消息时,我们需要这部分日志

答案 1 :(得分:0)

这将有效,您必须正确构建messageproperties。

MessageProperties properties = new MessageProperties();
    properties.builder()
    .contentType(MediaType.APPLICATION_JSON)
    //headers here
    .headers(Map<String, Object>)
    .build();