我们有来自上游的带有到期时间戳的消息。这些消息将被处理并通过生存时间发送到下游
对于各种类型的消息,我们收到不同的到期时间戳记,因此在服务激活器中分别为每种消息类型计算生存时间,并将其设置为出站消息头有效载荷,如下所示:
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>
以上将引发以下异常,因为生存时间设置为仅接受数字
由以下原因引起:org.springframework.beans.TypeMismatchException:失败 将类型'java.lang.String'的属性值转换为所需的类型 属性“ timeToLive”为“ long”;嵌套异常为 java.lang.NumberFormatException:对于输入字符串: “'headers ['timeToLive']'
我们使用的是SI版本4.3,因此无法使用更高版本的生存时间
需要找到一种方法来从 int-jms:outbound-channel-中设置为生存时间的丰富标头中获取 timeToLive 的值适配器
答案 0 :(得分:2)
只有针对上述版本进行修复的方法与我们在DynamicJmsTemplate
和DynamicJmsTemplateProperties
中所做的类似。
因此,在向ThreadLocal
发送消息之前,您需要在<int-jms:outbound-channel-adapter>
中存储动态值。扩展该DynamicJmsTemplate
以访问覆盖的ThreadLocal
方法中提到的getTimeToLive()
变量。然后清理该ThreadLocal
值。