axis-java-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Deepal jayasinghe <deep...@gmail.com>
Subject Re: How to terminate InFlow and start OutFlow in the custom handler of axis2
Date Thu, 14 May 2009 13:38:42 GMT
As I can see the problem is, in the faultflow you abort the execution,
so you get such an error. try to use two handlers for in-flow and fault-flow

Deepal
> Hi Amila,
>
>    I have written the below code in handler this time.
>
> 	public InvocationResponse invoke(MessageContext msgContext) throws
> AxisFault {
> 		if(msgContext.getFLOW()==1)
>         	 {
> 			throw new AxisFault("validation failed error");
> 		  }
>  	 return InvocationResponse.ABORT;
> 	}
> Now when i am running the client, i am getting the below exception instead
> of fault response message.
>
> org.apache.axis2.AxisFault: First Element must contain the local name,
> Envelope , but found html
> 	at org.apache.axis2.AxisFault.makeFault(AxisFault.java:430)
> 	at
> org.apache.axis2.transport.TransportUtils.createSOAPMessage(TransportUtils.java:90)
> 	at
> org.apache.axis2.description.OutInAxisOperationClient.handleResponse(OutInAxisOperation.java:353)
> 	at
> org.apache.axis2.description.OutInAxisOperationClient.send(OutInAxisOperation.java:416)
> 	at
> org.apache.axis2.description.OutInAxisOperationClient.executeImpl(OutInAxisOperation.java:228)
> 	at
> org.apache.axis2.client.OperationClient.execute(OperationClient.java:163)
> 	at
> org.apache.axis2.client.ServiceClient.sendReceive(ServiceClient.java:548)
> 	at
> org.apache.rahas.client.STSClient.requestSecurityToken(STSClient.java:127)
> 	at org.apache.rampart.util.RampartUtil.getToken(RampartUtil.java:486)
> 	at
> org.apache.rampart.util.RampartUtil.getSecConvToken(RampartUtil.java:396)
> 	at
> org.apache.rampart.builder.SymmetricBindingBuilder.initializeTokens(SymmetricBindingBuilder.java:670)
> 	at
> org.apache.rampart.builder.SymmetricBindingBuilder.build(SymmetricBindingBuilder.java:73)
> 	at org.apache.rampart.MessageBuilder.build(MessageBuilder.java:128)
> 	at org.apache.rampart.handler.RampartSender.invoke(RampartSender.java:64)
> 	at org.apache.axis2.engine.Phase.invoke(Phase.java:317)
> 	at org.apache.axis2.engine.AxisEngine.invoke(AxisEngine.java:264)
> 	at org.apache.axis2.engine.AxisEngine.resumeSend(AxisEngine.java:370)
> 	at org.apache.sandesha2.workers.SenderWorker.run(SenderWorker.java:287)
> 	at
> edu.emory.mathcs.backport.java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1061)
> 	at
> edu.emory.mathcs.backport.java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:575)
> 	at java.lang.Thread.run(Thread.java:735)
> Caused by: org.apache.axiom.soap.SOAPProcessingException: First Element must
> contain the local name, Envelope , but found html
> 	at
> org.apache.axiom.soap.impl.builder.StAXSOAPModelBuilder.constructNode(StAXSOAPModelBuilder.java:251)
> 	at
> org.apache.axiom.soap.impl.builder.StAXSOAPModelBuilder.createOMElement(StAXSOAPModelBuilder.java:209)
> 	at
> org.apache.axiom.soap.impl.builder.StAXSOAPModelBuilder.createNextOMElement(StAXSOAPModelBuilder.java
>
> Thanks,
> Swapna Soni.
>
>
> Amila Suriarachchi wrote:
>   
>> On Thu, May 14, 2009 at 11:47 AM, Senthil Sona <swsoni@cisco.com> wrote:
>>
>>     
>>> Hi Amila,
>>>
>>>    I have set the written the below code in my custom module.
>>>
>>>         public InvocationResponse invoke(MessageContext msgContext)
>>> throws
>>> AxisFault {
>>>                if(msgContext.getFLOW()==1)
>>>                  {
>>>                         MessageContext faultContext =
>>>
>>> MessageContextBuilder.createFaultMessageContext(msgContext, new
>>> AxisFault("validation failed error", new QName("validation error",
>>> "wsa")));
>>>                         AxisEngine.sendFault(faultContext);
>>>
>>>       
>> here as I told you earlier try to throw the AxisFault()
>>
>> i.e throw new AxisFault("validation error");
>>
>> then the fault sending part is done at the transport level.
>>
>> thanks,
>> Amila.
>>
>>     
>>>                  }
>>>          return InvocationResponse.ABORT;
>>>        }
>>>
>>> But when running the client program i am getting error at client console
>>> like
>>>
>>> org.apache.axis2.AxisFault: The input stream for an incoming message is
>>> null.
>>>        at
>>>
>>> org.apache.axis2.transport.TransportUtils.createSOAPMessage(TransportUtils.java:72)
>>>        at
>>>
>>> org.apache.axis2.description.OutInAxisOperationClient.handleResponse(OutInAxisOperation.java:353)
>>>         at
>>>
>>> org.apache.axis2.description.OutInAxisOperationClient.send(OutInAxisOperation.java:416)
>>>        at
>>>
>>> org.apache.axis2.description.OutInAxisOperationClient.executeImpl(OutInAxisOperation.java:228)
>>>        at
>>> org.apache.axis2.client.OperationClient.execute(OperationClient.java:163)
>>>        at
>>> org.apache.axis2.client.ServiceClient.sendReceive(ServiceClient.java:548)
>>>        at
>>> org.apache.rahas.client.STSClient.requestSecurityToken(STSClient.java:127)
>>>        at
>>> org.apache.rampart.util.RampartUtil.getToken(RampartUtil.java:486)
>>>        at
>>> org.apache.rampart.util.RampartUtil.getSecConvToken(RampartUtil.java:396)
>>>        at
>>>
>>> org.apache.rampart.builder.SymmetricBindingBuilder.initializeTokens(SymmetricBindingBuilder.java:670)
>>>
>>> For outFaultFlow i am calling same handler and wrote the code like
>>>
>>>           if(msgContext.getFLOW()==4) {
>>>                System.out.println("This is OutFaultFlow");
>>>                System.out.println("
>>> messagecontext=="+msgContext.getEnvelope());
>>>           }
>>> So its printing the fault soap resonse
>>>
>>> <?xml version='1.0' encoding='utf-8'?><soapenv:Envelope xmlns:s
>>> oapenv="http://www.w3.org/2003/05/soap-envelope
>>> "><soapenv:Body><soapenv:Fault
>>> xm
>>> lns:axis2ns5="validation
>>> error"><soapenv:Code><soapenv:Value>axis2ns5:wsa</soape
>>> nv:Value></soapenv:Code><soapenv:Reason><soapenv:Text
>>> xml:lang="en-US">validatio
>>> n failed error</soapenv:Text></soapenv:Reason><soapenv:Detail
>>> /></soapenv:Fault>
>>> </soapenv:Body></soapenv:Envelope>
>>>
>>> I want this response should be printed at client console. How can i do
>>> this,
>>> please help me. Its stopping our  productivity.
>>>
>>> I have uploaded the Handler class and client class. Could you please have
>>> a
>>> webex session with us. So that we can show you our complete code and how
>>> the
>>> program is behaving when we run the client. It will help us to resolve
>>> the
>>> problem soon.
>>>
>>> Thanks,
>>> Swapna Soni.
>>>
>>>
>>> Amila Suriarachchi wrote:
>>>       
>>>> On Wed, May 13, 2009 at 8:48 PM, Senthil Sona <swsoni@cisco.com> wrote:
>>>>
>>>>         
>>>>> Hi Deepal,
>>>>>
>>>>>    I have added the code in the handler class like
>>>>>
>>>>>        if(msgContext.getFLOW()==1)
>>>>>        {
>>>>>                 logger.info("This is inFlow");
>>>>>                  System.out.println("This is inFlow");
>>>>>                 MessageContext faultContext =
>>>>>
>>>>> MessageContextBuilder.createFaultMessageContext(msgContext, new
>>>>> AxisFault("validation failed error", new QName("validation error",
>>>>> "wsa")));
>>>>>                         AxisEngine.sendFault(faultContext);
>>>>>           
>>>> it is bit difficult to answer your question without looking all your
>>>>         
>>> code.
>>>       
>>>> But try this.
>>>>
>>>>
>>>> if you want to send a soap fault to client side, throw an AxisFault
>>>>         
>>> here.
>>>       
>>>> When you throw an AxisFault it is caught at the transport level and it
>>>> sends
>>>> the fault message by calling to fault flow.
>>>>
>>>> if you want to send a normal soap message do this,
>>>>
>>>> MessageContext outMsgContext =
>>>> MessageContextBuilder.createOutMessageContext(msgContext);
>>>> AxisEngine.send(outMsgContext);
>>>> return InvocationResponse.ABORT
>>>>
>>>> here it is important to return InvocationResponse.ABORT to terminate
>>>>         
>>> the
>>>       
>>>> inFlow.
>>>>
>>>> thanks,
>>>> Amila.
>>>>
>>>>         
>>>>>        }
>>>>>
>>>>>  I am using the same handler class for inflow and outfault flow thats
>>>>>           
>>> why
>>>       
>>>>> i
>>>>> am checking if(msgContext.getFLOW()==1). At client console i am
>>>>>           
>>> getting
>>>       
>>>>> error like
>>>>>
>>>>> org.apache.axis2.AxisFault: validation failed error
>>>>>        at
>>>>>
>>>>>
>>>>>           
>>> org.apache.axis2.util.Utils.getInboundFaultFromMessageContext(Utils.java:512)
>>>       
>>>>>        at
>>>>>
>>>>>
>>>>>           
>>> org.apache.axis2.description.OutInAxisOperationClient.handleResponse(OutInAxisOperation.java:370)
>>>       
>>>>>        at
>>>>>
>>>>>
>>>>>           
>>> org.apache.axis2.description.OutInAxisOperationClient.send(OutInAxisOperation.java:416)
>>>       
>>>>>        at
>>>>>
>>>>>
>>>>>           
>>> org.apache.axis2.description.OutInAxisOperationClient.executeImpl(OutInAxisOperation.java:228)
>>>       
>>>>>        at
>>>>>
>>>>>           
>>> org.apache.axis2.client.OperationClient.execute(OperationClient.java:163)
>>>       
>>>>>        at
>>>>>
>>>>>           
>>> org.apache.axis2.client.ServiceClient.sendReceive(ServiceClient.java:548)
>>>       
>>>>>        at
>>>>>
>>>>>           
>>> org.apache.rahas.client.STSClient.requestSecurityToken(STSClient.java:127)
>>>       
>>>>>        at
>>>>> org.apache.rampart.util.RampartUtil.getToken(RampartUtil.java:486)
>>>>>        at
>>>>>
>>>>>           
>>> org.apache.rampart.util.RampartUtil.getSecConvToken(RampartUtil.java:396)
>>>       
>>>>>        at
>>>>>
>>>>>
>>>>>           
>>> org.apache.rampart.builder.SymmetricBindingBuilder.initializeTokens(SymmetricBindingBuilder.java:670)
>>>       
>>>>>        at
>>>>>
>>>>>
>>>>>           
>>> org.apache.rampart.builder.SymmetricBindingBuilder.build(SymmetricBindingBuilder.java:73)
>>>       
>>>>>        at
>>>>> org.apache.rampart.MessageBuilder.build(MessageBuilder.java:128)
>>>>>        at
>>>>> org.apache.rampart.handler.RampartSender.invoke(RampartSender.java:64)
>>>>>        at org.apache.axis2.engine.Phase.invoke(Phase.java:317)
>>>>>        at
>>>>>           
>>> org.apache.axis2.engine.AxisEngine.invoke(AxisEngine.java:264)
>>>       
>>>>>        at
>>>>> org.apache.axis2.engine.AxisEngine.resumeSend(AxisEngine.java:370)
>>>>>        at
>>>>> org.apache.sandesha2.workers.SenderWorker.run(SenderWorker.java:287)
>>>>>        at
>>>>>
>>>>>
>>>>>           
>>> edu.emory.mathcs.backport.java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1061)
>>>       
>>>>>        at
>>>>>
>>>>>
>>>>>           
>>> edu.emory.mathcs.backport.java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:575)
>>>       
>>>>>        at java.lang.Thread.run(Thread.java:735)
>>>>>
>>>>> and its keep on executing the handler, Because i am able to see the
>>>>>           
>>> log
>>>       
>>>>> message i am printing in inflow if condition again and again. I am
>>>>> printing
>>>>> the message context in OutFaultFlow. i am getting the message like
>>>>>
>>>>> This is OutFaultFlow
>>>>>  messagecontext==<?xml version='1.0'
>>>>>           
>>> encoding='utf-8'?><soapenv:Envelope
>>>       
>>>>> xmlns:s
>>>>> oapenv="http://www.w3.org/2003/05/soap-envelope
>>>>> "><soapenv:Body><soapenv:Fault
>>>>> xm
>>>>> lns:axis2ns5="validation
>>>>> error"><soapenv:Code><soapenv:Value>axis2ns5:wsa</soape
>>>>> nv:Value></soapenv:Code><soapenv:Reason><soapenv:Text
>>>>> xml:lang="en-US">validatio
>>>>> n failed error</soapenv:Text></soapenv:Reason><soapenv:Detail
>>>>> /></soapenv:Fault>
>>>>> </soapenv:Body></soapenv:Envelope>
>>>>>
>>>>> Thanks,
>>>>> Swapna Soni.
>>>>>
>>>>> Deepal Jayasinghe-2 wrote:
>>>>>           
>>>>>> Try this,
>>>>>>
>>>>>> MessageContext faultContext =
>>>>>> MessageContextBuilder.createFaultMessageContext(messageCtx, e);
>>>>>> AxisEngine.sendFault(faultContext);
>>>>>>
>>>>>> - Deepal
>>>>>>             
>>>>>>> Hi Deepal,
>>>>>>>
>>>>>>>    Thanks for your reply. If we set the
>>>>>>>               
>>>>> AxisEngine.sendFault(msgContext)
>>>>>           
>>>>>>> in
>>>>>>> inflow handler, it will execute the outFaultFlow but client program
>>>>>>>               
>>>>> wotn
>>>>>           
>>>>>>> get
>>>>>>> any response and we are getting org.apache.axis2.AxisFault: Read
>>>>>>>               
>>> timed
>>>       
>>>>>>> out
>>>>>>> exception. And its again and again executing the inflow handler.
>>>>>>>               
>>> For
>>>       
>>>>>>> testing
>>>>>>> purpose i have written
>>>>>>>      if(msgContext.getFLOW()==1)
>>>>>>>         {
>>>>>>>               logger.info("This is inFlow");
>>>>>>> }
>>>>>>>  in the inFlowhandler class and its getting execute again and
>>>>>>>               
>>> again.
>>>       
>>>>> But
>>>>>           
>>>>>>> i
>>>>>>> want it should get execute only once when request comes from
client
>>>>>>>               
>>>>> and
>>>>>           
>>>>>>> it
>>>>>>> should do validation of that request message, if something is
wrong
>>>>>>>               
>>>>> then
>>>>>           
>>>>>>> outflow or OutFaultFlow should get execute and send the proper
>>>>>>>               
>>> error
>>>       
>>>>>>> response to client and should get terminate there only. Once
we get
>>>>>>>               
>>>>> any
>>>>>           
>>>>>>> validation error in inFlow handler, it should not process further
>>>>>>>               
>>>>> engaged
>>>>>           
>>>>>>> module and request should terminate in inFlow and from there
client
>>>>>>> should
>>>>>>> get response via outFlow or outFaultFlow.
>>>>>>>
>>>>>>>    We are engaging the sandesha and rampart from in the client
>>>>>>>               
>>> program
>>>       
>>>>>>> only.
>>>>>>>
>>>>>>>                      sender.engageModule("addressing");
>>>>>>>                      sender.engageModule("sandesha2");
>>>>>>>
>>>>>>>               
>>>>>  options.setProperty(SandeshaClientConstants.OFFERED_SEQUENCE_ID,
>>>>>           
>>>>>>> "Yash_Seq");
>>>>>>>                      sender.engageModule("rampart");
>>>>>>>
>>>>>>>
>>>>>>>               
>>>>>  options.setProperty(RampartMessageData.KEY_RAMPART_POLICY,
>>>>>           
>>> loadPolicy("C:/WS-X/misc/20090427/WTPTestRM2Client/WebContent/WEB-INF/conf/policy.xml"));
>>>       
>>>>>>> Could you please let us know how to achieve this functionality.
>>>>>>>
>>>>>>> Thanks,
>>>>>>> Swapna Soni.
>>>>>>>
>>>>>>> Deepal Jayasinghe-2 wrote:
>>>>>>>
>>>>>>>               
>>>>>>>> Behavior will be different based on the dispatch status,
but you
>>>>>>>>                 
>>> can
>>>       
>>>>>>>> simply call.
>>>>>>>>
>>>>>>>> AxisEngine.sendFault(messageContext)
>>>>>>>>
>>>>>>>> Then it will send  the fault
>>>>>>>>
>>>>>>>> -  Deepal
>>>>>>>>
>>>>>>>>                 
>>>>>>>>> Hi Axis Team,
>>>>>>>>>
>>>>>>>>>     I have one very urgent requirement. One client program
>>>>>>>>>                   
>>> invokes
>>>       
>>>>> the
>>>>>           
>>>>>>>>> service in which sandesha, rampart and one custom module
is
>>>>>>>>>                   
>>> engaged.
>>>       
>>>>> In
>>>>>           
>>>>>>>>> custom Inflow handler we do some validation. If something
is
>>>>>>>>>                   
>>> wrong
>>>       
>>>>> in
>>>>>           
>>>>>>>>> that
>>>>>>>>> validation, then we want it to start the outFlow and
send the
>>>>>>>>>                   
>>> custom
>>>       
>>>>>>>>> response to client back without executing further engaged
modules
>>>>>>>>>                   
>>>>> and
>>>>>           
>>>>>>>>> without invoking service.
>>>>>>>>>
>>>>>>>>>    Could anyone please tell me how can i do this using
axis2 api.
>>>>>>>>>                   
>>>>> Its
>>>>>           
>>>>>>>>> very
>>>>>>>>> very urgent requirement for us.
>>>>>>>>>
>>>>>>>>> Thanks,
>>>>>>>>> swapna soni
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>                   
>>>>>>>> --
>>>>>>>> Thank you!
>>>>>>>>
>>>>>>>>
>>>>>>>> http://blogs.deepal.org
>>>>>>>> http://deepal.org
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>>                 
>>>>>>>               
>>>>>> --
>>>>>> Thank you!
>>>>>>
>>>>>>
>>>>>> http://blogs.deepal.org
>>>>>> http://deepal.org
>>>>>>
>>>>>>
>>>>>>
>>>>>>             
>>>>> --
>>>>> View this message in context:
>>>>>
>>>>>           
>>> http://www.nabble.com/How-to-terminate-InFlow-and-start-OutFlow-in-the-custom-handler-of-axis2-tp23521710p23523940.html
>>>       
>>>>> Sent from the Axis - Dev mailing list archive at Nabble.com.
>>>>>
>>>>>
>>>>>           
>>>> --
>>>> Amila Suriarachchi
>>>> WSO2 Inc.
>>>> blog: http://amilachinthaka.blogspot.com/
>>>>
>>>>
>>>>         
>>> http://www.nabble.com/file/p23534995/LogHandler.java LogHandler.java
>>> http://www.nabble.com/file/p23534995/client.java client.java
>>> --
>>> View this message in context:
>>> http://www.nabble.com/How-to-terminate-InFlow-and-start-OutFlow-in-the-custom-handler-of-axis2-tp23521710p23534995.html
>>> Sent from the Axis - Dev mailing list archive at Nabble.com.
>>>
>>>
>>>       
>> -- 
>> Amila Suriarachchi
>> WSO2 Inc.
>> blog: http://amilachinthaka.blogspot.com/
>>
>>
>>     
>
>   


-- 
Thank you!


http://blogs.deepal.org
http://deepal.org


Mime
View raw message