An experimental asynchronous services are based on WSRF implementation. The can be executed using MobyCore API in the same way as usual (RPC-encoded) asynchronous services. An asynchronous BioMoby service must implement several operations:
call() |
submit() |
getResourceProperty() |
getMultipleResourceProperties() |
destroy() |
Here is an example of service implementation:
@Addressing @MobyWSRFScope @MTOM(enabled=true) @BindingType(value = javax.xml.ws.soap.SOAPBinding.SOAP11HTTP_MTOM_BINDING) @SOAPBinding(style=SOAPBinding.Style.DOCUMENT, use=SOAPBinding.Use.LITERAL, parameterStyle=SOAPBinding.ParameterStyle.BARE) @XmlSeeAlso({PropertyResponseWrapper.class}) // let the server know that we use LSAE event to properly handle it @WebService(serviceName="MobyAsyncDemoService", name="MobyAsyncDemoService", targetNamespace="http://biomoby.org/") public class MobyAsyncDemoService extends AbstractAsyncMobyService { @Resource private WebServiceContext ctx; private MobyAsyncDemoImpl impl; public MobyAsyncDemoService() { impl = new MobyAsyncDemoImpl(); } @Override public IAsyncMobyImpl getAsyncMobyImpl() { return impl; } @Override public WebServiceContext getWebServiceContext() { return ctx; } @Override @WebMethod(operationName="MobyAsyncDemoService", action="http://biomoby.org/#MobyAsyncDemoService") @WebResult(name="MOBY", targetNamespace="http://www.biomoby.org/moby") public MobyMessage call(@WebParam(name="MOBY", targetNamespace="http://www.biomoby.org/moby", mode = WebParam.Mode.IN) MobyMessage message) { return super.call(message); } @Override @WebMethod(operationName="MobyAsyncDemoService_submit", action="http://biomoby.org/#MobyAsyncDemoService_submit") @WebResult(name="MobyAsyncDemoService_submitResponse", targetNamespace="http://biomoby.org/") public SubmitResponseWrapper submit(@WebParam(name="MOBY", targetNamespace="http://www.biomoby.org/moby", mode=WebParam.Mode.IN) MobyMessage message) { return super.submit(message); } @Override @Action( input="http://docs.oasis-open.org/wsrf/rpw-2/GetResourceProperty/GetResourcePropertyRequest", output="http://docs.oasis-open.org/wsrf/rpw-2/GetResourceProperty/GetResourcePropertyResponse") @WebMethod(operationName = "GetResourceProperty") @WebResult(name = "GetResourcePropertyResponse", targetNamespace = "http://docs.oasis-open.org/wsrf/rp-2", partName = "GetResourcePropertyResponse") @SOAPBinding(parameterStyle = SOAPBinding.ParameterStyle.BARE) public GetResourcePropertyResponse getResourceProperty( @WebParam(name = "GetResourceProperty", targetNamespace = "http://docs.oasis-open.org/wsrf/rp-2", partName = "GetResourcePropertyRequest") QName getResourcePropertyRequest) throws InvalidResourcePropertyQNameFault, ResourceUnavailableFault, ResourceUnknownFault { return super.getResourceProperty(getResourcePropertyRequest); } @Override @Action( input="http://docs.oasis-open.org/wsrf/rpw-2/GetMultipleResourceProperties/GetMultipleResourcePropertiesRequest", output="http://docs.oasis-open.org/wsrf/rpw-2/GetMultipleResourceProperties/GetMultipleResourcePropertiesResponse") @WebMethod(operationName = "GetMultipleResourceProperties") @WebResult(name = "GetMultipleResourcePropertiesResponse", targetNamespace = "http://docs.oasis-open.org/wsrf/rp-2", partName = "GetMultipleResourcePropertiesResponse") public GetMultipleResourcePropertiesResponse getMultipleResourceProperties( @WebParam(name = "GetMultipleResourceProperties", targetNamespace = "http://docs.oasis-open.org/wsrf/rp-2", partName = "GetMultipleResourcePropertiesRequest") GetMultipleResourceProperties getMultipleResourcePropertiesRequest) throws InvalidResourcePropertyQNameFault, ResourceUnavailableFault, ResourceUnknownFault { return super.getMultipleResourceProperties(getMultipleResourcePropertiesRequest); } @Override @Action( input="http://docs.oasis-open.org/wsrf/rpw-2/QueryResourceProperties/QueryResourcePropertiesRequest", output="http://docs.oasis-open.org/wsrf/rpw-2/QueryResourceProperties/QueryResourcePropertiesResponse") @WebMethod(operationName = "QueryResourceProperties") @WebResult(name = "QueryResourcePropertiesResponse", targetNamespace = "http://docs.oasis-open.org/wsrf/rp-2", partName = "QueryResourcePropertiesResponse") @SOAPBinding(parameterStyle = SOAPBinding.ParameterStyle.BARE) public QueryResourcePropertiesResponse queryResourceProperties( @WebParam(name = "QueryResourceProperties", targetNamespace = "http://docs.oasis-open.org/wsrf/rp-2", partName = "QueryResourcePropertiesRequest") QueryResourceProperties queryResourceProperties) throws UnknownQueryExpressionDialectFault, InvalidQueryExpressionFault, QueryEvaluationErrorFault { return super.queryResourceProperties(queryResourceProperties); } @Override @Action( input="http://docs.oasis-open.org/wsrf/rlw-2/ImmediateResourceTermination/DestroyRequest", output="http://docs.oasis-open.org/wsrf/rlw-2/ImmediateResourceTermination/DestroyResponse") @WebMethod(operationName = "Destroy") @RequestWrapper(localName = "Destroy", targetNamespace = "http://docs.oasis-open.org/wsrf/rl-2", className = "org.inb.wsrf.rl2.Destroy") @ResponseWrapper(localName = "DestroyResponse", targetNamespace = "http://docs.oasis-open.org/wsrf/rl-2", className = "org.inb.wsrf.rl2.DestroyResponse") public void destroy() throws ResourceNotDestroyedFault, ResourceUnavailableFault, ResourceUnknownFault { super.destroy(); } }
Where the "real" implementation class is a MobyAsyncDemoImpl:
public class MobyAsyncDemoImpl extends AbstractAsyncMobyImpl { private MobyMessage message; /** * An implementator may override this method to provide a custom serviceInvocationId */ public String getServiceInvocationId() { return null; } public MobyMessage call(MobyMessage message) { System.out.println("[MobyAsyncDemoImpl].call()"); return message; } public void submit(MobyMessage message) { System.out.println("[MobyAsyncDemoImpl].submit()"); // just store the message to return it later (test) this.message = message; } public MobyMessage getResourcePropertyResult() throws ResourceUnavailableFault { return message; } public AnalysisEvent getResourcePropertyStatus(String queryID) throws InvalidResourcePropertyQNameFault, ResourceUnavailableFault, ResourceUnknownFault { System.out.println("[MobyAsyncDemoImpl].getResourcePropertyStatus()"); AnalysisEvent event = new AnalysisEvent(); event.setId(queryID); event.setMessage("test event"); StateChanged stateChanged = new StateChanged(); stateChanged.setNewState(StateChanged.STATE.completed); event.setEvent(stateChanged); return event; } public void destroy() throws ResourceNotDestroyedFault, ResourceUnavailableFault, ResourceUnknownFault { System.out.println("[MobyAsyncDemoImpl].destroy()"); } }