Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在Spring集成中将动态值设置为生存时间_Java_Spring Integration - Fatal编程技术网

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

Java 在Spring集成中将动态值设置为生存时间,java,spring-integration,Java,Spring Integration,我们有来自上游的带有过期时间戳的消息。这些消息将被处理并发送到下游,并留有生存时间 对于各种类型的消息,我们会收到不同的过期时间戳,因此服务激活器中的每种消息类型都会单独计算生存时间,并设置为出站消息头有效负载,如下所示: MessageBuilder.fromMessage(requestMessage). setHeader("header1",header1). setHeader("header2",header2). setHeader("timeToLive",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>    
现在,我们正在使用发布此消息,如下所示:

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.typemischException:未能 将“java.lang.String”类型的属性值转换为所需类型 “long”表示财产“timeToLive”;嵌套异常是 java.lang.NumberFormatException:对于输入字符串: “'headers['timeToLive']”

我们使用的是SI版本4.3,因此无法使用更高版本中可用的time to live表达式


需要找到一种方法,在int jms:outbound channel adapter

中,将timeToLive的值从富集头设置为time to live中获取ode>


因此,在向
发送消息之前,需要在
ThreadLocal
中存储一个动态值。扩展该
DynamicJmsTemplate
以访问被覆盖的
gettimeOlive()中提到的
ThreadLocal
变量
方法。并清除该
ThreadLocal
值。

您不能在那里使用表达式;这就是为什么我们在5.1中添加了
生存时间表达式的原因。它需要大量的支持代码,例如更新
DynamicJmsTemplate
。我们没有计划将其向后移植到4.x,因此您需要实现类似的功能r您自己。@ArtemBilan和@GaryRussell在
之前,在充实消息时,我可以通过?
MessageBuilder.fromMessage(message).setExpirationDate(Instant.now().toEpochMilli()+20000.build()设置过期时间吗
或任何其他自定义头?不,请参见JMS规范。
TTL
只能从提供程序impl.设置,并且您提到的内容与JMS
TTL
完全无关。请遵循我们在回答中的建议。不;正如Artem所说,您需要创建一个自定义的
JmsTemplate
,该模板从
ThreadLocal获取TTLe> ,并将模板注入适配器。一些上游组件需要设置
Threadlocal
,自定义模板需要清除它。或者,当然,升级到5.1。你们太棒了,这解决了我的问题。谢谢你们的帮助