在我的项目(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
中设置它,但效果不佳。
也许如果您能解释您要做什么,我可以提出其他建议。