axis-java-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Senthil Sona <sws...@cisco.com>
Subject Re: How to terminate InFlow and start OutFlow in the custom handler of axis2
Date Thu, 14 May 2009 14:08:49 GMT

Hi Deepal,

  I am using two handlers now one for inflow and one for outflow. In Inflow
handler i am using "return InvocationResponse.ABORT" and in out flow handler
i am using "return InvocationResponse.CONTINUE". When i am runnning the
client i am getting error like

org.apache.axis2.AxisFault: validation failed error with complete stack
trace. And its printing again and again. this  is becuase we are engaging
sandesha and its not getting acknowledge thats why its sending teh request
again and again. How to stop this and send the fault response to client.
Please help me.

Thanks,
Swapna Soni.


Deepal Jayasinghe-2 wrote:
> 
> 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
> 
> 
> 

-- 
View this message in context: http://www.nabble.com/How-to-terminate-InFlow-and-start-OutFlow-in-the-custom-handler-of-axis2-tp23521710p23541351.html
Sent from the Axis - Dev mailing list archive at Nabble.com.


Mime
View raw message