You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@cxf.apache.org by inalasuresh <in...@care2.com> on 2009/10/07 15:34:55 UTC

Re: In OUT interceptor of a CXF provider, how can we stop the provider invoking its endpoint and send a response back?

Hi Dan thanks for your response,
As of your instructions i added the follwing code in my class.
myMessage(Message msgContext) 
{
String xml = "<s12:Envelope> ";
byte[] theByteArray = xml.getBytes();
MessageImpl messageImpl = new MessageImpl();
Exchange exchange = msgContext.getExchange();
exchange.setInMessage(messageImpl);
exchange.put("exchange.finished", Boolean.TRUE);
messageImpl.setExchange(exchange);
messageImpl.setContent(InputStream.class , new
ByteArrayInputStream(theByteArray));
messageImpl.put(PhaseInterceptorChain.STARTING_AT_INTERCEPTOR_ID,BaseCXFLiteInterceptor.class.getName());
}
it should display the string value in response side like <s12:Envelope>. but
response is not as expected.
what is wrong in the above code is there any thing else need to do. please
help me out. 
can you send me an example code if avaliable. Hope your help is required..


dkulp wrote:
> 
> 
> Well, stopping the current "out" chain is easy.   You pretty much just
> need to 
> grab the chain from the message and "pause" it.   
> 
> The custom response part is the tricky part and depends on how you want to
> go 
> about it.
> 
> Easy way, kind of "hacky", but fast as no additional processing will/can 
> occur:
> Create a new MessageImpl and set the exchange.setInMessage() to it.
> do exchange.put("exchange.finished", Boolean.TRUE);
> set inMsg.setContent(List.class, .....)  to a List which would represent
> the 
> return valued.  It should just be a list of length 1.
> 
> 
> Harder, but more "complete/correct" as it will call the incoming chain so 
> things like Holders and wrappers and stuff can be used:
> You basically need to get the Conduit out of the out message:
> 
>  Exchange exchange = message.getExchange();
>  Conduit conduit = exchange.getConduit(message);
> 
> The conduit MOST LIKELY (all of ours except the CorbaConduit do) extend
> from 
> AbstractConduit (not sure why the Corba one doesn't) which extends 
> AbstractObservable which has a method: MessageObserver
> getMessageObserver()
> 
> Basically, you would create a new Message, fill in the details such as the 
> List as above, maybe an InputStream if your response is a stream, fake 
> headers, etc.... and call the handleMessage call on that MessageObserver.    
> 
> That will setup a complete interceptor chain and such for the "incoming" 
> message.   If you need it to skip things (like not do the stream things),
> you 
> can set
> message.put(PhaseInterceptorChain.STARTING_AT_INTERCEPTOR_ID, ...)
> or 
> message.put(PhaseInterceptorChain.STARTING_AFTER_INTERCEPTOR_ID, ...)
> 
> to have it start at a specific point.
> 
> 
> Hope that helps a bit!
> Dan
> 
> 
> 
> 
> On Wed September 30 2009 2:15:57 am inalasuresh wrote:
>> Hi One & All
>> 
>> While we are working on Delegate (for cxfbc:provider) for FUSE, we have
>>  some technical issues and need some assistance.
>> 
>> Problem Description
>> 
>> In OUT interceptor of a CXF provider, how can we stop the provider
>> invoking
>> its endpoint and send a response back?
>> 
>> Example:
>> I have a cxfbc:provider with some interceptors configured for both IN and
>> OUT flows. When the cxf provider is making a request, the OUT interceptor
>> gets invoked and in this interceptor I would like to stop invoking actual
>> endpoint and send back my own response. That means I should be able to
>> tell
>> the interceptor chain to stop further processing of this flow, set a
>> response message into message exchange and invoke the IN flow. How do I
>> do
>> that?
>> 
>> This kind of mediation/interception is possible in standard
>> specifications
>> like JAX-RPC, JAX-WS, Servlets etc… wondering if CXF provides any sort of
>> this kind.
>> 
>> Also we would like to know who is invoking a provider endpoint in CXF
>> stack
>> in FUSE? Is it an OUT interceptor at the end of interceptor chain or some
>> other transport component after the interceptor chain?
>> 
>> Thanks in Advance
>>     Suresh
>> 
> 
> -- 
> Daniel Kulp
> dkulp@apache.org
> http://www.dankulp.com/blog
> 
> 

-- 
View this message in context: http://www.nabble.com/In-OUT-interceptor-of-a-CXF-provider%2C-how-can-we-stop-the-provider-invoking-its-endpoint-and-send-a-response-back--tp25675554p25786647.html
Sent from the cxf-user mailing list archive at Nabble.com.


Re: In OUT interceptor of a CXF provider, how can we stop the provider invoking its endpoint and send a response back?

Posted by inalasuresh <in...@care2.com>.
Hi Dan,

i am able to get the response while using the 2nd Option with the hard coded
value like (String xml = "<s12:Envelope> ...</s12:Envelope>)  in my code.
the problem here i am facing while getting the response the following
exception is occuring. what is the problem? how could i solve this?
i tried with useJBIWrapper="false" but no luck..

Service mix Console
--------------------
WARN  - PhaseInterceptorChain          - Interceptor has thrown exception,
unwinding now
org.apache.cxf.binding.soap.SoapFault:
"http://java.sun.com/xml/ns/jbi/wsdl-11-wrapper", the namespace on the
"message" element, i
s not a valid SOAP version.
        at
org.apache.cxf.binding.soap.interceptor.ReadHeadersInterceptor.handleMessage(ReadHeadersInterceptor.java:102)
        at
org.apache.cxf.binding.soap.interceptor.ReadHeadersInterceptor.handleMessage(ReadHeadersInterceptor.java:58)
        at
org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:236)
        at
org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:104)
        at
