...
You can define a proxy in the spring XML file as shown below Wiki Markup
The code is based on an unit test but proves the point: Wiki Markup
Proxy from Java
You can also create a proxy from regular Java using a org.apache.camel.component.bean.ProxyHelper
as shown below:
...
...
In Camel 2.3 you can use org.apache.camel.builder.ProxyBuilder
which may be easier to use than ProxyHelper: Wiki Markup
Proxy with Annotation
Another way to configure the proxy from java is by using the @Produce annotation. Also see POJO Producing.
...
This basically does the same as ProxyHelper.createProxy.
...
When using a proxy Camel will send the message payload as a org.apache.camel.component.bean.BeanInvocation
object (*Camel 2.15 or older) which holds the details of which method was invoked and what the argument was.From From Camel 2.16 onwards you can enable binding Camel parameter binding is enabled by default, which will use binding information from the method signature parameters to bind to the Exchange/Message with the following annotations
Annotation | Parameter Type | Binds Parameter binds to |
---|---|---|
@Body | Object | Binds the parameter to the message body |
@Header(name) | Object | Binds the parameter to the message header with the given name |
@Headers | Map | Binds the parameter to the message headers. The parameter is expected to be of java.util.Map type. |
@ExchangeProperty(name) | Object | Binds the parameter to the exchange property with the given name |
...
For example given the following interface
...
Then from Java DSL we can create a proxy and call the method
...
...
Which will send the message to the JMS queue foo, with the header(uuid)=1234 and body=Hello World. The message is sent as InOnly as the method is void.
The old behavior can be enabled by setting binding off, such as:
...
Turning the BeanInvocation into a first class payload
...
If you proxied method signature only have one parameter such as:
...
Then it gives another advantage in Camel as it allows Camel to regard the value passed in to this single parameter as the real payload. In other words if you pass in Camel
to the hello method, then Camel can see that as a java.lang.String
payload with the value of Camel
. This gives you a great advantage as you can use the proxy as first class services with Camel.
You can proxy Camel and let clients use the pure and clean interfaces as if Camel newer existed. Then Camel can proxy the invocation and receive the input passed into the single method parameter and regard that as if it was just the message payload.
...
...
From Camel 2.16 onwards this is improved as
...
binding is enabled out of the box, where Camel binds to the message parameters using the annotation listed in the table above. If a parameter has no annotation then the parameter is bound to the message body.
Okay lets try that with an example
...
At first we have the interface we wish to proxy Wiki Markup
Also what you should know is that Camel uses its Type Converter mechanism to adapt to the types defined on the methods.
...
Okay then we have the following route where we route using a Content Based Router that is XML based. See that we use XPath in the choices to route the message depending on its a book order or not. Wiki Markup Wiki Markup Wiki Markup
Asynchronous using Future
...
For example given this client interface Wiki Markup Wiki Markup
...