Hey... Since those are one way soap operations I don't see why we shouldn't be able to support that. In my oppinion it makes alot of sense to send oneways to a JMS queue for persistance and then forward them on to the final destination.
On Jan 16, 2008 1:47 AM, Willem Jiang <[EMAIL PROTECTED]> wrote: > Hi Wilson, > > I don't think you can leverage the JMS queue to achieve the cache the > request for the slow service provider. > > Since the CXF component consumer do not use the async processor to > handler the request , the router's > worker thread will drive the processor before it get the extern Web > Services response back , then it will > return the response to the router client. > I think he just want's to hand off the oneway from a cxf consumer to a oneway jms producer. I don't think any 'camel async processing' is needed since your not going to wait for a response from JMS. > If you have multi clients to invoke the router service, they will take > up the Jetty bundle thread pool's threads > to handle the request. When all the thread in the thread pool are busy, > the router client request will be denied. > once again I think this is only the case if request response is being done. > Camel supports the async processor[1], but because CXF still use the > sync http servlet API , I do not find > a good way to introduce the async processor into the camel-cxf component. > Implementing the CXF consumer as a camel Async processor would allow us to do really scaleable request response operations. But I don't think they are needed to do oneway operations, since you don't need to wait for a response. > Any thoughts? > > > Willem. > > Wilson wrote: > > Hi Willem, > > > > I have a situation where there are a big amount of one way messages arriving > > (via SOAP) from an external client that must be routed to an external > > service provider (via SOAP). The service provider may not be able to consume > > the messages at the same speed they are arriving. > > > > I would like to save the arriving messages into a JMS queue. After a > > consumer would consume the messages from the queue and call the external web > > service. This way the external client is not blocked by the slow service > > provider. > > > > I am really new to Camel and I am not sure this is the right way to achieve > > this? > > > > Thank you, > > > > Wilson > > > > > > willem.jiang wrote: > > > >> Hi Wilson > >> > >> The first error is caused by the Exchange that you get from > >> activeMQQueue misses the CXF message which is came from cxfRouter. > >> > >> My question why do you want to put the router message into the > >> activeMQQueue and then put it to the cxfService endpoint. > >> If you want the request to be put into the activeMQQueue, you could > >> write your router configuration like this. > >> > >> --------JAVA CODE--BEGIN------------- > >> from(cxfRouter).multicast(new UseLatestAggregationStrategy()) > >> .to(activeMQQueue, cxfService); > >> > >> --------JAVA CODE--END------------- > >> > >> Hope this will help you :) > >> > >> Willem. > >> > >> Wilson wrote: > >> > >>> Hi Willem, > >>> > >>> I've got the last 1.3 SPAPSHOT and the problem is gone. > >>> > >>> Now I have another one. > >>> > >>> It is possible to do this? > >>> > >>> --------JAVA CODE--BEGIN------------- > >>> from(cxfRouter).to(activeMQQueue); > >>> from(activeMQQueue).to(cxfService); > >>> --------JAVA CODE--END------------- > >>> > >>> When I try this configuration, I got this exception: > >>> --------EXCEPTION--BEGIN------------- > >>> 14/01/2008 15:16:21 org.apache.cxf.phase.PhaseInterceptorChain > >>> doIntercept > >>> INFO: Interceptor has thrown exception, unwinding now > >>> java.lang.NullPointerException > >>> at > >>> org.apache.cxf.interceptor.MessageSenderInterceptor.getConduit(MessageSenderInterceptor.java:71) > >>> at > >>> org.apache.cxf.interceptor.MessageSenderInterceptor.handleMessage(MessageSenderInterceptor.java:46) > >>> at > >>> org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:207) > >>> at > >>> org.apache.camel.component.cxf.interceptors.AbstractInvokerInterceptor.handleMessage(AbstractInvokerInterceptor.java:95) > >>> at > >>> org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:207) > >>> at > >>> org.apache.camel.component.cxf.CxfMessageObserver.onMessage(CxfMessageObserver.java:83) > >>> at > >>> org.apache.cxf.transport.http_jetty.JettyHTTPDestination.serviceRequest(JettyHTTPDestination.java:284) > >>> at > >>> org.apache.cxf.transport.http_jetty.JettyHTTPDestination.doService(JettyHTTPDestination.java:240) > >>> at > >>> org.apache.cxf.transport.http_jetty.JettyHTTPHandler.handle(JettyHTTPHandler.java:54) > >>> at > >>> org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:712) > >>> at > >>> org.mortbay.jetty.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:211) > >>> at > >>> org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:139) > >>> at org.mortbay.jetty.Server.handle(Server.java:313) > >>> at > >>> org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:506) > >>> at > >>> org.mortbay.jetty.HttpConnection$RequestHandler.content(HttpConnection.java:844) > >>> at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:726) > >>> at > >>> org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:205) > >>> at > >>> org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:381) > >>> at > >>> org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:396) > >>> at > >>> org.mortbay.thread.BoundedThreadPool$PoolThread.run(BoundedThreadPool.java:442) > >>> 14/01/2008 15:16:21 org.apache.cxf.phase.PhaseInterceptorChain > >>> doIntercept > >>> --------EXCEPTION--END------------- > >>> > >>> If I try this route: > >>> --------JAVA CODE--BEGIN------------- > >>> from(cxfRouter).to(activeMQQueue).to(cxfService); > >>> --------JAVA CODE--END------------- > >>> > >>> The external client is called but the message is note dequeued from the > >>> JMS > >>> queue. > >>> > >>> Thank you, > >>> > >>> Wilson > >>> > >>> > >>> > >>> willem.jiang wrote: > >>> > >>> > >>>> Hi Wilson, > >>>> > >>>> I just traced the code and find a way to fix this issue and it will be > >>>> in the trunk soon :) > >>>> > >>>> Willem. > >>>> > >>>> Wilson wrote: > >>>> > >>>> > >>>>> Hi Willem, > >>>>> > >>>>> Issue created: https://issues.apache.org/activemq/browse/CAMEL-286 > >>>>> > >>>>> Best regards, > >>>>> > >>>>> Wilson > >>>>> > >>>>> > >>>>> willem.jiang wrote: > >>>>> > >>>>> > >>>>> > >>>>>> Hi Wilson, > >>>>>> > >>>>>> Yes , it must be a camel-cxf component's bug. Could you fill a JIRA[1] > >>>>>> for it ? > >>>>>> > >>>>>> [1]http://issues.apache.org/activemq/browse/CAMEL > >>>>>> > >>>>>> Willem. > >>>>>> > >>>>>> Wilson wrote: > >>>>>> > >>>>>> > >>>>>> > >>>>>>> Hi, > >>>>>>> > >>>>>>> I found a workaround for the problem. I added a processor after the > >>>>>>> CXF > >>>>>>> router endpoint: > >>>>>>> > >>>>>>> -------JAVA-CODE--BEGIN------------------------------------------- > >>>>>>> String anyEndpoint = "activemq:pedidos"; > >>>>>>> > >>>>>>> from(StringUtils.join(cxfRouterURI)).process(new Processor(){ > >>>>>>> public void process(Exchange exchange) throws > >>>>>>> Exception { > >>>>>>> exchange.setOut(exchange.getIn()); > >>>>>>> } > >>>>>>> }).to(anyEndpoint).to(StringUtils.join(cxfServiceURI)); > >>>>>>> -------JAVA-CODE--END------------------------------------------- > >>>>>>> > >>>>>>> Now it is working. > >>>>>>> > >>>>>>> I think there is a bug in CXF Camel code. > >>>>>>> > >>>>>>> -- > >>>>>>> Wilson > >>>>>>> > >>>>>>> > >>>>>>> Wilson wrote: > >>>>>>> > >>>>>>> > >>>>>>> > >>>>>>> > >>>>>>>> Hi Willem, > >>>>>>>> > >>>>>>>> I am using Camel 1.3. I am using Maven to build the project. Today I > >>>>>>>> updated to the snapshot released on 2008-01-09 but the problem is > >>>>>>>> still > >>>>>>>> there. > >>>>>>>> > >>>>>>>> Thank you. > >>>>>>>> > >>>>>>>> Wilson > >>>>>>>> > >>>>>>>> > >>>>>>>> willem.jiang wrote: > >>>>>>>> > >>>>>>>> > >>>>>>>> > >>>>>>>> > >>>>>>>>> Hi Wilson, > >>>>>>>>> > >>>>>>>>> Which version of Camel are you using? > >>>>>>>>> Please try out Camel 1.3 snapshot which fixed a camel-cxf > >>>>>>>>> component's > >>>>>>>>> issue which can't pass the exchange back form the cxf producer. > >>>>>>>>> > >>>>>>>>> Willem. > >>>>>>>>> > >>>>>>>>> Wilson wrote: > >>>>>>>>> > >>>>>>>>> > >>>>>>>>> > >>>>>>>>> > >>>>>>>>>> Hi Willem, > >>>>>>>>>> > >>>>>>>>>> Thank you for your reply! > >>>>>>>>>> > >>>>>>>>>> I changed my code in order to use a SEI to describe the Web > >>>>>>>>>> Service. > >>>>>>>>>> Now > >>>>>>>>>> it > >>>>>>>>>> is working fine but I am having problems when I add an endpoint > >>>>>>>>>> between > >>>>>>>>>> the > >>>>>>>>>> cxf endpoints. > >>>>>>>>>> > >>>>>>>>>> The (working) code looks like this: > >>>>>>>>>> > >>>>>>>>>> -------------------------------------------------------- > >>>>>>>>>> package com.tc.eai; > >>>>>>>>>> > >>>>>>>>>> import org.apache.camel.builder.RouteBuilder; > >>>>>>>>>> import org.apache.camel.spring.Main; > >>>>>>>>>> import org.apache.commons.lang.StringUtils; > >>>>>>>>>> > >>>>>>>>>> public class MyRouteBuilder extends RouteBuilder { > >>>>>>>>>> > >>>>>>>>>> private static String ROUTER_ADDRESS = > >>>>>>>>>> "http://localhost:9003/pedidoService"; > >>>>>>>>>> private static String DATA_FORMAT = "dataFormat=MESSAGE"; > >>>>>>>>>> private static String SERVICE_NAME = > >>>>>>>>>> "serviceName=%7bhttp://www.tc.com/pedido%7dpedido"; > >>>>>>>>>> private static String SERVICE_CLASS = > >>>>>>>>>> "serviceClass=com.tc.eai.PedidoService"; > >>>>>>>>>> private static String PORT_NAME = > >>>>>>>>>> "portName=%7bhttp://www.tc.com/pedido%7dpedidoSOAP"; > >>>>>>>>>> private static String SERVICE_ADDRESS = > >>>>>>>>>> "http://localhost:9000/pedidoService"; > >>>>>>>>>> > >>>>>>>>>> /** > >>>>>>>>>> * A main() so we can easily run these routing rules in our > >>>>>>>>>> IDE > >>>>>>>>>> */ > >>>>>>>>>> public static void main(String... args) { > >>>>>>>>>> Main.main(args); > >>>>>>>>>> } > >>>>>>>>>> > >>>>>>>>>> /** > >>>>>>>>>> * Lets configure the Camel routing rules using Java code... > >>>>>>>>>> */ > >>>>>>>>>> public void configure() { > >>>>>>>>>> //-- Router receives requests from external clients and send > >>>>>>>>>> to > >>>>>>>>>> channel > >>>>>>>>>> String[] cxfRouterURI = { > >>>>>>>>>> "cxf://" > >>>>>>>>>> ,ROUTER_ADDRESS > >>>>>>>>>> ,"?" > >>>>>>>>>> ,DATA_FORMAT > >>>>>>>>>> ,"&" > >>>>>>>>>> ,SERVICE_NAME > >>>>>>>>>> ,"&" > >>>>>>>>>> ,SERVICE_CLASS > >>>>>>>>>> ,"&" > >>>>>>>>>> ,PORT_NAME > >>>>>>>>>> }; > >>>>>>>>>> > >>>>>>>>>> //-- Service points to external web service. The request > >>>>>>>>>> routed > >>>>>>>>>> by > >>>>>>>>>> the > >>>>>>>>>> Router > >>>>>>>>>> //-- is send to the external service provider > >>>>>>>>>> String[] cxfServiceURI = { > >>>>>>>>>> "cxf://" > >>>>>>>>>> ,SERVICE_ADDRESS > >>>>>>>>>> ,"?" > >>>>>>>>>> ,DATA_FORMAT > >>>>>>>>>> ,"&" > >>>>>>>>>> ,SERVICE_NAME > >>>>>>>>>> ,"&" > >>>>>>>>>> ,SERVICE_CLASS > >>>>>>>>>> ,"&" > >>>>>>>>>> ,PORT_NAME > >>>>>>>>>> }; > >>>>>>>>>> > >>>>>>>>>> > >>>>>>>>>> from(StringUtils.join(cxfRouterURI)).to(StringUtils.join(cxfServiceURI)); > >>>>>>>>>> } > >>>>>>>>>> } > >>>>>>>>>> -------------------------------------------------------- > >>>>>>>>>> > >>>>>>>>>> When change the route this way: > >>>>>>>>>> > >>>>>>>>>> String anyEndpoint = "log:org.apache.camel?level=DEBUG"; > >>>>>>>>>> > >>>>>>>>>> > >>>>>>>>>> from(StringUtils.join(cxfRouterURI)).to(anyEndpoint).to(StringUtils.join(cxfServiceURI)); > >>>>>>>>>> > >>>>>>>>>> I get this error: > >>>>>>>>>> > >>>>>>>>>> ------Exception Begin---------------------------- > >>>>>>>>>> 09/01/2008 18:32:40 org.apache.cxf.phase.PhaseInterceptorChain > >>>>>>>>>> doIntercept > >>>>>>>>>> INFO: Interceptor has thrown exception, unwinding now > >>>>>>>>>> org.apache.cxf.interceptor.Fault > >>>>>>>>>> at > >>>>>>>>>> org.apache.camel.component.cxf.interceptors.RawMessageContentRedirectInterceptor.handleMessage(RawMessageContentRedirectInterceptor.java:43) > >>>>>>>>>> at > >>>>>>>>>> org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:207) > >>>>>>>>>> at > >>>>>>>>>> org.apache.camel.component.cxf.invoker.CxfClient.invokeWithMessageStream(CxfClient.java:137) > >>>>>>>>>> at > >>>>>>>>>> org.apache.camel.component.cxf.invoker.CxfClient.dispatch(CxfClient.java:89) > >>>>>>>>>> at > >>>>>>>>>> org.apache.camel.component.cxf.CxfProducer.process(CxfProducer.java:202) > >>>>>>>>>> at > >>>>>>>>>> org.apache.camel.component.cxf.CxfProducer.process(CxfProducer.java:152) > >>>>>>>>>> at > >>>>>>>>>> org.apache.camel.impl.converter.AsyncProcessorTypeConverter$ProcessorToAsynProcessorBridge.process(AsyncProcessorTypeConverter.java:44) > >>>>>>>>>> at > >>>>>>>>>> org.apache.camel.processor.SendProcessor.process(SendProcessor.java:73) > >>>>>>>>>> at > >>>>>>>>>> org.apache.camel.processor.DeadLetterChannel.process(DeadLetterChannel.java:143) > >>>>>>>>>> at > >>>>>>>>>> org.apache.camel.processor.DeadLetterChannel.process(DeadLetterChannel.java:87) > >>>>>>>>>> at > >>>>>>>>>> org.apache.camel.processor.Pipeline.process(Pipeline.java:101) > >>>>>>>>>> at > >>>>>>>>>> org.apache.camel.processor.Pipeline.process(Pipeline.java:85) > >>>>>>>>>> at > >>>>>>>>>> org.apache.camel.processor.UnitOfWorkProcessor.process(UnitOfWorkProcessor.java:40) > >>>>>>>>>> at > >>>>>>>>>> org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:44) > >>>>>>>>>> at > >>>>>>>>>> org.apache.camel.processor.DelegateAsyncProcessor.process(DelegateAsyncProcessor.java:68) > >>>>>>>>>> at > >>>>>>>>>> org.apache.camel.component.cxf.CamelInvoker.invoke(CamelInvoker.java:71) > >>>>>>>>>> at > >>>>>>>>>> org.apache.camel.component.cxf.interceptors.AbstractInvokerInterceptor.handleMessage(AbstractInvokerInterceptor.java:65) > >>>>>>>>>> at > >>>>>>>>>> org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:207) > >>>>>>>>>> at > >>>>>>>>>> org.apache.camel.component.cxf.CxfMessageObserver.onMessage(CxfMessageObserver.java:83) > >>>>>>>>>> at > >>>>>>>>>> org.apache.cxf.transport.http_jetty.JettyHTTPDestination.serviceRequest(JettyHTTPDestination.java:284) > >>>>>>>>>> at > >>>>>>>>>> org.apache.cxf.transport.http_jetty.JettyHTTPDestination.doService(JettyHTTPDestination.java:240) > >>>>>>>>>> at > >>>>>>>>>> org.apache.cxf.transport.http_jetty.JettyHTTPHandler.handle(JettyHTTPHandler.java:54) > >>>>>>>>>> at > >>>>>>>>>> org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:712) > >>>>>>>>>> at > >>>>>>>>>> org.mortbay.jetty.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:211) > >>>>>>>>>> at > >>>>>>>>>> org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:139) > >>>>>>>>>> at org.mortbay.jetty.Server.handle(Server.java:313) > >>>>>>>>>> at > >>>>>>>>>> org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:506) > >>>>>>>>>> at > >>>>>>>>>> org.mortbay.jetty.HttpConnection$RequestHandler.content(HttpConnection.java:844) > >>>>>>>>>> at > >>>>>>>>>> org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:726) > >>>>>>>>>> at > >>>>>>>>>> org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:211) > >>>>>>>>>> at > >>>>>>>>>> org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:381) > >>>>>>>>>> at > >>>>>>>>>> org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:396) > >>>>>>>>>> at > >>>>>>>>>> org.mortbay.thread.BoundedThreadPool$PoolThread.run(BoundedThreadPool.java:442) > >>>>>>>>>> Caused by: java.lang.NullPointerException > >>>>>>>>>> at > >>>>>>>>>> org.apache.commons.io.IOUtils.copyLarge(IOUtils.java:1025) > >>>>>>>>>> at org.apache.commons.io.IOUtils.copy(IOUtils.java:999) > >>>>>>>>>> at > >>>>>>>>>> org.apache.camel.component.cxf.interceptors.RawMessageContentRedirectInterceptor.handleMessage(RawMessageContentRedirectInterceptor.java:39) > >>>>>>>>>> ... 32 more > >>>>>>>>>> ------Exception End---------------------------- > >>>>>>>>>> > >>>>>>>>>> The same problem happens with seda and activemq endpoints. > >>>>>>>>>> > >>>>>>>>>> Thank you, > >>>>>>>>>> > >>>>>>>>>> Wilson > >>>>>>>>>> > >>>>>>>>>> > >>>>>>>>>> Hi Wilson, > >>>>>>>>>> > >>>>>>>>>> I am afraid you need to provide the SEI class for camel-cxf > >>>>>>>>>> component > >>>>>>>>>> to initiate the endpoint. > >>>>>>>>>> If you do not want to unmarshal the request message , I think you > >>>>>>>>>> could > >>>>>>>>>> use soap message or raw message data formate. > >>>>>>>>>> Now I am thinking to do some refactoring work to enable the web > >>>>>>>>>> services endpoint without SEI class. > >>>>>>>>>> > >>>>>>>>>> Willem. > >>>>>>>>>> > >>>>>>>>>> > >>>>>>>>>> > >>>>>>>>>> > >>>>>>>>>> > >>>>>>>>>> > >>>>>>>>>> > >>>>>>>>> > >>>>>>>>> > >>>>>>>>> > >>>>>>>>> > >>>>>>>> > >>>>>>>> > >>>>>>>> > >>>>>>>> > >>>>>>> > >>>>>>> > >>>>>>> > >>>>>>> > >>>>>> > >>>>>> > >>>>>> > >>>>> > >>>>> > >>>>> > >>>> > >>>> > >>> > >>> > >> > >> > > > > > > -- Regards, Hiram Blog: http://hiramchirino.com Open Source SOA http://open.iona.com
