Camel apache копирование файлов
Apache Camel описан на его главной веб-странице (и в Руководстве пользователя Camel ) как «универсальная инфраструктура интеграции с открытым исходным кодом, основанная на известных корпоративных шаблонах интеграции». Инфраструктура Camel основана на книге Enterprise Integration Patterns и предоставляет реализации шаблонов, описанных в этой книге . В этом посте я рассмотрел пример использования Hello World типа Camel.
Веб-страница Camel и руководство пользователя также ссылаются на ветку StackOverflow. Что такое Apache Camel? это включает в себя несколько хороших описаний Apache Camel. Дэвид Ньюкомб описал Верблюда там:
В первом случае файлы, помещенные в каталог «input», автоматически копируются в каталог «output», не затрагивая исходные файлы. Во втором случае файлы, помещенные в каталог «input», автоматически копируются в каталог «output», а затем файлы в каталоге «input» сохраняются в специальном подкаталоге «.camel» в каталоге «input». В третьем случае файлы удаляются из каталога «input» при копировании в каталог «output» (фактически это операция «move»). Все три случая реализованы с почти одинаковым кодом. Единственное различие между ними заключается в единственной строке, указывающей, как Camel должен обрабатывать передачу файлов.
В следующем листинге кода показан базовый код, необходимый для использования Camel для автоматического копирования файлов, помещенных во входной каталог, в другой выходной каталог с Camel.
Приведенный выше код демонстрирует минимальное использование Camel API и поддержку Camel Java DSL. CamelContext определяется с использованием экземпляра DefaultCamelContext (строка 10). Строки 13-21 добавляют маршрут Camel к этому конкретному контексту, а строка 22 начинает контекст с строки 24, останавливая контекст. Все довольно просто, но наиболее интересная часть для меня – это спецификация маршрутизации в строке 19.
Поскольку экземпляр, реализующий интерфейс RoutesBuilder, предоставляемый для контекста Camel, требует переопределения только своего абстрактного метода configure, его легко создать как анонимный класс, встроенный в вызов CamelContext.addRoutes (RoutesBuilder) . Это то, что я сделал в приведенном выше коде, и то, что сделано во многих примерах Camel, которые доступны онлайн.
Как только что упомянуто, строка 19 в приведенном выше коде инструктирует Camel копировать файлы, уже находящиеся или помещенные в каталог «input», в указанный каталог «output», не затрагивая файлы в каталоге «input». В некоторых случаях я могу захотеть «переместить» файлы, а не «скопировать» их. В таких случаях можно указать ?noop=true вместо ?noop=true при указании конечной точки ‘from’. Другими словами, строка 19 выше может быть заменена на эту, чтобы файлы удалялись из каталога «input» при помещении в каталог «output». Если на входе не ?noop=true ни один параметр (ни ?noop=true ни ?delete=true ), то происходит действие, попадающее между ними: файлы в каталоге ‘input’ перемещаются в специально созданный новый подкаталог под ‘входной’ каталог называется .camel . Три случая выделены следующим.
Файлы, скопированные из файлов данных \ input в datafiles \ output без влияния на исходные файлы
Файлы, перемещенные из файлов данных \ input в datafiles \ output
Файлы, скопированные из файлов данных \ input в datafiles \ output и исходные файлы, перемещены в подкаталог .camel
В качестве дополнительного примечания, использование беглого «от» и «до» является примером Java DSL Camel. Camel реализует это с помощью наследования реализации (такие методы, как «from» и «to» определены в классе RouteBuilder ), а не с помощью статического импорта (подход, часто используемый для DSL на основе Java).
Хотя обычно анонимные экземпляры RouteBuilder в Camel Context, это не является обязательным требованием. Могут быть ситуации, в которых выгодно иметь автономные классы, которые расширяют RouteBuilder и экземпляры этих расширенных классов передаются в контекст Camel. Я буду использовать этот подход, чтобы продемонстрировать все три случая, которые я описал ранее. Следующий листинг кода показывает класс, который расширяет RouteBuilder . Во многих случаях у меня был бы конструктор без аргументов, но в этом случае я использую конструктор, чтобы определить, какой тип передачи файлов должен поддерживаться маршрутом Camel.
В следующем листинге кода показан именованный автономный класс, который обрабатывает все три случая, показанные выше (копирование, копирование с архивированием входных файлов и перемещение). Это единственное расширение RouteBuilder использует перечисление в своем конструкторе, чтобы определить, как сконфигурировать входную конечную точку.
In this tutorial we will be creating a simple maven project to copy files from one folder to another using Apache Camel. We will be making use of the Apache Camel File Component.
Configuring Options
Camel components are configured on two separate levels:
Query Parameters (22 parameters)
chmod (producer)
Allows you to set chmod on the stored file. For example chmod=664.
disconnect (common)
Whether or not to disconnect from remote FTP server right after use. Disconnect will only disconnect the current connection to the FTP server. If you have a consumer which you want to stop, then you need to stop the consumer/route instead.
fileName (producer)
Use Expression such as File Language to dynamically set the filename. For consumers, it’s used as a filename filter. For producers, it’s used to evaluate the filename to write. If an expression is set, it take precedence over the CamelFileName header. (Note: The header itself can also be an Expression). The expression options support both String and Expression types. If the expression is a String type, it is always evaluated using the File Language. If the expression is an Expression type, the specified Expression type is used - this allows you, for instance, to use OGNL expressions. For the consumer, you can use it to filter filenames, so you can for instance consume today’s file using the File Language syntax: mydata-$\.txt. The producers support the CamelOverruleFileName header which takes precedence over any existing CamelFileName header; the CamelOverruleFileName is a header that is used only once, and makes it easier as this avoids to temporary store CamelFileName and have to restore it afterwards.
flatten (producer)
Flatten is used to flatten the file name path to strip any leading paths, so it’s just the file name. This allows you to consume recursively into sub-directories, but when you eg write the files to another directory they will be written in a single directory. Setting this to true on the producer enforces that any file name in CamelFileName header will be stripped for any leading paths.
jailStartingDirectory (producer)
Used for jailing (restricting) writing files to the starting directory (and sub) only. This is enabled by default to not allow Camel to write files to outside directories (to be more secured out of the box). You can turn this off to allow writing files to directories outside the starting directory, such as parent or root folders.
lazyStartProducer (producer)
Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the route to fail being started. By deferring this startup to be lazy then the startup failure can be handled during routing messages via Camel’s routing error handlers. Beware that when the first message is processed then creating and starting the producer may take a little time and prolong the total processing time of the processing.
strictHostKeyChecking (producer)
Apache Camel описан на его
главной веб-странице (и в
Руководстве пользователя Camel ) как «универсальная инфраструктура интеграции с открытым исходным кодом, основанная на известных корпоративных шаблонах интеграции». Инфраструктура Camel основана на книге
Enterprise Integration Patterns и предоставляет
реализации шаблонов, описанных в
этой книге . Я смотрю на пример типа «Hello World» с использованием Camel в этом посте.
Веб — страница и пользователи Camel Руководство также ссылаются на StackOverflow нити , что именно является Apache Camel? это включает в себя несколько хороших описаний Apache Camel. Дэвид Ньюкомб описал Верблюда там:
В первом случае файлы, помещенные в каталог «input», автоматически копируются в каталог «output», не затрагивая исходные файлы. Во втором случае файлы, помещенные в каталог «input», автоматически копируются в каталог «output», а затем файлы в каталоге «input» сохраняются в специальном подкаталоге «.camel» в каталоге «input». В третьем случае файлы удаляются из каталога «input» при копировании в каталог «output» (фактически, операция «move»). Все три случая реализованы с почти одинаковым кодом. Единственное различие между ними заключается в единственной строке, указывающей, как Camel должен обрабатывать передачу файлов.
В следующем листинге кода показан базовый код, необходимый для использования Camel для автоматического копирования файлов, помещенных во входной каталог, в другой выходной каталог с Camel.
Приведенный выше код демонстрирует минимальное использование Camel API и поддержку Camel Java DSL. CamelContext определяется с помощью экземпляра DefaultCamelContext (строка 10). Строки 13-21 добавляют маршрут Camel к этому конкретному контексту, а строка 22 начинает контекст с строки 24, останавливая контекст. Все довольно просто, но наиболее интересная часть для меня — это спецификация маршрутизации в строке 19.
Поскольку экземпляр, реализующий интерфейс RoutesBuilder, предоставленный для контекста Camel, требует переопределения только своего абстрактного метода configure, его легко создать как анонимный класс, встроенный в вызов CamelContext.addRoutes (RoutesBuilder) . Это то, что я сделал в приведенном выше коде, и то, что сделано во многих примерах Camel, которые доступны онлайн.
Как только что упомянуто, строка 19 в приведенном выше коде инструктирует Camel копировать файлы, уже находящиеся или помещенные в каталог «input», в указанный каталог «output», не затрагивая файлы в каталоге «input». В некоторых случаях я могу захотеть «переместить» файлы, а не «скопировать» их. В таких случаях ?delete=true может быть указано вместо ?noop=true указания конечной точки «from». Другими словами, строка 19, приведенная выше, может быть заменена на эту, чтобы файлы удалялись из каталога «input» при помещении в каталог «output». Если на входе не указано ни одного параметра (ни того, ?noop=true ни другого ?delete=true ), то происходит действие, попадающее между ними: файлы во «входе»каталог перемещается в специально созданный новый подкаталог в каталоге «input» .camel , Три случая выделены следующим.
Файлы, скопированные из файлов данных \ input в datafiles \ output без влияния на исходные файлы
Файлы, перемещенные из файлов данных \ input в datafiles \ output
Файлы, скопированные из файлов данных \ input в datafiles \ output и исходные файлы, перемещены в подкаталог .camel
В качестве примечания, использование беглого «от» и «до» является примером Java DSL Camel . Camel реализует это с помощью наследования реализации (такие методы, как «from» и «to» определены в классе RouteBuilder ), а не с помощью статического импорта (подход, часто используемый для DSL на основе Java.)
Несмотря на то, что анонимные экземпляры обычно передаются RouteBuilder в Camel Context, это не является обязательным требованием. Могут быть ситуации, в которых выгодно иметь автономные классы, которые расширяются RouteBuilder и экземпляры этих расширенных классов передаются в Camel Context. Я буду использовать этот подход, чтобы продемонстрировать все три случая, которые я описал ранее. Следующий листинг кода показывает класс, который расширяется RouteBuilder . Во многих случаях у меня был бы конструктор без аргументов, но в этом случае я использую конструктор, чтобы определить, какой тип передачи файлов должен поддерживаться маршрутом Camel.
В следующем листинге кода показан именованный автономный класс, который обрабатывает все три случая, показанные выше (копирование, копирование с архивированием входных файлов и перемещение). Это единственное расширение RouteBuilder принимает перечисление в своем конструкторе, чтобы определить, как настроить конечную точку ввода.
6-7 апреля в Москве в шестой раз пройдет JPoint – международная Java-конференция для опытных разработчиков. В этот раз в ней примет участие Клаус Ибсен (Claus Ibsen) – старший инженер Red Hat, гуру Apache. Ниже приводим перевод начала его книги «Camel in Action» – эксклюзивно для читателей нашего блога.
Простота конфигурирования
Конфигурирование в Camel сведено к минимуму везде, где только можно. Чтобы задавать конечные точки непосредственно в маршрутах, используется простая и понятная конфигурация URI.
Например, вы можете настроить маршрут Camel, который будет начинаться от файловой конечной точки и рекурсивно сканировать вложенные папки на предмет файлов .txt, всего лишь написав следующее:
Легковесное ядро, пригодное для встраивания в микросервисы
Ядро Camel действительно весит совсем немного: размер библиотеки составляет около 4,9 МБ, еще около 1,3 МБ занимают runtime-зависимости. Поэтому Camel легко встраивается куда угодно и развертывается где угодно, включая автономные приложения, микросервисы, веб-приложения, приложения Spring, приложения Java EE, OSGi, Spring Boot, WildFly, а также облачные платформы, такие как AWS, Kubernetes или Cloud Foundry. Camel изначально создавался не как серверная система или решение ESB, а как то, что можно встраивать в любые исполняемые вещи, где есть Java.
Первый запуск Camel
Итак, выше мы рассказали, как получить дистрибутив Camel, и вкратце описали его содержимое. Среди прочего там есть и примеры с пояснениями и инструкциями, которые мы советуем изучить.
Однако в этой книге мы вообще не будем использовать дистрибутив. Все приведенные здесь примеры исходного кода задействуют Apache Maven, который автоматически загружает все необходимые библиотеки Camel. Поэтому вам не нужно будет контролировать, чтобы они прописывались в classpath.
Все примеры кода из этой книги можно найти на сайте GitHub.
Первый пример, который мы рассмотрим – это такой «hello world» в реалиях интеграции, иначе говоря, это маршрутизация файлов. Допустим, надо прочитать файлы в одной папке (data/inbox), обработать их определенным образом и записать результаты в другую папку (data/outbox). Для простоты опустим обработку, и тогда задача сведется к копированию исходных файлов, как показано на Рис. 1.4.
Рис. 1.4 Маршрутизация файлов из папки data/inbox в папку data/outbox.
Проще некуда, верно? Вот как выглядит реализация этой задачи на «чистой» Java, без использования Camel.
Листинг 1.1 Маршрутизация файлов из одной папки в другую на «чистой» Java
Казалось бы, совсем простая задача, но в FileCopier уже целых 37 строк кода. К тому же, пришлось использовать низкоуровневые файловые API, и – что важно – надо было не забыть правильно закрыть ресурсы. Теперь представим, что копировать из папки data/inbox надо только новые файлы. Тогда потребуется установить таймер и отслеживать, какие файлы уже были скопированы. Сложность растет прямо на глазах.
К счастью, интеграционные задачи, наподобие только что рассмотренной, уже решены на тысячу раз. Поэтому не нужно изобретать велосипед и писать код руками. Давайте посмотрим, как весь этот функционал реализуется средствами фреймворка интеграции, такого как Apache Camel.
Листинг 1.2 Маршрутизация файлов из одной папки в другую на Apache Camel
Большинство кода в этом примере – шаблон. Любое приложение Camel использует CamelContext, который впоследствии запускается и затем останавливается. Мы также добавили метод sleep, чтобы дать приложению Camel время на копирование файлов. Главное, на что надо обратить внимание в листинге1.2 – маршрут.
Для запуска этого примера потребуется загрузить и установить Apache Maven. После того, как он будет готов, откройте консоль и перейдите в папку chapter1/file-copy в каталоге с исходными текстами примеров из этой книги. В ней вы найдете:
- data – в этой папке есть папка inbox с единственным файлом message1.xml
- src – папка с исходным кодом примеров из этой главы
- pom.xml – файл с информацией для сборки примеров, а именно XML-файл Maven POM (Project Object Model)
При написании это книги использовался Maven 3.5.0. Другие версии Maven могут работать не совсем так, как здесь показано.
Содержимое файла POM приводится на листинге ниже.
Листинг 1.3 Файл Maven POM, необходимый для использования основной библиотеки Camel
Maven – это отдельная большая тема, и здесь мы коснемся ее по самому минимуму лишь для того, чтобы вы могли работать с примерами.
POM-файл Maven на Листинге 1.3 – это, возможно, один из самых коротких POM-файлов в вашей жизни, поскольку в нем используются практически все настройки POM по умолчанию. Помимо них, некоторые настройки задаются в родительском (parent) POM. Пожалуй, самая важная часть здесь – это зависимость от библиотеки Camel. Используя этот POM, Maven делает следующее:
- Создает search path на основе groupId, artifactId и version. Для элемента version задано свойство camel-version, определенное в POM, на который ссылается элемент parent, и равное в итоге 2.20.1. Тип зависимости не задан, поэтому считается, что это файл JAR. Search path таким образом превращается в org/apache/camel/camel-core/2.20.1/camel-core-2.20.1.jar.
- Поскольку листинг 1.3 не содержит никаких указаний, где искать зависимости Camel, Maven ищет их в своем центральном репозитории по адресу.
- Объединив search path и URL репозитория, Maven пытается загрузить файл.
- JAR-файл сохраняется в локальный кэш Maven, который обычно находится в домашнем каталоге .m2/repository. В Linux/macOS это папка ~/.m2/repository, в Windows – C:\Users\[Username]\.m2\repository.
- При запуске кода приложения из листинга 1.2 JAR-файл Camel добавляется в classpath.
В результате Maven скомпилирует исходник в каталоге src и выполнит класс FileCopierWithCamel с JAR-файлом camel-core в classpath.
Все примеры в этой книге рассчитаны на то, что вы подключены к интернету, поскольку Apache Maven будет активно загружать JAR-зависимости. Общий размер скачанных по итогам выполнения всех примеров из этой книги библиотек составит несколько сот мегабайт.
Запустите команду Maven из папки chapter1/file-copy и после ее завершения перейдите в папку data/outbox, чтобы убедиться, что файл скопировался. Поздравляем, вы только что выполнили свой первый пример. Да, он очень простой, но теперь вы знаете, как запускать почти все остальные примеры из этой книги.
Component Options
The SCP component supports 3 options, which are listed below.
lazyStartProducer (producer)
Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the route to fail being started. By deferring this startup to be lazy then the startup failure can be handled during routing messages via Camel’s routing error handlers. Beware that when the first message is processed then creating and starting the producer may take a little time and prolong the total processing time of the processing.
verboseLogging (producer)
JSCH is verbose logging out of the box. Therefore we turn the logging down to DEBUG logging by default. But setting this option to true turns on the verbose logging again.
autowiredEnabled (advanced)
Whether autowiring is enabled. This is used for automatic autowiring options (the option must be marked as autowired) by looking up in the registry to find if there is a single instance of matching type, which then gets configured on the component. This can be used for automatic configuring JDBC data sources, JMS connection factories, AWS Clients, etc.
Шаблоны интеграции корпоративных приложений (EIP)
При всем разнообразии проблем интеграции многие из них, как заметили Грегор Хоп (Gregor Hohpe) и Бобби Вульф (Bobby Woolf), имеют сходные решения. Эти двое выпустили книгу «Enterprise Integration Patterns» (переведена на русский – «Шаблоны интеграции корпоративных приложений»), которую должен прочесть каждый, кто считает себя специалистом в области интеграции приложений. Кроме того, эта книга поможет вам гораздо быстрее и легче понять концепции Camel.
Шаблоны интеграции (EIP) полезны не только тем, что предлагают проверенные решения для тех или иных проблем интеграции, но также и потому, что упрощают описание и представление самих этих проблем, предоставляя соответствующую семантику. Camel в значительной степени основан на шаблонах EIP. Однако, хотя шаблоны EIP и описывают проблемы и решения, а также предоставляют общий словарь, этот словарь не формализован. Camel устраняет этот пробел, предоставляя язык для описания интеграционных решений. Между шаблонами, описанными в книге «Enterprise Integration Patterns», и предметным языком CamelDSL имеется почти взаимно однозначное соотношение.
What are Components?
Component act as an endpoint factory using which we can interact with external systems. Camel provides a large number of components using which we can interact with externals systems.
For example here we have to transfer files from one folder to another, so we make use of the file component at both the end of the message channel.
If suppose we have to transfer a file to a JMS Queue, then we make use of the File Component at one end and JMS Component at the other end.
In Apache Camel for creating a route we need to extend RouteBuilder class and override configure method. Then in configure method we define our route. So our route using Java DSL will be as follows-
Endpoint Options
The SCP endpoint is configured using URI syntax:
with the following path and query parameters:
Представляем Camel
Camel – это платформа интеграции приложений, созданная для того, чтобы работать продуктивно и с удовольствием. История Camel началась в 2007 году, и сегодня это зрелый проект с открытым кодом, который распространяется по лицензии Apache 2 и вокруг которого сложилось мощное сообщество разработки.
Основная задача Camel – упростить интеграцию. Мы надеемся, что, прочитав эту книгу, вы по достоинству оцените возможности Camel и включите его в свой арсенал обязательных инструментов.
Знакомство c Camel
Создавать комплексные системы с чистого листа – дело затратное и почти всегда обреченное на провал. Гораздо эффективнее и безопаснее собирать их как паззл из уже имеющихся и проверенных компонентов. В повседневной жизни мы часто полагаемся на такие интегрированные системы: от телефонной связи и финансовых транзакций до медицинских услуг и планирования поездок и развлечений.
Паззл можно собрать, только если у вас есть все его фрагменты, и они легко и надежно соединяются друг с другом. То же верно и для проектов по интеграции систем. Но если кусочки настоящего паззла созданы для того, чтобы сложиться в единую картинку, то с ИТ-системами дело обстоит, как правило, наоборот. Как разработчика, вас, как правило, не очень волнует внутреннее устройство и работа интегрируемых систем, вам гораздо интереснее, как взаимодействовать с ним извне. Хороший фреймворк (платформа) интеграции предполагает две вещи: во-первых, простой и удобный аппарат абстракций для описания сложных интегрируемых систем, а во-вторых, связующий механизм, позволяющий объединить их в единое целое.
Примером такой платформы является Apache Camel. Эта книга поможет понять, что такое Camel, как им пользоваться и почему мы считаем его одной из лучших платформ интеграции. Первая глава начинается со знакомства с Camel и описания его главных возможностей. Затем мы рассмотрим дистрибутив Camel и объясним, как выполнять приведенные в книге примеры. В конце главы мы представим основные концепции Camel, необходимые для понимания его архитектуры.
Готовы? Тогда встречайте Camel.
Активное сообщество разработки
У проекта Camel активное и деятельное сообщество, которое на момент написания этой книги живет и развивается уже более 10 лет. Наличие такого сообщества – это важный фактор при выборе ПО с открытым кодом для построения собственных приложений. Если проект неактивен, вы вряд ли можете рассчитывать на поддержку сообщества и остаетесь со своими проблемами один на один. И наоборот, участники активного проекта, такого как Camel, причем, как разработчики, так и простые пользователи, всегда готовы прийти на помощь.
Теперь, когда мы вкратце рассмотрели основные особенности Camel, пора перейти к практике: получить его дистрибутив и рассмотреть несколько примеров.
Предметно-ориентированный язык (DSL)
На момент появления Camel его главным вкладом в дело интеграции стал предметно-ориентированный язык (DSL). Со временем этому примеру последовали и другие интеграционные фреймворки, и теперь DSL есть в Java, XML и других языках программирования. DSL позволяет разработчику сфокусироваться на задачах интеграции, не отвлекаясь на особенности используемого инструмента (языка программирования). Рассмотрим парочку примеров DSL, которые используют разные форматы, но полностью эквивалентны по функциональности:
Рис. 1.3 DSL-языки Camel построены на основе популярных языков программирования вроде Java, поэтому вам доступны удобные и привычные функции IDE-среды.
На рисунке показано, как функция автозавершения при вводе в Eclipse IDE предлагает список возможных DSL-выражений.
Technology Stack
- Java 1.8
- Apache Camel 3.0.0-M2
- Maven
Маршрутизатор, не зависящий от формата полезной нагрузки
Camel умеет маршрутизировать полезные данные в любом виде, не ограничиваясь каким-то одним нормализованным форматом, например, полезной нагрузкой XML. Поэтому для маршрутизации нагрузки ее не надо преобразовывать в канонический формат.
Зачем использовать Camel
Camel – это практическое воплощение новых идей в области интеграции. Далее мы подробно рассмотрим возможности Camel, а пока что перечислим их:
- Механизм посредничества и маршрутизации
- Расширяемая библиотека компонентов
- Шаблоны интеграции корпоративных приложений (EIP)
- Предметно-ориентированный язык (DSL)
- Маршрутизатор, не зависящий от формата полезной нагрузки
- Архитектура на основе подключаемых модулей
- Модель Plain Old Java Object (POJO)
- Простота конфигурирования
- Автоматические конверторы типов
- Легковесное ядро, пригодное для встраивания в микросервисы
- Поддержка облачных технологий
- Пакет средств тестирования
- Активное сообщество разработки
Что такое Camel
Один из основополагающих принципов Camel состоит в том, что он не делает никаких предположений в отношении обрабатываемых данных. Это важный момент, поскольку он позволяет вам, как разработчику, интегрировать системы самых разных типов без преобразования данных в канонический формат.
Рис. 1.1 Camel – это связующее звено между не связанными друг с другом системами.
Благодаря абстракциям высокого уровня Camel позволяет применять одни и те же API для взаимодействия с разными системами, использующими разные протоколы и типы данных. API для конкретных протоколов и типов данных реализуются в виде соответствующих компонентов. По умолчанию, Camel поддерживает более 280 протоколов и типов данных, и благодаря расширяемой модульной архитектуре позволяет самостоятельно реализовать поддержку необходимых протоколов, как проприетарных, так и открытых. Это избавляет от ненужного преобразования данных и делает Camel не только более быстрым, но и менее прожорливым. Как следствие, Camel отлично подходит для встраивания в проекты, где требуются развитые возможности обработки. В частности, Camel уже используются для задач интеграции в таких проектах с открытым кодом, как Apache ServiceMix, Karaf и ActiveMQ.
Если при упоминании ESB вам сразу же приходят на ум сложные монструозные системы, то спешим успокоить: Camel с тем же успехом можно применять и в совсем маленьких вещах, наподобие микросервисов или шлюзов IoT (интернета вещей).
Чтобы понять, чем же является Camel, рассмотрим его основные функции.
Implementation
The maven project we will be creating is as follows-
The pom.xml will be as follows-
Path Parameters (3 parameters)
host (producer)
Required Hostname of the FTP server.
port (producer)
Port of the FTP server.
directoryName (producer)
The starting directory.
Загрузка и установки Camel
Camel доступен на сайте проекта Apache Camel. Там вы найдете список всех версий и ссылки для загрузки последнего релиза Camel.
В этой книге мы используем Camel 2.20.1. Чтобы получить эту версию, воспользуйтесь соответствующей ссылкой на странице загрузки. В конце этой страницы есть ссылки на два дистрибутива: zip-файл для Windows и tar.gz для macOS/Linux. Загрузите нужный файл и распакуйте его на локальный диск.
Откройте консоль и перейдите в папку, куда вы распаковали дистрибутив Camel. В ней будут следующие файлы:
Как видите, дистрибутив имеет простую и понятную структуру, а именно:
- doc – папка с руководством по Camel в формате HTML. Это просто копия сайта Camel на момент выпуска релиза. Она пригодится в те моменты, когда у вас нет доступа к сайту или нет под рукой этой книги
- examples – папка с 97 примерами Camel
- lib – папка со всеми библиотеками Camel. Позже мы покажем, как использовать Maven для простой загрузки зависимостей для компонентов, не входящих в ядро
- LICENSE.txt – файл с текстом лицензии на дистрибутив Camel. Поскольку это проект Apache, лицензия представляет собой Apache License, version 2.0
- NOTICE.txt – файл с информацией о авторских правах на сторонние зависимости, входящие в состав дистрибутива Camel
- README.txt – файл с кратким введением в Camel и перечнем ссылок, которые помогут новичкам быстро приступить к работе
Механизм посредничества и маршрутизации
Расширяемая библиотека компонентов
Camel имеет обширную библиотеку из более чем 280 компонентов, позволяющих ему подключаться через разнообразные транспорты, использовать различные API и понимать разные форматы данных. На Рис. 1.2. вы наверняка найдете технологии, которые уже использовали или хотели бы использовать. Разумеется, в рамках этой книги невозможно рассмотреть все компоненты Camel, но два десятка основных из них мы все же обсудим.
Рис. 1.2 Возможность подключиться к чему угодно: Camel поддерживает более 280 транспортов, API и форматов данных.
Table Of Contents :
Configuring Endpoint Options
Where you find yourself configuring the most is on endpoints, as endpoints often have many options, which allows you to configure what you need the endpoint to do. The options are also categorized into whether the endpoint is used as consumer (from) or as a producer (to), or used for both.
Configuring endpoints is most often done directly in the endpoint URI as path and query parameters. You can also use the Endpoint DSL as a type safe way of configuring endpoints.
A good practice when configuring options is to use Property Placeholders, which allows to not hardcode urls, port numbers, sensitive information, and other settings. In other words placeholders allows to externalize the configuration from your code, and gives more flexibility and reuse.
The following two sections lists all the options, firstly for the component followed by the endpoint.
Автоматические конверторы типов
В Camel есть встроенный механизм преобразования типов, имеющий более 350 конверторов. Вам больше на надо конфигурировать правила конвертирования, например, чтобы преобразовать массив байтов в строку. И даже если в Camel нет нужного конвертора, вы всегда можете написать его сами. А самое приятное, что все это работает автономно, без вашего участия.
Компоненты Camel тоже используют автоконвертирование типов, благодаря чему могут принимать большинство типов данных и преобразовывать их в тот тип, который способны использовать. В сообществе Camel эта функция входи в топ любимых, и кое-кто даже задается вопросом, почему ее нет в Java.
Архитектура на основе подключаемых модулей
Модульная архитектура Camel позволяет загружать в него любые компоненты, как входящие в комплект поставки, так и те, что созданы сторонними разработчиками, в том числе и вами. Кроме того, в Camel можно настроить почти все, многие его функции являются подключаемыми и настраиваемыми: генерация ID, управление потоками, последовательность завершения, кэширование стримов и многое другое.
Модель POJO
Bean-компоненты Java (или Plain Old Java Objects, POJO) в Camel являются гражданами первого сорта, поэтому в интеграционных проектах их можно использовать почти где угодно и когда угодно. Во многих случаях вы даже можете расширить встроенную функциональность Camel с помощью своего кода.
What is CamelContext?
- 1. Create CamelContext.
- 2. Add routes to the CamelContext.
- 3. Start the CamelContext. So that the Routes get executed.
- 4. Stop the Camel Context.
We define the CamelContext in the CamelMain class as follows- Run the Application. The Route will get executed to copy all content from folder input to the folder output.
Since Camel 2.10
Only producer is supported
The Camel-Jsch component supports the SCP protocol using the Client API of the Jsch project. Jsch is already used in camel by the FTP component for the sftp: protocol.
Maven users will need to add the following dependency to their pom.xml for this component:
What are Routes?
- Java DSL - A Java based DSL
- Spring XML - A XML based DSL in Spring XML files
URI format
The file name can be specified either in the part of the URI or as a "CamelFileName" header on the message ( Exchange.FILE_NAME if used in code).
Пакет средств тестирования
В состав Camel входит пакет для тестирования приложений. Этот пакет активно используется и для тестирования самого Camel и насчитывает более 18 тыс. модульных тестов. Пакет содержит специальные компоненты, позволяющие, например, сымитировать реальные конечные точки или задать ожидаемый результат, чтобы Camel мог проверить, отвечает ли приложение заданным требованиям или нет.
Configuring Component Options
The component level is the highest level which holds general and common configurations that are inherited by the endpoints. For example a component may have security settings, credentials for authentication, urls for network connection and so forth.
Some components only have a few options, and others may have many. Because components typically have pre configured defaults that are commonly used, then you may often only need to configure a few options on a component; or none at all.
Configuring components can be done with the Component DSL, in a configuration file (application.properties|yaml), or directly with Java code.
Приступая к работе
В этом разделе мы расскажем, как получить дистрибутив Camel, и вкратце опишем его содержимое. Затем мы покажем, как выполнять приведенные в этой книге примеры исходного кода с использованием Apache Maven.
Начнем с дистрибутива.
Поддержка облачных технологий
Camel не только ориентирован на облачное использование, но и предлагает множество компонентов для подключения к облачным сервисам, таким как:
- Amazon DynamoDB, EC2, Kinesis, SimpleDB, SES, SNS, SQS, SWF и S3
- Braintree (PayPal, Apple, Android Pay, и т. п.)
- Dropbox
- GitHub
- Google Big Query, Calendar, Drive, Mail и Pub Sub
- HipChat
- Salesforce
- и многим другим
Table Of Contents :
Читайте также: