Apache Camel – kopiowanie plików z u życiem mechanizmu routingu


Apache Camel – kopiowanie plików z u życiem mechanizmu routingu

We wpisie https://javaleader.pl/2019/12/22/apache-camel-dsl-i-osgi/ znajdziesz konfigurację modułu OSGi który zainstalowany jest z użyciem szyny integracyjnej Apache Service Mix. Moduł ten za pomocą Apache Camel’a realizował proste zadanie routingu kopiując pliki z jednego katalogu do innego bez ich usuwania z oryginalnej lokalizacji. W tym wpisie pokaże Ci w jaki sposób skonfigurować Apache Camel w projekcie opartym o Mavena. Do dzieła! Tworzymy nowy projekt Apache Maven i dodajemy kluczową zależność:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-core</artifactId>
    <version>2.18.0</version>
</dependency>

Konfiguracja w oparciu o klasy Javy:

Tworzymy klasę która odpowiada za routing:

public class CamelContextBck {
 
    private static final long   DURATION_MILIS = 10000;
    private static final String SOURCE_FOLDER  = "src/main/java/pl/javaleader";
    private static final String BCK_FOLDER     = "src/main/java/bck";
 
    public static void createBck() throws Exception {
 
        CamelContext camelContext = new DefaultCamelContext();
        camelContext.addRoutes(new RouteBuilder() {
            @Override
            public void configure() throws Exception {
                from("file://" + SOURCE_FOLDER + "?noop=true").process(
                        new pl.javaleader.ProcessFiles()).to("file://" + BCK_FOLDER);
            }
        });
        camelContext.start();
        Thread.sleep(DURATION_MILIS);
        camelContext.stop();
    }
 
}

oraz klasę która odpowiada za procesowanie plików, możliwe jest w tym miejscu np. zmiana nazwy pliku. W tym przypadku nie chcemy zmieniać nazw plików:

class ProcessFiles implements Processor {
    public void process(Exchange exchange) throws Exception {
        String originalFileName = (String) exchange.getIn().getHeader(Exchange.FILE_NAME, String.class);
        exchange.getIn().setHeader(Exchange.FILE_NAME, originalFileName);
    }
}

Klasa testowa:

public class StartBck {
    public static void main(String[] args) {
        try {
            CamelContextBck.createBck();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

W wyniku uruchomienia klasy testowej pliki z pakietu pl.javaleader zostały przekopiowane do katalogu src/main/java/bck.

Konfiguracja w oparciu o camel-spring (z użyciem XML):

Projekt rozszerzamy o następujące zależności:

<properties>
    <env.camel.version>2.16.1</env.camel.version>
    <env.spring.version>4.2.4.RELEASE</env.spring.version>
</properties>
 
<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-core</artifactId>
    <version>${env.camel.version}</version>
</dependency>
<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-spring</artifactId>
    <version>${env.camel.version}</version>
</dependency>
<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-stream</artifactId>
    <version>${env.camel.version}</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>${env.spring.version}</version>
</dependency>

W katalogu ./src/main/resources tworzymy plik camel-context.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:camel="http://camel.apache.org/schema/spring"
       xmlns:util="http://www.springframework.org/schema/util"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
          http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
          http://camel.apache.org/schema/spring
          http://camel.apache.org/schema/spring/camel-spring.xsd
          http://www.springframework.org/schema/util
          http://www.springframework.org/schema/util/spring-util-4.2.xsd">
 
    <bean id="camelContextBck" class="pl.javaleader.java.dsl.CamelContextBck" />
    <bean id="processFiles"    class="pl.javaleader.java.dsl.ProcessFiles"    />
 
    <camelContext xmlns="http://camel.apache.org/schema/spring">
        <routeBuilder ref="camelContextBck" />
    </camelContext>
 
</beans>

Klasa CamelContextBck:

public class CamelContextBck extends RouteBuilder {
 
    private static final String SOURCE_FOLDER  = "src/main/java/pl/javaleader";
    private static final String BCK_FOLDER     = "src/main/java/bck";
 
    @Override
    public void configure() throws Exception {
        from("file://" + SOURCE_FOLDER + "?noop=true&recursive=true").process(
          new ProcessFiles()).to("file://" + BCK_FOLDER);
    }
}

Klasa ProcessFiles:

class ProcessFiles implements Processor {
    public void process(Exchange exchange) throws Exception {
        String originalFileName = (String) exchange.getIn().getHeader(Exchange.FILE_NAME, String.class);
        exchange.getIn().setHeader(Exchange.FILE_NAME, originalFileName);
    }
}

Klasa startowa gdzie wczytywany jest plik camel-context.xml:

public class StartBck {
 
    private static final long  DURATION_MILIS = 10000;
 
    public static void main(String[] args) {
        ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("camel-context.xml");
        try {
            Thread.sleep(DURATION_MILIS);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        applicationContext.close();
    }
 
}

W wyniku uruchomienia klasy testowej pliki z pakietu pl.javaleader zostały rekursywnie przekopiowane do katalogu src/main/java/bck. Rekursywnie ponieważ został dodany parametr:

recursive=true

we fragmencie:

@Override
public void configure() throws Exception {
    from("file://" + SOURCE_FOLDER + "?noop=true&recursive=true").process(
    new ProcessFiles()).to("file://" + BCK_FOLDER);
}

Zobacz kod na GitHubie i zapisz się na bezpłatny newsletter!

.


Leave a comment

Your email address will not be published.


*