JMSTimestamp 与在 JMS 消息上存储 headers 的其他日期

JMSTimestamp Vs Other Date storing headers on a JMS message

我正在使用 AMQs REST API 将消息发送到 Queue,并在 queryString 中设置 header。

我正在使用 UNIX 时间戳的毫秒值设置日期 header myDateHeader

&myDateHeader=1583781133771

JMSTimestamp header 正在自动为我设置,而且似乎也被设置为 long....

然后我使用 camel 使用此消息,尽管是在 Talend 中,并且可以 'parse' JMSTimestamp 到格式化日期。

然而,当我尝试对 myDateHeader 执行相同操作时,我得到了 null

JMSTimestampmyDateHeader 都显示值,如果我 'parse' 到 StringLong 所以某些事情(不)作为日期的一部分发生正在解析。

Talend代码显示

row5.Event_Timestamp = org.apache.camel.builder.SimpleBuilder
                            .simple("${in.header.myDateHeader}")
                            .evaluate(routerExchange, java.util.Date.class);

根据 SimpleBuilder class 显示正确的 resultType。该代码与解析 JMSTimestamp.

时生成的代码相同

当我尝试

simple("${date:in.header.myDateHeader:yyyyMMdd}")

我明白了

java.lang.IllegalArgumentException: Cannot find java.util.Date object at command: in.header.myDateHeader

我猜:

1) 创建消息时,header 需要设置正确的类型 Date 才能将此日期解析作为消费的一部分?

2) REST API 设置所有类型为 String 的 header 并且我无法通过我的 REST 调用更改它?

请原谅我的猜测,但我希望是否有人可以确认以上内容,因此我在使用这些消息时不能将 myDateHeaderJMSTimestamp header 相同对待?

谢谢

你的第二个假设是正确的。自定义 headers 被解析为类型 String。在 Talend 以及作为 Talend ESB 底层集成框架的 Apache Camel 中,预定义的 JMS headers 包括 JMSTimestamp 根据 the "Message format when receiving" reference table 转换为 Java 类型。