[ https://issues.apache.org/jira/browse/TUSCANY-3957?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Greg Dritschler updated TUSCANY-3957: ------------------------------------- Attachment: TUSCANY-3957.patch > Endpoint references are not registered in domain registry > --------------------------------------------------------- > > Key: TUSCANY-3957 > URL: https://issues.apache.org/jira/browse/TUSCANY-3957 > Project: Tuscany > Issue Type: Bug > Affects Versions: Java-SCA-2.0 > Reporter: Greg Dritschler > Priority: Minor > Attachments: TUSCANY-3957.patch > > > EndpointReferences are not always registered in the domain registry. This > causes a problem in the following scenario with asynchronous invocation. > 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()); > } > I see this code in CompositeActivator to add an EndpointReference to the > domain registry. > // 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. There should be code to register the epr when it's bound > after start time. I am attaching a patch to do this. I realize 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. -- This message is automatically generated by JIRA. If you think it was sent incorrectly, please contact your JIRA administrators: https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa For more information on JIRA, see: http://www.atlassian.com/software/jira