我正试图使用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()
}
}
}