Camel allows you to proxy a producer sending to an Endpoint by a regular interface. Then when clients using this interface can work with it as if its regular java code but in reality its proxied and does a Request Reply to a given endpoint.
Proxy from Spring
You can define a proxy in the spring XML file as shown belowNow the client can grab this bean using regular spring bean coding and invoke it as if its just another bean.
The code is based on an unit test but proves the point:
Proxy from Java
You can also create a proxy from regular Java using a
In Camel 2.3 you can use
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.
What is send on the Message
When using a proxy Camel will send the message payload as a
If a parameter does not have any annotation then the parameter is bound to the message body.
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
Available as of Camel 2.1
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
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
Example with proxy using single parameter methods.
At first we have the interface we wish to proxyNotice that all methods have single parameters. The return type is optional, as you can see one of them is void.
Also what you should know is that Camel uses its Type Converter mechanism to adapt to the types defined on the methods.
This allows us to easily use
Asynchronous using Future
Available as of Camel 2.8
By default the Camel Proxy invocation is synchronous when invoked from the client. If you want this to be asynchronous you define the return type to be of
For example given this client interfaceThe client can use this with a Camel Proxy as shown from the following snippet from an unit test: This allows you to fully define your client API without any Camel dependency at all, and decide whether the invocation should be synchronous or asynchronous.
If the Client is asynchronous (return type is Future) then Camel will continue processing the invocation using a thread pool which is being looked up using the key