1.2.2 Apache Camel: Пример “Копирование файлов”

Написано 16 Январь, 2013 в категории Java

Для примера решим задачу: есть 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 успели с копироваться.