[ 
https://issues.apache.org/jira/browse/TUSCANY-2445?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Yang Sun updated TUSCANY-2445:
------------------------------

    Attachment: rm-patch.patch

A prototype implementation of ws-rm support. It is a patch file which should be 
applied to the head.

In additional to apply the patch file, pls copy addressing.mar and 
sandesha2.mar to 
\src\main\resources\org\apache\tuscany\sca\binding\ws\axis2\engine\config in 
tuscany-binding-ws-axis2 module.


> [Proposal] Support of conversational web service
> ------------------------------------------------
>
>                 Key: TUSCANY-2445
>                 URL: https://issues.apache.org/jira/browse/TUSCANY-2445
>             Project: Tuscany
>          Issue Type: Improvement
>            Reporter: Yang Sun
>            Priority: Minor
>         Attachments: rm-patch.patch
>
>   Original Estimate: 168h
>  Remaining Estimate: 168h
>
> I want to improve Tuscany by supporting the conversational behavior in web 
> service client side binding. The following is my proposal and I also have a 
> prototype to demonstrate my idea. Please give me some feedback.
> Improvement Background:
> -----------------------------------
> Sometimes, the client wants to keep some session-like variables between the 
> calls to the server. Eg, 
>   1. Login to the server side by providing the security credential;
>   2. Get the invoice data from the Tuscany domain by web service;
>   3. Update the invoice data by calling Tuscany web service interface;
>   4. Do other business related tasks;
>   5. Logoff from the server side.
> Currently, Tuscany web service don't support this kind of conversational 
> feature.
> SCA Related Spec:
> --------------------------
> In SCA assembly spec, it clarifies the external behavior of conversational 
> service and the use of wsdl to declare the conversational behavior of its 
> binding web service.
> To support the conversational feature, the WSDL should support the 
> declaration of the following attributes:
>   1. sca:requires=conversational -- Declares at the porttype level to make 
> the functions in port type conversational.
>   2. sca:endConversation=true/false -- Declares at the function level to give 
> the function a special meaning (end the conversation).
> And the spec said SCA should use webservice reliable messaging as the 
> communication protocol. 
> My Proposal:
> ------------------
> Fortunately, Luciano provides a new parser mechanism which support the 
> parsing of sca:requires and sca:endConversation and etc. So the things left 
> me to do is simple (if I am not wrong). I list my major changes.
>   1. Integrating Axis addressing and sandesha2 modules to the 
> packages.(Sandesha module implements ws-rm and ws-rm relys on addressing, so 
> we need addressing module as well) -- by copying addressing-1.3.mar, 
> sandesha2-1.3.mar to 
> \src\main\resources\org\apache\tuscany\sca\binding\ws\axis2\engine\config in 
> tuscany-binding-ws-axis2 module;
>   2. Engaging addressing and sandesha2 modules if the port type is 
> conversational. -- Modifications to TuscanyAxisConfigurator; 
>   3. Extract the identifier header in SOAP header and make it as the 
> conversationID. A code snippet in my prototype is as below. (in 
> Axis2ServiceProvider.invokeTarget() method).
>             if (isConversational()) {
>               SOAPHeader soapHeader = inMC.getEnvelope().getHeader();
>               Iterator<OMElement>headerIterator =  soapHeader.getChildren();
>               while (headerIterator.hasNext()) {
>                 OMElement currentEle= headerIterator.next();
>               }
>            
>             OMElement sequenceHeader = soapHeader.getFirstChildWithName(new 
> QName("http://schemas.xmlsoap.org/ws/2005/02/rm";, "Sequence"));
>             OMElement identifierHeader = 
> sequenceHeader.getFirstChildWithName(new 
> QName("http://schemas.xmlsoap.org/ws/2005/02/rm";, "Identifier"));
>             conversationID = identifierHeader.getText();
>           }
> After the changes, the basic functions of conversational web service works.
> Test for the prototype:
> -----------------------------
> 1. I wrote a demo client to check the working of conversational web service. 
> It is a enhancement to a echo string. (attach the files as well)
>     It can trace the calls to the service from a WS-RM client and give 
> different feedbacks based on the call frequencies.
>     It also supports the method which marked as endConversational.
> 2. Run all the test cases in tuscany-binding-ws-axis2.
> Qustions need to be discussed:
> -------------------------------------------
> I have a confusion on the handling of endConversation in the prototype and I 
> have some thoughts on its implementation. But I am not sure whether I am on 
> the right track. 
> In the prototype, I have not made any further processing. But I am thinking I 
> can make some improvements here to better support the conversational. Pls 
> help me review it. The following is my idea.
> As we know, we can achieve endConversation effect in two ways:
>   1. end the underlying WS-RM conversation -- by sending endSequence command
>   2. end the conversation at the Tuscany side by calling the method marked as 
> endConversation
> For the situation 1, if I don't do anything, the external behavior is correct 
> since the identifier is re-created after the conversation end and the 
> conversation manager will use the new conversationId to get the conversation 
> variables. But it will left the variables for the ended conversation in the 
> ConversationManager. It is a memory leak till the timeout of 
> ConversationManager. And it will affect the scalability of SCA domains.
> My improvement idea: write a axis handler at RMPhase and listen to 
> endConversation command. If we got that command, the handler will find the 
> ConversationManager and call its method to clear the variables according to 
> its ending identifier.
> For the situation 2, if I don't do anything, the behavior can still be right. 
> But we must have a constraint here: the corresponding java interface must 
> marked with @endConversation. If not, the conversation sequence will be lost 
> (from CONVERSATION_END to CONVERSATON_CONTINUE) and the conversation cannot 
> be ended. 
> My improvement idea: from my understanding, the invocation source should 
> decide the conversation sequence. So whether or not the invocation target 
> marked with endConversation, the conversation sequence should be 
> CONVERSATION_END if the invocation source is marked as CONVERSATION_END. A 
> quick fix here is to copy the conversation  sequence from the invocation 
> source to invocation target when tuscany looks up the InvocationChain. Or at 
> least, we should make some check at the interface compatible logic and give 
> the user a warning message when the conversation sequence is not compatible.
> Thanks for reading so long and pls provide me your feedback.
>          

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to