在我的项目(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进行更改。
答案 0 :(得分:1)
如果您使用sendAndReceive()
(而不是convertSendAndReceive()
);如果设置了correlationId消息属性,则模板将其保存;在出站邮件中使用自己的correlationId,并在回复邮件中恢复原始的correlationId。
在convertSendAndReceive()
的背景下,你的意思并不清楚;你不能在调用之前设置correlationId,因为在转换发生之前没有消息。
您可以在MessagePostProcessor
中进行设置,但效果不会很好。
也许如果你能解释一下你想做什么,我可以提出一些其他的建议。