Получить и форматировать вчерашнюю дату на языке выражения Camel

Я использую дату в пути в Camel:

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

но теперь мне нужно - 1 день. Возможно ли это?

Ответ 1

Ну, не прямо. Дата: объект на простом языке может захватывать только текущее время (или некоторое значение времени, которое вы разместили внутри заголовка), что вы могли бы сделать в 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());  
    }
}

Подключите его к вашему верблюду (или spring, если вы используете этот) реестр как bean. Если вы не знаете, как это сделать, найдите registry и раздел "Использование" bean.

Скажем, вы назвали bean "вчера" в реестре, с spring:

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

то просто используйте его с файловым компонентом.

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

Если это всего лишь одно место, которое вам нужно, и вы используете Java DSL, вы также можете просто создать дату с помощью 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}");
}

Ответ 2

Мне было любопытно об этом и попробовал какую-то помощь из списка рассылки верблюдов. Фактически вы можете делать то, что вы запрашиваете, с помощью встроенных скриптов, таких как groovy. См. здесь.

Я получил это, чтобы работать для меня:

<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>

Где мои имена файлов вчера: MMddyypa

Вам просто нужно сменить тело script на:

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

Вам нужен верблюд groovy (или любой другой script lang, который вы используете) на своем пути, конечно.

Ответ 3

Решение с использованием фильтра имен файлов:

Создайте класс, который реализует файл 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 config

<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>

Ответ 4

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