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

Reply via email to