Apache Camel中MESSAGE_TIMESTAMP字段始终为0,如何启用该属性?
Apache Camel中MESSAGE_TIMESTAMP字段始终为0,如何启用该属性?
你遇到的这个问题其实是因为Apache Camel默认不会自动填充MESSAGE_TIMESTAMP字段,这个字段的设计主要是留给用户或者特定组件来设置的,核心框架不会主动给它赋值,所以默认值就是0。下面给你几个可行的解决方案:
1. 手动在路由开头设置MESSAGE_TIMESTAMP
这是最直接的办法,在路由的最开始阶段(比如消费消息之后立刻)手动设置时间戳,这样后面的bean里就能拿到正确的值了。
比如直接在路由里用Lambda表达式处理:
from("google-pubsub://...") // 第一步就设置消息时间戳 .exchange(exchange -> exchange.getMessage().setMessageTimestamp(System.currentTimeMillis())) .process() .bean("routeMetricsTimer","reportTimer");
或者封装成一个专门的初始化bean,代码更清晰:
// 初始化时间戳的Bean public class MessageTimestampInitializer { public void initTimestamp(Exchange exchange) { exchange.getMessage().setMessageTimestamp(System.currentTimeMillis()); } }
然后在路由中引用这个bean:
from("google-pubsub://...") .bean(MessageTimestampInitializer.class, "initTimestamp") .process() .bean("routeMetricsTimer","reportTimer");
2. 检查组件是否支持自动设置部分组件会自动填充MESSAGE_TIMESTAMP
有些Camel组件(比如JMS、File等)在消费消息时会自动设置这个时间戳,但Google PubSub组件目前默认没有这个逻辑。你可以去查看对应组件的文档,看看有没有配置项可以开启自动设置时间戳的功能,如果有的话直接开启即可。
补充说明
你提到的那个回答里的“添加timestamp属性”和这里的MESSAGE_TIMESTAMP字段是不同的东西:前者是自定义的Exchange属性,后者是Message对象自带的字段。但本质上都是用来记录消息进入路由的时间,如果你不想用手动设置MESSAGE_TIMESTAMP的方式,也可以用自定义属性的方案,效果是一样的。
备注:内容来源于stack exchange,提问作者Shankar
相关产品推荐
相关产品推荐

