1.2.2 Apache Camel: Пример “Копирование файлов”
Для примера решим задачу: есть 2 директории data/inbox и data/outbox, необходимо скопировать файлы из директории data/inbox в data/outbox.
Листинг 1.1 Решение задачи на чистом Java
public class FileCopier { public static void main(String args[]) throws Exception { File inboxDirectory = new File("data/inbox"); File outboxDirectory = new File("data/outbox"); outboxDirectory.mkdir(); File[] files = inboxDirectory.listFiles(); for (File source : files) { if (source.isFile()) { File dest = new File( outboxDirectory.getPath() + File.separator + source.getName()); copyFIle(source, dest); } } } private static void copyFile(File source, File dest) throws IOException { OutputStream out = new FileOutputStream(dest); byte[] buffer = new byte[(int) source.length()]; FileInputStream in = new FileInputStream(source); in.read(buffer); try { out.write(buffer); } finally { out.close(); in.close(); } } }
Мы успешно решили задачу, но пришлось написать аж 34 строки, а также использовать низкоуровневое файловое API, открывать и закрывать дескрипторы ресурсов. Это все усложняет код и повышает риск появления ошибок.
Немного усложним задачу, что если нам необходимо периодически проверить появление файлов в папке inbox и при этом отслеживать какие файлы были скопированы, а какие нет. Размер кода вырастет и наша, и без того не маленькая программа вырастет до совсем неприличных размеров.
Данная задача решалась программистами тысячи раз. Свое решение нам предлагает и Apache Camel.
Листинг 1.2 Решение Apache Camel
public class FileCopierWithCamel { public static void main(String args[]) throws Exception { CamelContext context = new DefaultCamelContext(); context.addRoutes(new RouteBuilder() { public void configure() { from("file:data/inbox?noop=true") .to("file:data/outbox"); } }); context.start(); Thread.sleep(10000); context.stop(); } }
Разберем этот код. Каждое Camel-приложение использует CamelContext-объект, который реализует обмен сообщениями между Производителем сообщений (Producer) и Потребителем сообщений (Consumer). CamelContext-объект - объект класса, который реализует интерфейс CamelContext. CamelContext позволяет запустить копирование файлов и остановку этого процесса. В Листинге 1.2 была установлена задержка в 10 секунд, чтобы несколько файлов в директории data/inbox успели с копироваться.