Hi Claus,

Thanks for your explanation.
Could you add the road map of call back support into the Camel 2.0
Design page[1]?

[1] http://camel.apache.org/camel-20-design.html

Willem

Claus Ibsen wrote:
> On Mon, May 11, 2009 at 9:32 AM, Willem Jiang <willem.ji...@gmail.com> wrote:
>> Hi Claus
>>
>> I really enjoy to read the document that you write.
>> You give me a good explanation and compare of Camel Sync and Async
>> processing API.
>>
>> Now I just have quick question for the replacement of old AsyncCallback
>> API Done().
>> Let's take the Asynchronous Request Only message sending as an example.
>>
>> The user could want to know if the request is processed succeed, but he
>> doesn't want to his sending client checks every Feature object for
>> return message, he just want to register a simple call back method for
>> doing some revert work if the message can't be processed rightly.
>>
>> How can the new Async API help us to implement this user story.
> The tip kinda explains that:
> 
> In case you want to know whether the Async Request Only failed, then
> you can use the Future handle and invoke get() and if it throws a
> ExecutionException then the processing failed. The caused exception is
> wrapped. You can invoke isDone() first to test whether the task is
> done or still in progress. Otherwise invoking get() will wait until
> the task is done.
> 
> 
> So if you want to check whether an exception occurred or not you can do
> 
> public boolean didTheJobSucceed(Future future) {
> try {
>   future.get();
>   return true;
> } catch (ExecutionException e) {
>   return false;
> }
> }
> 
> But its not 100% what you want as you want a callback that is invoked
> when the job is done.
> Well the JDK concurrency API does not support that easily. You can not
> register custom callbacks, that are automatic invoked when a task is
> complete.
> 
> 
> But dont dispair. In Camel we have the UnitOfWork for that. The idea
> is that its where end users and camel components can register
> callbacks
> when a Camel Exchange is complete or failed.
> 
> We have planned for Camel 2.1 to give this an overhaul as well, so we
> got nice syntax sugar in the DSL itself so you can easily add custom
> callbacks, that can be camel routes as well. Eg to easily send an
> email in case of a route failure.
> 
> In the mean time you can use the UnitOfWork and add a callback
> yourself from a processor.
> There is a addSynchronization method on the UoW
> 
> exchange.getUnitOfWork().addSynchronization(mySync)
> 
> 
> So Willem we will get this improved in the future as well. You can do
> it now but will be easier and nicer in Camel 2.1.
> Or if we find the time then we can maybe make it for 2.0 as well. I
> guess the main problem before holding it back was the old Async API
> that just got to complex and broken. So I do envision it should be not
> that hard to do now.
> 
> 
>> BTW, Since Spring store the transaction information in the thread local
>> variable , we need to make sure the rollback method is called in the
>> same thread, so this is common user story in camel.
> 
> Yeah for transactions you should not mix threads. This problem can
> occur if you use the async() DSL as it will submit a new task that are
> executed in a new thread. But for the client API using the
> ProducerTemplate there are no problem, as the transaction should
> usually not span both the client + "camel".
> 
> But for sure that is something you should consider when doing transactions.
> 
> Everyting has its pros/cons. Also async messaging.
> 
> 
> 
>> Willem
>>
>> Claus Ibsen wrote:
>>> On Fri, May 8, 2009 at 8:52 AM, Claus Ibsen <claus.ib...@gmail.com> wrote:
>>>> On Wed, May 6, 2009 at 3:41 PM, Gert Vanthienen
>>>> <gert.vanthie...@gmail.com> wrote:
>>>>> Hi Claus,
>>>>>
>>>>> Nice work on cleaning up the async API for Camel!  Using well-known
>>>>> java.util.concurrency classes to build the API is a good idea, makes
>>>>> it a lot more comprehensible for people.  Just a few questions that
>>>>> come to mind...
>>>>> - How does this work relate to introducing the Channel API?  Will we
>>>>> have a means for using async channels in the route transparently or
>>>>> are the two unrelated?
>>>>> - What happens with the original thread after the async()?  I'm
>>>>> guessing it will wait for the async work to be done before continuing,
>>>>> right?
>>>> I have just committed some improvements to the async DSL.
>>>> There is an option you can configure: waitForTaskToComplete.
>>>>
>>>> This option is an enum accepting 3 options
>>>> - Always
>>>> - Newer
>>>> - IfReplyExpected
>>>>
>>>> The first two options is self describing.
>>>> The last one will wait if the exchange is OUT capable, otherwise not.
>>>>
>>>> The current default is Always,
>>> I have given it some more thought and changed the default to
>>> IfReplyExpected, as its kinda what eg. JMS Mina and other components
>>> also does already.
>>>
>>> BTW: I have created a new wiki page for all this new Async API. Anyone
>>> care to read and review is much appreciated.
>>> http://camel.apache.org/async
>>>
>>>
>>>> However I am wondering if the default should be IfReplyExpected instead?
>>>> Then it works as JMS, Mina etc. that also only wait if a reply is expected.
>>>>
>>>> What do people think?
>>>>
>>>> Okay what is the difference between Always and IfReplyExpected then?
>>>> If for instance we send an InOut message then there are no difference,
>>>> they both wait.
>>>>
>>>> However if we send an InOnly then only Always will wait. So what can
>>>> that be used for?
>>>> Well in case the async task failed with an exception, and since we
>>>> wait, we will be notified
>>>> of this exception and have a chance to react then. That is the difference.
>>>>
>>>> Any thoughts?
>>>>
>>>>
>>>>
>>>>
>>>>> - Do all the threads come from a single thread pool?  Do we have a
>>>>> means to configure that pool?  I guess my main question is, how likely
>>>>> are we to deadlock the entire Route by having all the threads either
>>>>> waiting on some Future or waiting to get another thread from the pool?
>>>>>
>>>>> Just wondering if we could somehow put an Erlang-style message-passing
>>>>> concurrency mechanism underneath our Route afterwards -- in a
>>>>> transparent way so people wouldn't have to worry about this.
>>>>>
>>>>> Regards,
>>>>>
>>>>> Gert Vanthienen
>>>>> ------------------------
>>>>> Open Source SOA: http://fusesource.com
>>>>> Blog: http://gertvanthienen.blogspot.com/
>>>>>
>>>>>
>>>>>
>>>>> 2009/5/6 Claus Ibsen <claus.ib...@gmail.com>:
>>>>>> Hi
>>>>>>
>>>>>> Status update
>>>>>>
>>>>>> On Wed, May 6, 2009 at 9:17 AM, Claus Ibsen <claus.ib...@gmail.com> 
>>>>>> wrote:
>>>>>>> Hi
>>>>>>>
>>>>>>> I have committed first cut of the new Async API to Camel trunk.
>>>>>>> See ticket CAMEL-1572 for svn revision and details.
>>>>>>>
>>>>>>> The remaining work:
>>>>>>> - Migrate MulticastProcessor
>>>>>> DONE
>>>>>>
>>>>>>> - Remove last piece of old API classes (2 interfaces)
>>>>>> DONE
>>>>>>
>>>>>>> - Introduce Async DSL to replace Thread DSL and with clear intention
>>>>>>> of turning route into async mode and support thread pools using JDK
>>>>>>> executor service.
>>>>>>> - Support Jetty continuation with async
>>>>>>>
>>>>
>>>> --
>>>> 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
>>>> Interview with me:
>>>> http://architects.dzone.com/articles/interview-claus-ibsen-about?mz=7893-progress
>>>>
>>>
>>>
>>
> 
> 
> 

Reply via email to