org.apache.servicemix.cxfbc.CxfBcConsumer$JbiChainInitiationObserver.onMessage(CxfBcConsumer.java:644)
        at
org.apache.cxf.transport.http_jetty.JettyHTTPDestination.serviceRequest(JettyHTTPDestination.java:302)
        at
org.apache.cxf.transport.http_jetty.JettyHTTPDestination.doService(JettyHTTPDestination.java:266)
        at
org.apache.cxf.transport.http_jetty.JettyHTTPHandler.handle(JettyHTTPHandler.java:70)
        at
org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:766)
        at
org.mortbay.jetty.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:230)
        at org.mortbay.jetty.handler.HandlerList.handle(HandlerList.java:49)
        at
org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
        at org.mortbay.jetty.Server.handle(Server.java:324)
        at
org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:534)
        at
org.mortbay.jetty.HttpConnection$RequestHandler.content(HttpConnection.java:879)
        at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:828)
        at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:213)
        at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:403)
        at
org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:409)
        at
org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:522)
WARN  - PhaseInterceptorChain          - Interceptor has thrown exception,
unwinding now
org.apache.servicemix.cxfbc.interceptors.JbiFault: Fault occured
        at
org.apache.servicemix.cxfbc.CxfBcConsumer$JbiPostInvokerInterceptor.handleMessage(CxfBcConsumer.java:791)
        at
org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:236)
        at
org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:104)
        at
org.apache.servicemix.cxfbc.CxfBcConsumer$JbiChainInitiationObserver.onMessage(CxfBcConsumer.java:644)
        at
org.apache.cxf.transport.http_jetty.JettyHTTPDestination.serviceRequest(JettyHTTPDestination.java:302)
        at
org.apache.cxf.transport.http_jetty.JettyHTTPDestination.doService(JettyHTTPDestination.java:266)
        at
org.apache.cxf.transport.http_jetty.JettyHTTPHandler.handle(JettyHTTPHandler.java:70)
        at
org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:766)
        at
org.mortbay.jetty.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:230)
        at org.mortbay.jetty.handler.HandlerList.handle(HandlerList.java:49)
        at
org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
        at org.mortbay.jetty.Server.handle(Server.java:324)
        at
org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:534)
        at
org.mortbay.jetty.HttpConnection$RequestHandler.content(HttpConnection.java:879)
        at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:741)
        at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:213)
        at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:403)
        at
org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:409)
        at
org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:522)


Thanks & Regards 
Suresh


dkulp wrote:
> 
> 
> You are kind of munging both approaches....  
> 
> Option 1 would look something like:
> 
> MessageImpl messageImpl = new MessageImpl();
> Exchange exchange = msgContext.getExchange();
> exchange.setInMessage(messageImpl);
> exchange.put("exchange.finished", Boolean.TRUE);
> messageImpl.setExchange(exchange);
> messageImpl.setContent(List.class, Arrays.asList(new Object[] {"Hello"});
> 
> Which would completely bypass the in interceptor chain.  (note: no XML,
> just 
> the return object)
> 
> Otherwise, you would need something like:
> 
> String xml = "<s12:Envelope> ";
> byte[] theByteArray = xml.getBytes();
> MessageImpl messageImpl = new MessageImpl();
> Exchange exchange = msgContext.getExchange();
> exchange.setInMessage(messageImpl);
> messageImpl.setExchange(exchange);
> InputStream in = new ByteArrayInputStream(theByteArray)
> messageImpl.setContent(InputStream.class , in);
> messageImpl.setContent(XMLStreamReader.class, 
> StaxUtils.createXMLStreamReader(in));
> messageImpl.put(PhaseInterceptorChain.STARTING_AT_INTERCEPTOR_ID,BaseCXFLiteInterceptor.class.getName());
>  Exchange exchange = message.getExchange();
>  Conduit conduit = exchange.getConduit(message);
>  ((AbstractConduit)conduit).getMessageObserver().onMessage(inMessage);
> 
> Basically, you would need to meet any requirements for all the
> interceptors up 
> to the "starting at".   That is most likely, at a minimum, creating an 
> XMLStreamReader.
> 
> Dan
> 
> 
> 
> 
> On Wed October 7 2009 9:34:55 am inalasuresh wrote:
>> Hi Dan thanks for your response,
>> As of your instructions i added the follwing code in my class.
>> myMessage(Message msgContext)
>> {
>> String xml = "<s12:Envelope> ";
>> byte[] theByteArray = xml.getBytes();
>> MessageImpl messageImpl = new MessageImpl();
>> Exchange exchange = msgContext.getExchange();
>> exchange.setInMessage(messageImpl);
>> exchange.put("exchange.finished", Boolean.TRUE);
>> messageImpl.setExchange(exchange);
>> messageImpl.setContent(InputStream.class , new
>> ByteArrayInputStream(theByteArray));
>> messageImpl.put(PhaseInterceptorChain.STARTING_AT_INTERCEPTOR_ID,BaseCXFLit
>> eInterceptor.class.getName()); }
>> it should display the string value in response side like <s12:Envelope>.
>>  but response is not as expected.
>> what is wrong in the above code is there any thing else need to do.
>> please
>> help me out.
>> can you send me an example code if avaliable. Hope your help is
>> required..
>> 
>> dkulp wrote:
>> > Well, stopping the current "out" chain is easy.   You pretty much just
>> > need to
>> > grab the chain from the message and "pause" it.
>> >
>> > The custom response part is the tricky part and depends on how you want
>> > to go
>> > about it.
>> >
>> > Easy way, kind of "hacky", but fast as no additional processing
>> will/can
>> > occur:
>> > Create a new MessageImpl and set the exchange.setInMessage() to it.
>> > do exchange.put("exchange.finished", Boolean.TRUE);
>> > set inMsg.setContent(List.class, .....)  to a List which would
>> represent
>> > the
>> > return valued.  It should just be a list of length 1.
>> >
>> >
>> > Harder, but more "complete/correct" as it will call the incoming chain
>> so
>> > things like Holders and wrappers and stuff can be used:
>> > You basically need to get the Conduit out of the out message:
>> >
>> >  Exchange exchange = message.getExchange();
>> >  Conduit conduit = exchange.getConduit(message);
>> >
>> > The conduit MOST LIKELY (all of ours except the CorbaConduit do) extend
>> > from
>> > AbstractConduit (not sure why the Corba one doesn't) which extends
>> > AbstractObservable which has a method: MessageObserver
>> > getMessageObserver()
>> >
>> > Basically, you would create a new Message, fill in the details such as
>> > the List as above, maybe an InputStream if your response is a stream,
>> > fake headers, etc.... and call the handleMessage call on that
>> > MessageObserver.
>> >
>> > That will setup a complete interceptor chain and such for the
>> "incoming"
>> > message.   If you need it to skip things (like not do the stream
>> things),
>> > you
>> > can set
>> > message.put(PhaseInterceptorChain.STARTING_AT_INTERCEPTOR_ID, ...)
>> > or
>> > message.put(PhaseInterceptorChain.STARTING_AFTER_INTERCEPTOR_ID, ...)
>> >
>> > to have it start at a specific point.
>> >
>> >
>> > Hope that helps a bit!
>> > Dan
>> >
>> > On Wed September 30 2009 2:15:57 am inalasuresh wrote:
>> >> Hi One & All
>> >>
>> >> While we are working on Delegate (for cxfbc:provider) for FUSE, we
>> have
>> >>  some technical issues and need some assistance.
>> >>
>> >> Problem Description
>> >>
>> >> In OUT interceptor of a CXF provider, how can we stop the provider
>> >> invoking
>> >> its endpoint and send a response back?
>> >>
>> >> Example:
>> >> I have a cxfbc:provider with some interceptors configured for both IN
>> >> and OUT flows. When the cxf provider is making a request, the OUT
>> >> interceptor gets invoked and in this interceptor I would like to stop
>> >> invoking actual endpoint and send back my own response. That means I
>> >> should be able to tell
>> >> the interceptor chain to stop further processing of this flow, set a
>> >> response message into message exchange and invoke the IN flow. How do
>> I
>> >> do
>> >> that?
>> >>
>> >> This kind of mediation/interception is possible in standard
>> >> specifications
>> >> like JAX-RPC, JAX-WS, Servlets etc… wondering if CXF provides any sort
>> >> of this kind.
>> >>
>> >> Also we would like to know who is invoking a provider endpoint in CXF
>> >> stack
>> >> in FUSE? Is it an OUT interceptor at the end of interceptor chain or
>> >> some other transport component after the interceptor chain?
>> >>
>> >> Thanks in Advance
>> >>     Suresh
>> 
> 
> -- 
> Daniel Kulp
> dkulp@apache.org
> http://www.dankulp.com/blog
> 
> 

-- 
View this message in context: http://www.nabble.com/In-OUT-interceptor-of-a-CXF-provider%2C-how-can-we-stop-the-provider-invoking-its-endpoint-and-send-a-response-back--tp25675554p25869650.html
Sent from the cxf-user mailing list archive at Nabble.com.


Re: In OUT interceptor of a CXF provider, how can we stop the provider invoking its endpoint and send a response back?

Posted by Daniel Kulp <dk...@apache.org>.
You are kind of munging both approaches....  

Option 1 would look something like:

MessageImpl messageImpl = new MessageImpl();
Exchange exchange = msgContext.getExchange();
exchange.setInMessage(messageImpl);
exchange.put("exchange.finished", Boolean.TRUE);
messageImpl.setExchange(exchange);
messageImpl.setContent(List.class, Arrays.asList(new Object[] {"Hello"});

Which would completely bypass the in interceptor chain.  (note: no XML, just 
the return object)

Otherwise, you would need something like:

String xml = "<s12:Envelope> ";
byte[] theByteArray = xml.getBytes();
MessageImpl messageImpl = new MessageImpl();
Exchange exchange = msgContext.getExchange();
exchange.setInMessage(messageImpl);
messageImpl.setExchange(exchange);
InputStream in = new ByteArrayInputStream(theByteArray)
messageImpl.setContent(InputStream.class , in);
messageImpl.setContent(XMLStreamReader.class, 
StaxUtils.createXMLStreamReader(in));
messageImpl.put(PhaseInterceptorChain.STARTING_AT_INTERCEPTOR_ID,BaseCXFLiteInterceptor.class.getName());
 Exchange exchange = message.getExchange();
 Conduit conduit = exchange.getConduit(message);
 ((AbstractConduit)conduit).getMessageObserver().onMessage(inMessage);

Basically, you would need to meet any requirements for all the interceptors up 
to the "starting at".   That is most likely, at a minimum, creating an 
XMLStreamReader.

Dan




On Wed October 7 2009 9:34:55 am inalasuresh wrote:
> Hi Dan thanks for your response,
> As of your instructions i added the follwing code in my class.
> myMessage(Message msgContext)
> {
> String xml = "<s12:Envelope> ";
> byte[] theByteArray = xml.getBytes();
> MessageImpl messageImpl = new MessageImpl();
> Exchange exchange = msgContext.getExchange();
> exchange.setInMessage(messageImpl);
> exchange.put("exchange.finished", Boolean.TRUE);
> messageImpl.setExchange(exchange);
> messageImpl.setContent(InputStream.class , new
> ByteArrayInputStream(theByteArray));
> messageImpl.put(PhaseInterceptorChain.STARTING_AT_INTERCEPTOR_ID,BaseCXFLit
> eInterceptor.class.getName()); }
> it should display the string value in response side like <s12:Envelope>.
>  but response is not as expected.
> what is wrong in the above code is there any thing else need to do. please
> help me out.
> can you send me an example code if avaliable. Hope your help is required..
> 
> dkulp wrote:
> > Well, stopping the current "out" chain is easy.   You pretty much just
> > need to
> > grab the chain from the message and "pause" it.
> >
> > The custom response part is the tricky part and depends on how you want
> > to go
> > about it.
> >
> > Easy way, kind of "hacky", but fast as no additional processing will/can
> > occur:
> > Create a new MessageImpl and set the exchange.setInMessage() to it.
> > do exchange.put("exchange.finished", Boolean.TRUE);
> > set inMsg.setContent(List.class, .....)  to a List which would represent
> > the
> > return valued.  It should just be a list of length 1.
> >
> >
> > Harder, but more "complete/correct" as it will call the incoming chain so
> > things like Holders and wrappers and stuff can be used:
> > You basically need to get the Conduit out of the out message:
> >
> >  Exchange exchange = message.getExchange();
> >  Conduit conduit = exchange.getConduit(message);
> >
> > The conduit MOST LIKELY (all of ours except the CorbaConduit do) extend
> > from
> > AbstractConduit (not sure why the Corba one doesn't) which extends
> > AbstractObservable which has a method: MessageObserver
> > getMessageObserver()
> >
> > Basically, you would create a new Message, fill in the details such as
> > the List as above, maybe an InputStream if your response is a stream,
> > fake headers, etc.... and call the handleMessage call on that
> > MessageObserver.
> >
> > That will setup a complete interceptor chain and such for the "incoming"
> > message.   If you need it to skip things (like not do the stream things),
> > you
> > can set
> > message.put(PhaseInterceptorChain.STARTING_AT_INTERCEPTOR_ID, ...)
> > or
> > message.put(PhaseInterceptorChain.STARTING_AFTER_INTERCEPTOR_ID, ...)
> >
> > to have it start at a specific point.
> >
> >
> > Hope that helps a bit!
> > Dan
> >
> > On Wed September 30 2009 2:15:57 am inalasuresh wrote:
> >> Hi One & All
> >>
> >> While we are working on Delegate (for cxfbc:provider) for FUSE, we have
> >>  some technical issues and need some assistance.
> >>
> >> Problem Description
> >>
> >> In OUT interceptor of a CXF provider, how can we stop the provider
> >> invoking
> >> its endpoint and send a response back?
> >>
> >> Example:
> >> I have a cxfbc:provider with some interceptors configured for both IN
> >> and OUT flows. When the cxf provider is making a request, the OUT
> >> interceptor gets invoked and in this interceptor I would like to stop
> >> invoking actual endpoint and send back my own response. That means I
> >> should be able to tell
> >> the interceptor chain to stop further processing of this flow, set a
> >> response message into message exchange and invoke the IN flow. How do I
> >> do
> >> that?
> >>
> >> This kind of mediation/interception is possible in standard
> >> specifications
> >> like JAX-RPC, JAX-WS, Servlets etc… wondering if CXF provides any sort
> >> of this kind.
> >>
> >> Also we would like to know who is invoking a provider endpoint in CXF
> >> stack
> >> in FUSE? Is it an OUT interceptor at the end of interceptor chain or
> >> some other transport component after the interceptor chain?
> >>
> >> Thanks in Advance
> >>     Suresh
> 

-- 
Daniel Kulp
dkulp@apache.org
http://www.dankulp.com/blog