I've submitted TUSCANY-3957.  I chickened out on registering endpoints that
aren't yet bound.  I played it safe and did it in the course of initializing
the invocation chains when the endpoint ref is driven.

On Wed, Sep 28, 2011 at 12:19 PM, Greg Dritschler <greg.dritsch...@gmail.com
> wrote:

> Simon,
>
> Hmm, that does sound a lot simpler.  Let me think about that.
>
>
> On Wed, Sep 28, 2011 at 11:07 AM, Simon Laws <simonsl...@googlemail.com>wrote:
>
>> On Wed, Sep 28, 2011 at 3:55 PM, Greg Dritschler
>> <greg.dritsch...@gmail.com> wrote:
>> > I have a question pertaining to asynchronous services.  In my scenario,
>> the
>> > asynchronous service implementation serializes the ResponseDispatch
>> object,
>> > tucks it away, and deserializes it later when it is ready to respond.
>> >  Deserialization drives the readObject method in AsyncResponseInvoker.
>> >  Let's say the AsyncResponseInvoker was set up such that the target
>> address
>> > is an EPR.  In this case readObject is going to try to relocate the EPR
>> in
>> > the domain registry.
>> >    if (responseTargetAddress instanceof EndpointReference){
>> >        // fix the target as in this case it will be an EPR
>> >        EndpointReference epr = (EndpointReference)responseTargetAddress;
>> >        responseTargetAddress =
>> (T)retrieveEndpointReference(epr.getURI());
>> >    }
>> > My question is, when is the EPR added to the domain registry?
>> > I see this code in CompositeActivator:
>> >             // If the reference is already resolved then start it now.
>> This
>> > currently
>> >             // important for async references which have native async
>> > bindings as the
>> >             // reference provider has to register a response listener
>> > regardless of
>> >             // whether the reference has been used or not.
>> >             if (epr.getStatus() ==
>> > EndpointReference.Status.WIRED_TARGET_FOUND_AND_MATCHED ||
>> >                 epr.getStatus() ==
>> > EndpointReference.Status.RESOLVED_BINDING){
>> >
>> >                 // As we only care about starting references at build
>> time
>> > in the
>> >                 // async case at the moment check that the binding
>> supports
>> > native async
>> >                 // and that the reference is an async reference
>> >                 ReferenceBindingProvider bindingProvider =
>> > epr.getBindingProvider();
>> >                 if (bindingProvider instanceof
>> > EndpointReferenceAsyncProvider &&
>> >
>> > ((EndpointReferenceAsyncProvider)bindingProvider).supportsNativeAsync()
>> &&
>> >                     epr.isAsyncInvocation()){
>> >                     // it's resolved so start it now
>> >                     try {
>> >                         start(compositeContext, epr);
>> >                     } catch (Throwable ex){
>> >                         Monitor.error(monitor, this, "core-messages",
>> > "StartException", ex);
>> >                         rethrow(ex);
>> >                     }
>> >                 }
>> > The call to start(compositeContext, epr) will add the epr to the
>> registry.
>> >  So this code handles the case where the endpoint reference target is
>> > resolved at start time.  It seems like there should be code in the
>> > EndpointReferenceBinder to register the epr when it's bound after start
>> time
>> > but I can't find it.  Should we add it?
>> >
>> > I realize that even if we update the binder, this still leaves a window
>> > between start and the first use of a reference where the epr is not
>> > registered in the domain.  This is not something I need to address in my
>> > scenario.
>> > Greg
>>
>> Hi
>>
>> I have a feeling there used the code but I can't find it. I'd have no
>> objection to adding it. The window leaves an inconsistency. Maybe we
>> should always register then and rely on the status to tell us what's
>> happening.
>>
>> Simon
>>
>> --
>> Apache Tuscany committer: tuscany.apache.org
>> Co-author of a book about Tuscany and SCA: tuscanyinaction.com
>>
>
>

Reply via email to