java在Spring集成中将动态值设置为timetolive
我们有来自上游的带有过期时间戳的消息。这些消息将被处理并发送到下游,并留有生存时间
对于各种类型的消息,我们会收到不同的过期时间戳,因此服务激活器中的每种消息类型都会单独计算生存时间,并设置为出站消息头有效负载,如下所示:
MessageBuilder.fromMessage(requestMessage).
setHeader("header1",header1).
setHeader("header2",header2).
setHeader("timeToLive",timeToLive).
setHeader("header3",header3).build();
现在,我们正在使用发布此消息,如下所示:
<int-jms:outbound-channel-adapter id="publishMessage" channel="publishMessageChannel" header-mapper="headerMapper"
pub-sub-domain="${is.topic}"
destination-name="${outbound.queue}" connection-factory="outputConnectionFactory" order="1" explicit-qos-enabled="true" time-to-live="headers['timeToLive']">
<int-jms:request-handler-advice-chain>
<ref bean="retryAdvice" />
</int-jms:request-handler-advice-chain>
上面抛出了以下异常,因为生存时间设置为只接受数字
Caused by: org.springframework.beans.TypeMismatchException: Failed to convert property value of type 'java.lang.String' to required type 'long' for property 'timeToLive'; nested exception is java.lang.NumberFormatException: For input string: "'headers['timeToLive']'
我们使用的是SI版本4.3,因此无法使用更高版本上可用的“生存时间”表达式
需要找到一种方法,在int jms:outbound channel adapter
# 1 楼答案
为上述版本修复它的唯一方法与我们在
DynamicJmsTemplate
和DynamicJmsTemplateProperties
中所做的类似因此,在向
<int-jms:outbound-channel-adapter>
发送消息之前,需要在ThreadLocal
中存储一个动态值。扩展该DynamicJmsTemplate
以访问重写的getTimeToLive()
方法中提到的ThreadLocal
变量。并清除ThreadLocal
值