Конфигурация конечных точек
Существует несколько различных подходов к конфигурированию компонентов и конечных точек.
Использование Java-кода
Вы можете явно настроить компонент, используя Java-код, как показано в этом примере:
SomeEndpoint endpoint = camelContext.getEndpoint("someURI", SomeEndpoint.class);
endpoint.setSomething("aValue");
Или Вы можете явно получить конечную точку и конфигурировать её используя код Java, как показано в Mock endpoint examples - Примеры заглушек для конечных точек.
Использование CDI
Вы можете использовать CDI как фреймворк для внедрения зависимостей для настройки ваших компонентов или экземпляров конечных точек.
Например, чтобы настроить компонент SJMS, вы можете объявить метод-производитель в CDI-бине:
class MyCdiComponent {
@PropertyInject("jms.maxConnections")
int maxConnections;
@Produces
@Named("sjms")
@ApplicationScoped
SjmsComponent sjms() {
SjmsComponent component = new SjmsComponent();
component.setConnectionFactory(new ActiveMQConnectionFactory("vm://broker?broker.persistent=false"));
component.setConnectionCount(maxConnections);
return component;
}
}
Затем компонент будет лениво загружен (lazy loading) Camel CDI всякий раз, когда он будет ссылаться, например, из Camel Java DSL:
class MyCdiRoute extends RouteBuilder {
@Override
public void configure() {
from("sjms:sample.queue")
.log("Received message [${body}]");
}
}
Кроме того, конечные точки этого компонента могут быть внедрены в любые CDI-бины, например:
class MyCdiBean {
@Inject
@Uri("sjms:sample.queue")
Endpoint endpoint;
}
Использование Spring XML
Вы можете настроить ваши компоненты или экземпляры конечных точек в Spring XML следующим образом:
<camelContext id="camel" xmlns="http://camel.apache.org/schema/spring">
<jmxAgent id="agent" disabled="true"/>
</camelContext>
<bean id="activemq" class="org.apache.activemq.camel.component.ActiveMQComponent">
<property name="connectionFactory">
<bean class="org.apache.activemq.ActiveMQConnectionFactory">
<property name="brokerURL" value="vm://localhost?broker.persistent=false&broker.useJmx=false"/>
</bean>
</property>
</bean>
Это позволяет вам настроить компонент с использованием заданного имени (activemq в приведенном выше примере), а затем вы можете обращаться к этому компоненту, используя activemq:[queue:|topic:]destinationName. Это работает за счет того, что SpringCamelContext используя ленивую политику извлекает компоненты из spring-контекста по имени схемы, которую вы используете для URI конечных точек.
Использование URI конечных точек
Еще один подход - использовать синтаксис URI. Синтаксис URI поддерживает нотацию запросов. Например, с компонентом Mail вы можете настроить свойство password через URI:
pop3://host:port?password=foo
Обращение к бинам из URI конечных точек
При настройке конечных точек с использованием синтаксиса URI вы можете ссылаться на бины в реестре, используя нотацию #bean:id.
Прежний синтаксис, используемый только #id, устарел в связи с его неоднозначностью, поскольку Camel поддерживает ряд дополнительных функций, которые начинаются с нотации #. |
Если значение параметра начинается с #bean:, то Camel будет искать в реестре бин данного типа. Например:
file://inbox?sorter=#bean:mySpecialFileSorter
Этот пример будет искать бин с идентификатором mySpecialFileSorter в реестре.
Camel также поддерживает обращение к бинам по типу их классу.
Обращение к бинам по class из URI конечных точек
Теперь при настройке конечных точек с использованием синтаксиса URI вы можете обращаться к бинам по его полному имени класса, используя нотацию #class:fullyQualifiedName. Если значение параметра начинается с #class:, то Camel загрузит класс с указанным именем и создаст экземпляр бина с использованием его конструктора без аргументов:
file://inbox?sorter=#class:com.foo.MySpecialSorter
Если вам нужно передать параметры в конструктор, то это также возможно (с ограничением до числовых, логических, литеральных значений и null):
file://inbox?sorter=#class:com.foo.MySpecialSorter(10, 'Hello world', true)
Обращение к бинам по типу через URI конечных точек
Теперь при настройке конечных точек с использованием синтаксиса URI, Вы можете обращаться к бинам по их типу, который используется для поиска бина по заданному типу в Registry [Реестре]. Если в реестре существует один бин заданного типа, то будет использован экземпляр этого бина; в ином случае будет выдано исключение.
file://inbox?idempotentRepository=#type:org.apache.camel.spi.IdempotentRepository
Настройка значений параметров с использованием необработанных значений, например, паролей
Начиная с Camel 2.11
При настройке параметров конечных точек с использованием синтаксиса URI значения по умолчанию имеют URI кодировку. Это может быть проблемой, если вы хотите настроить пароли и использовать значение как есть, без какого-либо кодирования. Например, у вас может быть знак плюса в пароле, который по умолчанию будет закодирован в десятичном виде.
Поэтому, начиная с версии Camel 2.11 и выше, мы упростили эту задачу, давая возможность указать, чтобы значение параметра рассматривалось как необработанное при использовании следующего синтаксиса RAW(value), т.е. значение, которое начинается с RAW( и заканчивается скобкой ).
Вот небольшой пример:
.to("ftp:joe@myftpserver.com?password=RAW(se+re?t&23)&binary=true")
В приведенном выше примере мы объявили значение пароля как необработанное, и фактический пароль будет использоваться как написан, например, se+re?t&23.
Использование плейсхолдеров свойств
Camel имеет обширную поддержку использования плейсхолдеров свойств, о чем можно прочитать подробнее здесь.
Например, в приведенном выше примере ftp мы можем вынести пароль в файл .properties.
Например, настройка заполнителя свойств при использовании XML DSL, где мы указываем расположение файла .properties. Хотя мы также можем определить это в Java-коде. Смотрите документацию для получения более подробной информации.
<camelContext>
<propertyPlaceholder id="properties" location="myftp.properties"/>
...
</camelContext>
Теперь маршрут Camel обращается к плейсхолдеру используя нотацию {{key}}:
.to("ftp:joe@myftpserver.com?password={{myFtpPassword}}&binary=true")
И имеет файл myftp.properties с паролем. Обратите внимание, что мы все еще определяем стиль RAW(value), чтобы убедиться, что пароль используется как есть (без кодировки):
myFtpPassword=RAW(se+re?t&23)
Вместо этого мы могли бы использовать RAW(value) в маршруте Camel:
.to("ftp:joe@myftpserver.com?password=RAW({{myFtpPassword}})&binary=true")
И тогда нам необходимо будет удалить RAW из файла свойств:
myFtpPassword=se+re?t&23
Обращайтесь к документации, чтобы узнать больше о плейсхолдерах свойств. В версии Camel 3.4 Вы можете использовать альтернативный способ, и вместо использования RAW обращаться к плейсхолдеру свойств по его ключу, как описано в следующем разделе.
Обращение к плейсхолдеру свойств
Начиная с Camel 3.4
При использовании {{key}} в настройке URI конечных точек Camel заменит {{key}} во время парсинга URI конечных точек. Это имеет свои плюсы, но также и несколько минусов, например, при использовании конфиденциальной информации, такой как пароли. Как мы видели в предыдущем разделе, Вы можете использовать синтаксис RAW(). Вместо использования RAW() Вы можете использовать нотацию #property:key, как показано в примере ниже:
.to("ftp:joe@myftpserver.com?password=#property:myFtpPassword&binary=true")
и в XML:
<to uri="ftp:joe@myftpserver.com?password=#property:myFtpPassword&binary=true"/>
Настройка URI используя конечные точки со стилем свойств бина
Начиная с Camel 2.15
Иногда настройка URI конечных точек может содержать много опций, и поэтому URI может стать длинным. В Java DSL вы можете разбить URI на новые строки, так как это просто Java-код, например, просто конкатенировать строку. При использовании XML DSL URI является атрибутом, например, <from uri="bla bla"/>. Начиная с Camel 2.15 вы можете настраивать конечную точку отдельно, а из маршрутов ссылаться на конечные точки, используя их сокращенные идентификаторы.
<camelContext>
<endpoint id="foo" uri="ftp://foo@myserver">
<property key="password" value="secret"/>
<property key="recursive" value="true"/>
<property key="ftpClient.dataTimeout" value="30000"/>
<property key="ftpClient.serverLanguageCode" value="fr"/>
</endpoint>
<route>
<from uri="ref:foo"/>
...
</route>
</camelContext>
В приведенном выше примере конечная точка с идентификатором foo определяется с использованием тега <endpoint>, который под капотом собирает его содержимое со всеми параметрами в URI, как если бы Вы определяли их непосредственно в URI.
Вы по-прежнему можете настраивать некоторые параметры в URI, а затем использовать <property> для дополнительных параметров или для переопределения параметров URI, например:
<endpoint id="foo" uri="ftp://foo@myserver?recursive=true">
<property key="password" value="secret"/>
<property key="ftpClient.dataTimeout" value="30000"/>
<property key="ftpClient.serverLanguageCode" value="fr"/>
</endpoint>
Настройка длинных URI, используя разбиение на несколько строк
Начиная с Camel 2.15
Иногда настройка URI конечных точек может содержать много опций, и поэтому URI может стать длинным. В Java DSL вы можете разбить URI на новые строки, так как это просто Java-код, например, просто конкатенировать строку. При использовании XML DSL URI является атрибутом, например, <from uri="bla bla"/>. Начиная с Camel 2.15 вы можете разбить атрибут URI с использованием новых строк, как показано ниже:
<route>
<from uri="ftp://foo@myserver?password=secret&
recursive=true&
ftpClient.dataTimeout=30000&
ftpClientConfig.serverLanguageCode=fr"/>
<to uri="bean:doSomething"/>
</route>
Обратите внимание, что все еще требуется экранировать & как & в XML. Также Вы можете указать несколько параметров в одной строке и получить тот же результат:
<route>
<from uri="ftp://foo@myserver?password=secret&
recursive=true&ftpClient.dataTimeout=30000&
ftpClientConfig.serverLanguageCode=fr"/>
<to uri="bean:doSomething"/>
</route>