以Camel的表达式语言获取昨天的日期并设置格式

lymgl2op  于 2022-11-07  发布在  Apache
关注(0)|答案(4)|浏览(257)

我在Camel中的路径中使用了日期:

fileName=${date:now:dd-MM-yyyy}

但我现在需要的是一天,可能吗?

bfrts1fy

bfrts1fy1#

嗯,不直接。日期:对象只能获取当前时间(或者你放在头中的某个时间值--这可以用java或类似语言来实现。
但你也可以这样做。创建一个类:

public class YesterdayBean{
    public String getYesterday(){
        Calendar cal = Calendar.getInstance();
        DateFormat dateFormat = new SimpleDateFormat("dd-MM-yyyy");
        cal.add(Calendar.DATE, -1); 
        return dateFormat.format(cal.getTime());  
    }
}

将它作为bean连接到Camel(或者spring,如果你使用的话)注册表中。如果你不确定怎么做,可以查找registrybean的“using”部分。
假设您在注册表中将Bean命名为“yesterday”,其中包含Spring:

<bean id="yesterday" class="some.package.YesterdayBean"/>

那么只需将其与file组件一起使用。

.to("file:fo/bar?fileName=${bean:yesterday}")

如果这只是您需要它的一个地方,并且您使用的是JavaDSL,那么您也可以使用java处理器预先创建日期,并将其放在头中。
就像这样:

from("file:somewhere")
        .process(new Processor(){
            public void process(Exchange ex){
                Calendar cal = Calendar.getInstance();
                cal.add(Calendar.DATE, -1); 
                ex.getIn().setHeader("yesterday",cal.getTime());
            }
        })
       .to("file:target?fileName=${date:header.yesterday:dd-MM-yyyy}");
}
wmtdaxz3

wmtdaxz32#

Camel Simpledate变量支持带偏移量的命令:
支持的命令包括:now表示当前时间戳,[...]命令接受偏移,例如:now-24hheader.xxx+1h或甚至now+1h30m-100
因此,您可以将分配编写为:

fileName=${date:now-1d:dd-MM-yyyy}

请注意,即使文档中未提及,-1d也等于-24h

cotxawn7

cotxawn73#

我对此很好奇,并从camel邮件列表中寻求了一些帮助。事实上,你可以用内联脚本来做你所要求的事情,比如groovy。参见here
我得到了这个为我工作:

<camelContext id="contextname">
    <route id="routename">
        <from uri="file://\temp\?fileName=#myGroovyExp" />
        <split>
            <tokenize token="(?=MSH\|)" regex="true" />
            <to uri="bean:filePickupByDateTest?method=test" />
        </split>
    </route>
</camelContext>

<spring:bean id="myGroovyExp" class="org.apache.camel.model.language.GroovyExpression">
    <spring:constructor-arg index="0" value="new Date().previous().format('MMddyy') + 'pa'" />
</spring:bean>

昨天我的文件名所在的位置:月日
您只需要将脚本主体更改为:

new Date().previous().format('dd-MM-yyyy')

当然,您需要camel-groovy(或者您使用的任何脚本语言)。

mzmfm0qo

mzmfm0qo4#

使用文件名过滤器的解决方案:
创建一个实现org.apache.camel.component.file.GenericFileFilter的类,并实现accept方法来验证文件名

public class CustomFileName implements GenericFileFilter {

    public boolean accept(GenericFile file) {

        Calendar cal = Calendar.getInstance();
        DateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");
        cal.add(Calendar.DATE, -1); 

        return file.getFileName().equals ("FILENAME_PREFIX"+dateFormat.format(cal.getTime()) + ".EXT");
    }
}

在Spring配置中

<bean id="customFileFilter" class="com.sample.proj.util.CustomFileName"/>

<route>
    <description>Route for copying file from one location to another with custom file name filter</description>
    <from uri="file://C:\Source?filter=#customFileFilter" />
    <to uri="file://C:\Destination" />
</route>

相关问题