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); }
Leave a comment