44.3. Auto-Discovery and Configuration
44.3.1. Setting Up Auto-Discovery
Overview
Auto-discovery is a mechanism that enables you to dynamically add components to your Apache Camel application. The component URI prefix is used as a key to load components on demand. For example, if Apache Camel encounters the endpoint URI, activemq://MyQName, and the ActiveMQ endpoint is not yet loaded, Apache Camel searches for the component identified by the activemq prefix and dynamically loads the component.
Availability of component classes
Before configuring auto-discovery, you must ensure that your custom component classes are accessible from your current classpath. Typically, you bundle the custom component classes into a JAR file, and add the JAR file to your classpath.
Configuring auto-discovery
To enable auto-discovery of your component, create a Java properties file named after the component prefix, component-prefix, and store that file in the following location:
/META-INF/services/org/apache/camel/component/component-prefix
The component-prefix properties file must contain the following property setting:
class=component-class-name
Where component-class-name is the fully-qualified name of your custom component class. You can also define additional system property settings in this file.
Example
For example, you can enable auto-discovery for the Apache Camel FTP component by creating the following Java properties file:
/META-INF/services/org/apache/camel/component/ftp
Which contains the following Java property setting:
class=org.apache.camel.component.file.remote.RemoteFileComponent
Note
The Java properties file for the FTP component is already defined in the JAR file,
camel-ftp-
Version.jar
.
44.3.2. Configuring a Component
Overview
You can add a component by configuring it in the Apache Camel Spring configuration file,
META-INF/spring/camel-context.xml
. To find the component, the component's URI prefix is matched against the ID attribute of a bean
element in the Spring configuration. If the component prefix matches a bean element ID, Apache Camel instantiates the referenced class and injects the properties specified in the Spring configuration.
Note
This mechanism has priority over auto-discovery. If the CamelContext finds a Spring bean with the requisite ID, it will not attempt to find the component using auto-discovery.
Define bean properties on your component class
If there are any properties that you want to inject into your component class, define them as bean properties. For example:
public class CustomComponent extends DefaultComponent<CustomExchange> { ... PropType getProperty() { ... } void setProperty(PropType v) { ... } }
The
getProperty()
method and the setProperty()
method access the value of property.
Configure the component in Spring
To configure a component in Spring, edit the configuration file,
META-INF/spring/camel-context.xml
, as shown in Example 44.1, “Configuring a Component in Spring”.
Example 44.1. Configuring a Component in Spring
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd"> <camelContext id="camel" xmlns="http://camel.apache.org/schema/spring"> <package>RouteBuilderPackage</package> </camelContext> <bean id="component-prefix" class="component-class-name"> <property name="property" value="propertyValue"/> </bean> </beans>
The
bean
element with ID component-prefix configures the component-class-name component. You can inject properties into the component instance using property
elements. For example, the property
element in the preceding example would inject the value, propertyValue, into the property property by calling setProperty()
on the component.
Examples
Example 44.2, “JMS Component Spring Configuration” shows an example of how to configure the Apache Camel's JMS component by defining a bean element with ID equal to
jms
. These settings are added to the Spring configuration file, camel-context.xml
.
Example 44.2. JMS Component Spring Configuration
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd"> <camelContext id="camel" xmlns="http://camel.apache.org/schema/spring"> <package>org.apache.camel.example.spring</package> 1 </camelContext> <bean id="jms" class="org.apache.camel.component.jms.JmsComponent"> 2 <property name="connectionFactory"> 3 <bean class="org.apache.activemq.ActiveMQConnectionFactory"> <property name="brokerURL" value="vm://localhost?broker.persistent=false&broker.useJmx=false"/> 4 </bean> </property> </bean> </beans>
- 1
- The
CamelContext
automatically instantiates anyRouteBuilder
classes that it finds in the specified Java package, org.apache.camel.example.spring. - 2
- The bean element with ID,
jms
, configures the JMS component. The bean ID corresponds to the component's URI prefix. For example, if a route specifies an endpoint with the URI, jms://MyQName, Apache Camel automatically loads the JMS component using the settings from thejms
bean element. - 3
- JMS is just a wrapper for a messaging service. You must specify the concrete implementation of the messaging system by setting the
connectionFactory
property on theJmsComponent
class. - 4
- In this example, the concrete implementation of the JMS messaging service is Apache ActiveMQ. The
brokerURL
property initializes a connection to an ActiveMQ broker instance, where the message broker is embedded in the local Java virtual machine (JVM). If a broker is not already present in the JVM, ActiveMQ will instantiate it with the optionsbroker.persistent=false
(the broker does not persist messages) andbroker.useJmx=false
(the broker does not open a JMX port).