[Date Prev] | [Thread Prev] | [Thread Next] | [Date Next] -- [Date Index] | [Thread Index] | [List Home]
Subject: Issue 127: Proposed modified proposal
[cc'ing Chen, our JAX-WS expert, who wrote this proposal] [Note: In addition, to suggesting a different interface, the proposal below also tries to rationalize what SCA-J does with what would make sense from a JAX-WS.next POV.] Issue 127 proposal [1] [2] reuses the javax.xml.ws.AsyncHandler interface, which was originally designed for JAX-WS client-side async, for the server-side programming model. The java doc for AsyncHandler says: "The AsyncHandler interface is implemented by clients that wish to receive callback notification of the completion of service endpoint operations invoked asynchronously." This is little bit different than the use case that we are trying to solve on the server-side. While it makes sense to try and reuse existing interfaces, in this case we would like to suggest creating a new interface that is more appropriate for the use case. The example in the proposal, is incorrect in that the handleResponse() of the AsyncHandler<T> interface is handleResponse(Response<T> res) instead of handleResponse(T res). The application code must use an instance of Response<Float> object, instead of just Float. We believe this is awkward in that it forces the application developer to implement the javax.xml.ws.Response<T> interface and the methods required by its super interface java.util.concurrent.Future<T> in order to satisfy the AsyncHandler. Instead of reusing the client-side AsyncHandler on the server-side programming model, we would like to propose a new ResponseDispatch interface for this usage: public interface StockQuote { void getPriceAsync(String ticker, ResponseDispatch<Float> dis); } The ResponseDispatch object is the mechanism by which the service implementation sends back the response message resulting from the invocation of the service method. The ResponseDispatch is serializable and it can be invoked once at any time after the invocation of the service method, either before or after the service method returns. This enables the service implementation to store the ResponseDispatch in serialized form and release resources while waiting for the completion of whatever activities result from the processing of the initial invocation. The ResponseDispatch object is allocated by JAX-WS container implementation and is expected to contain whatever metadata is required to deliver the response message back to the client that invoked the service operation. The method using ResponseDispatch must have a void return, and must not use javax.xml.ws.Holder as parameter. The ResponseDispatch also has the API to send faults; the application may chose to use a data-bound Service Exception (annotated with @WebFault) or SOAPFaultException for arbitrary fault. public interface ResponseDispatch<T> { void sendResponse(T res); void sendFault(Throwable e); Map<String, Object> getContext(); } A long running async method MUST use the sendFault method to send faults back to the client, instead of throwing the service exception during the invocation of the async method. Throwing an exception during the invocation of the business method should be interpreted as a system error, and the container may be configured to re-deliver the request if the container implementation supports such a feature; the request re-delivering is implementation specific and is not specified in this proposal. The Service Exceptions for an async method should not be declared using the throw clause. The new new @AsyncFault annotation is introduced for async method to describe Service Exceptions: //This example is borrowed from the presentation at [2] @AsyncFault({ServiceBusinessException.class, ServiceRuntimeException.class}) public void makeReservation(ReservationRequest req, ResponseDispatch<ConfirmationData> res); The ResponseDispatch will also enable an asynchronous style JAX-WS service Provider programming model if directly processing raw XML is preferred. public interface AsyncProvider<T> { void invoke(T request, ResponseDispatch<T> res); } For example, a AsyncProvider implementation can chose to parameterize with SOAPMessage: public class MyAsyncServiceProvider implements AsyncProvider<SOAPMessage> { public void invoke(SOAPMessage request, ResponseDispatch<SOAPMessage> dispatch) { store(request, dispatch); ... } } Comments? -Anish -- [1] http://lists.oasis-open.org/archives/sca-j/200911/bin00000.bin [2] http://www.oasis-open.org/apps/org/workgroup/sca-j/download.php/35238/sca-javacaa-1.1-spec-cd03-rev1_Issue127b.pdf
[Date Prev] | [Thread Prev] | [Thread Next] | [Date Next] -- [Date Index] | [Thread Index] | [List Home]