我怎样才能获得correlationId?

时间:2016-01-28 04:50:05

标签: spring-amqp spring-rabbit

在我的项目(spring-rabbit ..)上,在模板上设置固定的ReplyTo队列,我对RPC使用convertSendAndReceive方法。

我理解mekes correlationId会自动生效。

我可以在使用该方法之前设置correlationId吗?

这是模板。

@Bean   
public RabbitTemplate rabbitTemplate() {
    RabbitTemplate template = new RabbitTemplate(connectionFactory());
    template.setMessageConverter(jsonMessageConverter());       
    template.setRoutingKey(AmqpConstants.JOB_QUEUE_NAME);
    template.setExchange(AmqpConstants.JOB_EXCHANGE_NAME);
    template.setQueue(AmqpConstants.JOB_QUEUE_NAME);    
    template.setReplyQueue(new Queue(AmqpConstants.JOB_REPORT_QUEUE_NAME)); 

    template.setReplyTimeout(replyTimeoutMilliseoconds);

    return template;
}

代码

jobReport = (ApiJobReport)rabbitTemplate.convertSendAndReceive(
                AmqpConstants.JOB_EXCHANGE_NAME, 
                AmqpConstants.JOB_QUEUE_NAME, 
                jobMessage, new MessagePostProcessor() {

                    @Override
                    public Message postProcessMessage(Message message) throws AmqpException {
                        message.getMessageProperties().setCorrelationId("correlationid1234".getBytes());
                        return message;
                    }
                }); 

在postProcessMessage中,将correlationId设置为“correlationid1234”。 但RabbitMQ管理如下所示。

消息属性:

correlation_id:23316fe6-0c15-46f6-9bed-5f3abf22a594

优先级:0 delivery_mode:2 标题:
TypeId :com.example.model.apijob content_encoding:UTF-8 content_type:application / json

如结果所示,set correlationId已更改为RabbitTemplate messageTag值(UUID)。我正在观看RabbitTemplate源码,但我不明白为什么如果correlationKey为null,它会对correlationId进行更改。

RabbitMQ Management

1 个答案:

答案 0 :(得分:1)

如果您使用sendAndReceive()(而不是convertSendAndReceive());如果设置了correlationId消息属性,则模板将其保存;在出站邮件中使用自己的correlationId,并在回复邮件中恢复原始的correlationId。

convertSendAndReceive()的背景下,你的意思并不清楚;你不能在调用之前设置correlationId,因为在转换发生之前没有消息。

您可以在MessagePostProcessor中进行设置,但效果不会很好。

也许如果你能解释一下你想做什么,我可以提出一些其他的建议。