在Spring集成中将动态值设置为生存时间

时间:2019-01-02 22:04:36

标签: java spring-integration

我们有来自上游的带有到期时间戳的消息。这些消息将被处理并通过生存时间发送到下游

对于各种类型的消息,我们收到不同的到期时间戳记,因此在服务激活器中分别为每种消息类型计算生存时间,并将其设置为出站消息头有效载荷,如下所示:

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 的值适配器

1 个答案:

答案 0 :(得分:2)

只有针对上述版本进行修复的方法与我们在DynamicJmsTemplateDynamicJmsTemplateProperties中所做的类似。

因此,在向ThreadLocal发送消息之前,您需要在<int-jms:outbound-channel-adapter>中存储动态值。扩展该DynamicJmsTemplate以访问覆盖的ThreadLocal方法中提到的getTimeToLive()变量。然后清理该ThreadLocal值。