[
https://issues.apache.org/jira/browse/TUSCANY-3464?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12839385#action_12839385
]
Simon Nash commented on TUSCANY-3464:
-------------------------------------
The first version of the program doesn't work because of a limitation in SCA.
The SCA assembly model spec defines the wiredByImpl attribute, but the SCA Java
specs don't provide any standardized way to use this capability from Java,
The program tries to work around this SCA Java limitation by using Tuscany's
Node.getServiceReference() method. This method returns a service reference
which works for forward calls but doesn't support callbacks. This is
consistent with the semantics of the SCAClient interface in the OASIS SCA 1.1
specs, which has the same limitation of not supporting callbacks.
The Node.getServiceReference() method doesn't support callbacks because of the
difficulty identifying the SCA component to which the callback should be
directed. (The API doesn't allow any identification of this component to be
passed.) In the test scenario, the calls to the Node.getServiceReference()
method are made from the SCAObserverCallback class, which isn't part of any SCA
component. The scenario requires the callback to be made to the
ObserverXComponent component from which the forward call through the service
reference was made, but this callback component information isn't available to
the Tuscany runtime.
To resolve this issue, the SCA API should be extended to provide support for
wiredByImpl by adding a capability to dynamically provide a target for an SCA
Java reference which includes the ability to make SCA callbacks. An issue was
opened for the wiredBy Impl problem in OASIS (see
http://www.osoa.org/jira/browse/JAVA-78) but this issue was closed with no
action.
The second version of the program works around this SCA limitation by not using
SCA callbacks and instead simulates callback semantics through other means.
This seems a reasonable approach until the underlying SCA limitation is
removed. However the need to make an unnecessary "toString" call in order to
make the rest of the scenario work seems like a problem that should be
investigated.
It's also a problem that the invalid callback attempt just hangs. The Tuscany
runtime should throw an exception indicating that a callback has been attempted
through a dynamically created service reference that doesn't support this
capability.
> Invocation of Dynamically Registered Callbacks Gets Stuck without Exception
> ---------------------------------------------------------------------------
>
> Key: TUSCANY-3464
> URL: https://issues.apache.org/jira/browse/TUSCANY-3464
> Project: Tuscany
> Issue Type: Bug
> Components: Java SCA Core Runtime
> Affects Versions: Java-SCA-2.0-M3
> Environment: Mac OS X 10.5 and 10.6, JavaSE 1.6, Apache Tuscany 2.0M4
> and also a recent nightly build.
> Reporter: Ivan Krizsan
> Attachments: SCAObserverCallback.zip, SCAObserverCallback.zip
>
>
> Further explorations of callbacks in Tuscany 2.0M4. I have the following
> scenario:
> - Two Observer SCA components.
> Each component has a reference to an Observable component with the
> wiredByImpl="true".
> - One Observable SCA component.
> This component has a callback with the interface of the Observer component as
> parameter, but no callback is injected in the component.
> To register for notifications, an Observer calls register on anObservable,
> without any parameters.
> In the Observable, a callback service reference is retrieved like this:
> ServiceReference<ObserverService> theObserverRef =
> mRequestContext.getCallbackReference();
> This service reference is stored and later, when a periodic task is run, an
> attempt is made to call all the Observer components that have registered with
> the Observable, like this:
> for (ServiceReference<ObserverService> theObserverRef : mObservers.values())
> {
> theObserverRef.getService().notify("" + theCurrentTime);
> }
> This fails - the call to notify never returns and there are no error messages
> or exceptions in the log.
> If I try to call the callback when it registers, there is an exception and a
> complaint about "No callback wire found".
> Is it possible to use callbacks in the way described above?
> Service Component Architecture SCA-J Common Annotations and APIs
> Specification, version 1.1, in section 7.2.4 says:
> "Because ServiceReference objects are serializable, they can be stored
> persistently and retrieved at
> a later time to make a callback invocation after the associated service
> request has completed."
> ...so I was lead to believe that my scenario would be possible.
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.