On Thu, Apr 30, 2009 at 4:00 PM, Willem Jiang <willem.ji...@gmail.com> wrote:
> How about introducing Async requestBody API to the template?
> It just return a Future object, then we can turn the value of Future
> into what we want.
Good idea. In fact I have done that already.

    Future<Object> requestAsyncBody(String endpoint, Object body);

But I wanted to start with a "raw" Exchange at first.
The idea is to have similar methods as the regular producer template,
so you can shoot in headers as well.

There is though something to think a bit more about is the exchange
patterns for inOnly how that can still have the need to return the
Future object as you might want to know when or if the task is done,
even thought there is no response for you.

So instead of void as return its probably gonna be something like Future.

I will later add another patch at the CAMEL-1572 ticket so you can
take a closer look at my experiments.





>
> Willem
>
> Claus Ibsen wrote:
>> Hi
>>
>> Its me again. Yeah I am due for a run in due time, but just wanted to
>> demo something that is either powerful or scary
>>
>> The code below uses the same route. But as we request a body and we
>> have declared we want the response as a String.class (the last
>> parameter)
>> Then Camel is "clever" or "scary" to use the Future to wait and get
>> the result and convert the body to the desired type, eg a String.
>>
>> So the routing is really divided into sync/async but the end user sees
>> it as a single sync.
>>
>>     public void testAsyncRouteWithTypeConverted() throws Exception {
>>         MockEndpoint mock = getMockEndpoint("mock:result");
>>         mock.expectedBodiesReceived("Bye World");
>>
>>         // send a request reply to the direct start endpoint, but will use
>>         // future type converter that will wait for the response
>>         String response = template.requestBody("direct:start",
>> "Hello", String.class);
>>         assertEquals("Bye World", response);
>>
>>         assertMockEndpointsSatisfied();
>>     }
>>
>> So whats next is that you can just pass in the Future<String.class> to
>> instruct Camel that you want the future handle back
>> and that it should return a String as the response.
>>
>> Then Camel should be able to take it from there. With the future
>> handle the caller gets back in control when the routes hits the
>> async() DSL.
>> And can do other work as he like.
>>
>> And when he want the response, he just:
>> Future<String> future = template.requestBody("direct:start", "Hello",
>> Future<String>.class);
>>
>> String response = future.get();
>>
>> But then I guess this is impossible due to type erasure in java generics :(
>> No its not!!!
>>
>> Okay time to hit the streets
>>
>>
>
>



-- 
Claus Ibsen
Apache Camel Committer

Open Source Integration: http://fusesource.com
Blog: http://davsclaus.blogspot.com/
Twitter: http://twitter.com/davsclaus
Apache Camel Reference Card:
http://refcardz.dzone.com/refcardz/enterprise-integration

Reply via email to