| [[WritingComponents-WritingComponents]] |
| === Writing Components |
| |
| Apache Camel is designed to make it very easy to drop in new components |
| whether they be routing components, transformers, transports etc. The |
| idea of a component is to be a factory and manager of |
| link:endpoint.adoc[Endpoints]. |
| |
| Here are the main steps to writing a component: |
| |
| * Write a POJO which implements the |
| http://activemq.apache.org/camel/maven/current/camel-core/apidocs/org/apache/camel/Component.html[Component] |
| interface. The simplest approach is just to derive from |
| http://activemq.apache.org/camel/maven/current/camel-core/apidocs/org/apache/camel/impl/DefaultComponent.html[DefaultComponent]. |
| * To support auto-discovery of your component add a file to |
| `META-INF/services/org/apache/camel/component/FOO` where FOO is the URI |
| scheme for your component and any related endpoints created on the fly. |
| The latter file should contain the definition of the component class. |
| For example if your component is implemented by the |
| `com.example.CustomComponent` class, the service file should contain the |
| following line -- `class=com.example.CustomComponent`. |
| |
| Users can then either explicitly create your component, configure it and |
| register with a |
| http://camel.apache.org/maven/current/camel-core/apidocs/org/apache/camel/CamelContext.html[CamelContext] |
| or users can use a URI which auto-creates your component. |
| |
| [[WritingComponents-WritingEndpoints]] |
| ==== Writing Endpoints |
| |
| When implementing an link:endpoint.adoc[Endpoint] you typically may |
| implement one or more of the following methods: |
| |
| * http://camel.apache.org/maven/current/camel-core/apidocs/org/apache/camel/Endpoint.html#createProducer()[createProducer()] |
| will create a |
| http://camel.apache.org/maven/current/camel-core/apidocs/org/apache/camel/Producer.html[Producer] |
| for sending message exchanges to the endpoint |
| * http://camel.apache.org/maven/current/camel-core/apidocs/org/apache/camel/Endpoint.html#createConsumer(org.apache.camel.Processor)[createConsumer()] |
| implements the link:event-driven-consumer.adoc[Event Driven Consumer] |
| pattern for consuming message exchanges from the endpoint via a |
| http://camel.apache.org/maven/current/camel-core/apidocs/org/apache/camel/Processor.html[Processor] |
| when creating a |
| http://camel.apache.org/maven/current/camel-core/apidocs/org/apache/camel/Consumer.html[Consumer] |
| * http://camel.apache.org/maven/current/camel-core/apidocs/org/apache/camel/Endpoint.html#createPollingConsumer()[createPollingConsumer()] |
| implements the link:polling-consumer.adoc[Polling Consumer] pattern for |
| consuming message exchanges from the endpoint via a |
| http://camel.apache.org/maven/current/camel-core/apidocs/org/apache/camel/PollingConsumer.html[PollingConsumer] |
| |
| Typically you just derive from |
| http://camel.apache.org/maven/current/camel-core/apidocs/org/apache/camel/impl/DefaultEndpoint.html[DefaultEndpoint] |
| and implement the |
| http://camel.apache.org/maven/current/camel-core/apidocs/org/apache/camel/Endpoint.html#createProducer()[createProducer()] |
| and / or |
| http://camel.apache.org/maven/current/camel-core/apidocs/org/apache/camel/Endpoint.html#createConsumer(org.apache.camel.Processor)[createConsumer()] |
| methods. The |
| http://camel.apache.org/maven/current/camel-core/apidocs/org/apache/camel/Endpoint.html#createPollingConsumer()[createPollingConsumer()] |
| method will be created by default for you in the |
| http://camel.apache.org/maven/current/camel-core/apidocs/org/apache/camel/impl/DefaultEndpoint.html[DefaultEndpoint] |
| class. |
| |
| If your endpoint is a polling-centric component you can derive from |
| http://camel.apache.org/maven/current/camel-core/apidocs/org/apache/camel/impl/DefaultPollingEndpoint.html[DefaultPollingEndpoint] |
| and then implement |
| http://camel.apache.org/maven/current/camel-core/apidocs/org/apache/camel/Endpoint.html#createPollingConsumer()[createPollingConsumer()]; |
| the |
| http://camel.apache.org/maven/current/camel-core/apidocs/org/apache/camel/Endpoint.html#createConsumer(org.apache.camel.Processor)[createConsumer()] |
| method will be created for you which avoids you having to write any |
| polling code. |
| |
| [[WritingComponents-AnnotatingyourEndpoint]] |
| ==== Annotating your Endpoint |
| |
| As of *Camel 2.12* if you want to benefit from the automatic generation |
| of HTML documentation for all the parameters on your endpoint as part of |
| the maven site reports, you need to |
| link:endpoint-annotations.adoc[annotate your Endpoint's parameters]. |
| |
| So this means you add a `@UriEndpoint` annotation to your Endpoint class |
| and then annotate each parameter you wish to be configured via the URI |
| configuration mechanism with `@UriParam` (or `@UriParams` for nested |
| configuration objects). |
| |
| In addition its recommended that your Component implementation inherit |
| from the UriEndpointComponent base class as that means your Component |
| will automatically generate better metadata for the |
| link:componentconfiguration.adoc[ComponentConfiguration] API. |
| |
| Refer to the link:endpoint-annotations.adoc[Endpoint Annotations guide |
| for details]. |
| |
| [[WritingComponents-UsingaProcessor]] |
| ==== Using a Processor |
| |
| If you are writing a simple endpoint which just processes messages in |
| some way, you can just implement a link:processor.adoc[Processor] and |
| link:processor.adoc[use that to create an endpoint]. |
| |
| [[WritingComponents-Dependencyinjectionandauto-discovery]] |
| ==== Dependency injection and auto-discovery |
| |
| When using auto-discovery the CamelContext will default to its |
| link:injector.adoc[Injector] implementation to inject any required or |
| optional dependencies on the component. This allows you to use |
| auto-discovery of components via link:uris.adoc[URIs] while still |
| getting the benefits of dependency injection. |
| |
| For example your component can depend on a JDBC DataSource or JMS |
| ConnectionFactory which can be provided in the ApplicationContext in |
| Spring or Module in Guice. |
| |
| So you can if you prefer configure your Component using an IoC framework |
| like Spring or Guice; then add it to the CamelContext. Or you can let |
| the Component auto-inject itself as the endpoints are auto-discovered. |
| |
| [[WritingComponents-Options]] |
| ==== Options |
| |
| If your component has options you can let it have public getters/setters |
| and Camel will automatically set the properties when the endpoint is |
| created. If you however want to take the matter in your own hands, then |
| you must remove the option from the given parameter list as Camel will |
| validate that all options are used. If not Camel will throw a |
| ResolveEndpointFailedException stating some of the options are unknown. |
| |
| The parameters is provided by Camel in the createEndpoint method from |
| DefaultComponent: |
| |
| [source,java] |
| ---- |
| protected abstract Endpoint<E> createEndpoint(String uri, String remaining, Map parameters) |
| ---- |
| |
| The code is an example from the <<seda-component,SEDA>> component that removes the size |
| parameter: |
| |
| [source,java] |
| ---- |
| public BlockingQueue<Exchange> createQueue(String uri, Map parameters) { |
| int size = 1000; |
| Object value = parameters.remove("size"); |
| if (value != null) { |
| Integer i = convertTo(Integer.class, value); |
| if (i != null) { |
| size = i; |
| } |
| } |
| return new LinkedBlockingQueue<Exchange>(size); |
| } |
| ---- |
| |
| [[WritingComponents-SeeAlso]] |
| ==== See Also |
| |
| * link:configuring-camel.adoc[Configuring Camel] |
| * link:endpoint.adoc[Endpoint] |
| * link:component.adoc[Component] |
| * http://camel.apache.org/creating-a-new-camel-component.html[Creating a |
| new Camel Component with Maven] |