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.设置,并且您提到的内容与JMSTTL
完全无关。请遵循我们在回答中的建议。不;正如Artem所说,您需要创建一个自定义的JmsTemplate
,该模板从ThreadLocal获取TTLe> ,并将模板注入适配器。一些上游组件需要设置Threadlocal
,自定义模板需要清除它。或者,当然,升级到5.1。你们太棒了,这解决了我的问题。谢谢你们的帮助