It seems in the cases that I've observed this pattern that we don't
actually do anything asynchronously. We call a method that has the word
"Async" in it typically, but this method does everything in sequence and
then returns a "future" object. The calling code then calls get() on the
future object, which returns immediately because everything was executed in
sequence in the "Async" method.

I was curious, were we planning on making many of these operations truly
asynchronous in the future?

If not, I wonder if there's a bit of over-engineering going on here? If
they are always going to be done synchronously, we could just call the
"callback" method after calling the "async" method.

Thoughts on this?

Thanks :)


On Tue, Jan 28, 2014 at 3:42 PM, Kelven Yang <kelven.y...@citrix.com> wrote:

> I originally thought to just ask developer to use plain string literals,
> it has better readability but it can't take advantage of IDE provided
> refactoring (callback method renames), it ended up to this crazy approach.
> Hopefully one day Java may provide C# delegate like feature, then all
> these hacking tricks can go away
>
> Kelven
>
> On 1/28/14, 2:29 PM, "Mike Tutkowski" <mike.tutkow...@solidfire.com>
> wrote:
>
> >I see...just for chaining purposes. In some places I notice we chain this
> >and in others we don't.
> >
> >Thanks for the clarification!
> >
> >
> >On Tue, Jan 28, 2014 at 3:13 PM, Kelven Yang <kelven.y...@citrix.com>
> >wrote:
> >
> >> This is to support fluent coding style to chain all the callback setup
> >> calls in one line. Using caller.getTarget().callbackMethod() alone may
> >> cause people to think the statement as a logic requirement and actually
> >>it
> >> is not but hackings.
> >>
> >> It is like to setup a function pointer in C or delegate in C#, but it is
> >> kind of alien in Java world since Java does not have language level
> >> support for this yet.
> >>
> >> Kelven
> >>
> >> On 1/28/14, 11:06 AM, "Mike Tutkowski" <mike.tutkow...@solidfire.com>
> >> wrote:
> >>
> >> >Thanks Kelven
> >> >
> >> >Yeah, that code is pretty crazy. :)
> >> >
> >> >I followed that the getTarget() method actually dynamically extends a
> >> >class
> >> >and allows us to inject logic in the new class that enables us to save
> >> >createVolumeFromBaseImageCallBack as the method we want to invoke when
> >>our
> >> >async operation has completed.
> >> >
> >> >It does provide the benefit that you don't have to pass in a string
> >>that
> >> >represents the method name.
> >> >
> >> >What I was actually wondering about, though, is why we surround
> >> >caller.getTarget().createVolumeFromBaseImageCallBack(null, null); with
> >> >caller.setCallback();?
> >> >
> >> >It seems that setCallback() ignores the input parameter and just
> >>returns
> >> >"this";
> >> >
> >> >Wouldn't caller.getTarget().createVolumeFromBaseImageCallBack(null,
> >>null);
> >> >by itself work exactly the same way?
> >> >
> >> >
> >> >On Tue, Jan 28, 2014 at 11:57 AM, Kelven Yang
> >> ><kelven.y...@citrix.com>wrote:
> >> >
> >> >> Mike,
> >> >>
> >> >> This is a very dirty hack that I personally hate it. This is the
> >>hack to
> >> >> utilize Eclipse¹s (or other smart IDE) to do auto-completion for you
> >>to
> >> >> find the right callback method.
> >> >>
> >> >> if you write
> >> >>
> >> >>     caller.getTarget().createVolumeFromBaseImageCallBack(null, null);
> >> >>
> >> >> Java will interprete it as a standalone method call,
> >> >>
> >> >>
> >> >> If you write as below, it tries to tell that this is to setup a
> >> >>callback,
> >> >> to return this in caller.setCallback is to let you continue to use
> >> >>fluent
> >> >> style to callback setups
> >> >>
> >> >>     caller.setCallback(
> >> >> caller.getTarget().createVolumeFromBaseImageCallBack(null, null) );,
> >> >>
> >> >> Behind scene, it uses CGLIB for dispatcher to figure out which
> >>method is
> >> >> the callback without requiring developer to give it as literal string
> >> >>
> >> >>
> >> >> AsyncMethod pattern is used commonly in parallel algorithms to
> >> >>dynamically
> >> >> branch out sub-calculations, I think it does not fit well in
> >>CloudStack,
> >> >> and also due to the lack of language feature in Java,   this hacking
> >> >> technique makes the code really hard to read
> >> >>
> >> >> Kelven
> >> >>
> >> >> On 1/27/14, 6:55 PM, "Mike Tutkowski" <mike.tutkow...@solidfire.com>
> >> >> wrote:
> >> >>
> >> >> >Hi,
> >> >> >
> >> >> >I've been looking at our callback pattern.
> >> >> >
> >> >> >Can someone explain why we always seem to do this?:
> >> >> >
> >> >>
> >>
> >>>>>caller.setCallback(caller.getTarget().createVolumeFromBaseImageCallBac
> >>>>>k(
> >> >>>nu
> >> >> >ll,
> >> >> >null));
> >> >> >
> >> >> >When setCallback is implemented like this:
> >> >> >
> >> >> >public AsyncCallbackDispatcher<T, R> setCallback(Object useless) {
> >> >> >
> >> >> >    return this;
> >> >> >
> >> >> > }
> >> >> >
> >> >> >Why not just this?:
> >> >> >
> >> >> >caller.getTarget().createVolumeFromBaseImageCallBack(null, null);
> >> >> >
> >> >> >Thanks!
> >> >> >
> >> >> >--
> >> >> >*Mike Tutkowski*
> >> >> >*Senior CloudStack Developer, SolidFire Inc.*
> >> >> >e: mike.tutkow...@solidfire.com
> >> >> >o: 303.746.7302
> >> >> >Advancing the way the world uses the
> >> >> >cloud<http://solidfire.com/solution/overview/?video=play>
> >> >> >* *
> >> >>
> >> >>
> >> >
> >> >
> >> >--
> >> >*Mike Tutkowski*
> >> >*Senior CloudStack Developer, SolidFire Inc.*
> >> >e: mike.tutkow...@solidfire.com
> >> >o: 303.746.7302
> >> >Advancing the way the world uses the
> >> >cloud<http://solidfire.com/solution/overview/?video=play>
> >> >*(tm)*
> >>
> >>
> >
> >
> >--
> >*Mike Tutkowski*
> >*Senior CloudStack Developer, SolidFire Inc.*
> >e: mike.tutkow...@solidfire.com
> >o: 303.746.7302
> >Advancing the way the world uses the
> >cloud<http://solidfire.com/solution/overview/?video=play>
> >*(tm)*
>
>


-- 
*Mike Tutkowski*
*Senior CloudStack Developer, SolidFire Inc.*
e: mike.tutkow...@solidfire.com
o: 303.746.7302
Advancing the way the world uses the
cloud<http://solidfire.com/solution/overview/?video=play>
*(tm)*

Reply via email to