Apache camel 骆驼的行为

Apache camel 骆驼的行为,apache-camel,Apache Camel,轮询文件的路由有一个拦截器,如下所示。我们想知道处理的总时间。因此,我们将开始时间记录在标题中。 我们观察到起始时间从未改变。此代码位于RouteBuilder::configure方法中。然后我将代码移动到一个bean中,并从拦截器调用该bean。想要更清楚一点,阅读拦截器上的camel文档,我仍然不清楚,为什么这不起作用 interceptFrom() .setHeader("fileName", regexR

轮询文件的路由有一个拦截器,如下所示。我们想知道处理的总时间。因此,我们将开始时间记录在标题中。 我们观察到起始时间从未改变。此代码位于RouteBuilder::configure方法中。然后我将代码移动到一个bean中,并从拦截器调用该bean。想要更清楚一点,阅读拦截器上的camel文档,我仍然不清楚,为什么这不起作用

 interceptFrom()
                .setHeader("fileName",
                        regexReplaceAll(simple("${file:onlyname.noext.single}"),
                                "[^a-zA-z\\d]", ""))
                .setHeader("startTime", constant(System.currentTimeMillis()))

因为这个头是一个
常量
,它是在路由“构造”时设置的,并且在运行时从不更改。因此,对于处理的每个消息,它都保持相同的常量值

看。不能使用它设置动态值

但@claus ibsen添加了一条评论,指出已经有一个带有exchange创建时间戳的消息头。你可以用它


simple(${in.header.CamelCreatedTimestamp}”)

因为此头是一个
常量,在路由“构造”时设置,并且在运行时从不更改。因此,对于处理的每个消息,它都保持相同的常量值

看。不能使用它设置动态值

但@claus ibsen添加了一条评论,指出已经有一个带有exchange创建时间戳的消息头。你可以用它


simple(${in.header.CamelCreatedTimestamp}”)

我理解这一点。我希望每次文件到达时都会执行setHeader。InterceptFrom用于拦截任何传入的交换,在任何路由中(它拦截所有来自DSL的交换),它的行为方式也与简单表达式相同。在本例中,对于startTime表达式,它没有任何动态特性。SetHeader需要一个表达式。您可以使用常量或简单。我在setheader之后添加了一个记录器。每个文件都打印了日志。但在我看到的日志中,startTime标题从未更改。因此,据我所知,头在configure方法中设置了一次。但对于每个传入文件,都会执行任何日志和处理器或to,您必须在命令和值之间进行区分
setHeader
是一个命令,显然是针对路由处理的每条消息执行的<代码>常量(无论什么)
是一个常量值,仅计算一次(在路由构建中),并重新应用于处理的每条消息。确定。那么我们怎样才能让它起作用呢?很简单,我也试过了。没用,你看到我更新的答案了吗?已经有一个带有“开始时间”(创建交换)的头了。我理解这一点。我希望每次文件到达时都会执行setHeader。InterceptFrom用于拦截任何传入的交换,在任何路由中(它拦截所有来自DSL的交换),它的行为方式也与简单表达式相同。在本例中,对于startTime表达式,它没有任何动态特性。SetHeader需要一个表达式。您可以使用常量或简单。我在setheader之后添加了一个记录器。每个文件都打印了日志。但在我看到的日志中,startTime标题从未更改。因此,据我所知,头在configure方法中设置了一次。但对于每个传入文件,都会执行任何日志和处理器或to,您必须在命令和值之间进行区分
setHeader
是一个命令,显然是针对路由处理的每条消息执行的<代码>常量(无论什么)是一个常量值,仅计算一次(在路由构建中),并重新应用于处理的每条消息。确定。那么我们怎样才能让它起作用呢?很简单,我也试过了。没用,你看到我更新的答案了吗?已经有一个带有“开始时间”(创建Exchange)的标头。您已经将状态时间存储在Exchange上作为属性,您可以在那里找到它:您已经将状态时间存储在Exchange上作为属性,您可以在那里找到它: