如何在RabbitMQ消息上添加x-delay头



我正试图使用MessagePostProcessor的实例在消息上添加一个标头x-delay,但它给了我一个异常:

java.lang.UnsupportedOperationException:MessageHeaders是不可变的

import org.springframework.messaging.Message
import org.springframework.messaging.core.MessagePostProcessor
import org.springframework.stereotype.Component
@Component
class AmpqRoutingKeyStrategy {
private static CUSTOM_DELAY = 120000
MessagePostProcessor get() {
return withDelay(CUSTOM_DELAY)
}
static MessagePostProcessor withDelay(Integer milliSeconds) {
return new MessagePostProcessor() {
@Override
Message postProcessMessage(Message message) {
message.getHeaders().put('x-delay', milliSeconds)
return message
}
}
}
}

上面的例子在许多关于这个主题的文章中都有使用,我知道我们可以选择添加x-delay标头,但我如何在不引发这个异常的情况下完成它?

文档中写道:

重要提示:这个类是不可变的。任何变异操作,如put(..(、putAll(..(和其他操作,都会抛出UnsupportedOperationException。

解决方案是重新创建消息:

static MessagePostProcessor withDelay(Integer milliSeconds) {
return new MessagePostProcessor() {
@Override
Message postProcessMessage(Message message) {
return org.springframework.messaging.support.MessageBuilder
.fromMessage(message)
.setHeader("x-delay", milliseconds)
.build()
}
}
}

最新更新