有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案

  1. # 1 楼答案

    为上述版本修复它的唯一方法与我们在DynamicJmsTemplateDynamicJmsTemplateProperties中所做的类似

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