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

我了解自动使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中,将correlationIdId设置为“ correlationid1234”。
但是RabbitMQ管理如下所示。

邮件属性:

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

优先级:0
delivery_mode:2
标头:
TypeId:com.example.model.apijob
content_encoding:UTF-8
content_type:应用程序/ json

如结果所示,设置的correlationId已更改为RabbitTemplate messageTag值(UUID)。我正在查看RabbitTemplate的源代码,但是我不明白为什么如果correlationKey为null,它为什么会更改correlationId。

RabbitMQ Management

最佳答案

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

目前尚不清楚您在convertSendAndReceive()上下文中的含义;您无法在调用关联ID之前对其进行设置,因为在转换发生之前不会有任何消息。

您可以在MessagePostProcessor中设置它,但效果不佳。

也许如果您能解释您要做什么,我可以提出其他建议。

10-07 12:32