Hi You can load the content of the file into memory before calling CXF.
<camel:from uri="file:src/data/in" /> <camel:convertBodyTo type="String"/> <camel:to uri="cxf:bean:ttEndpoint2" /> On Fri, May 3, 2013 at 4:51 AM, bocamel <johnz...@gmail.com> wrote: > Hello, I was testing a Camel CXF web services application. I ran into this > problem. > > In my Camel web services test application, I have two routes: > > First route reads messages from a folder (src/data/in), sends the messages > to my web services, and then writes the response to another folder > (src/data/out). This route is added to the app just for testing the web > services server. > > Second route represents the web services server. It receives the web > services calls and processes the requests. > > My test client simply adds messages as files into src/data/in, in a loop. > Once in a while Camel would throw the following exception: > *org.apache.camel.InvalidPayloadException* because it could not find a > specific file in src/data/in. But always, the file that Camel could not > find had already been successfully processed by Camel. It puzzles me why > Camel attempts to redeliver a message when it has delivered successfully > already. It seems to have something to do with concurrency. It only > happens when the test client adds a lot of files (several hundreds) to > src/data/in and Camel processes the messages concurrently. > > Here are the two routes in Spring (simplified to reproduce the problem). > The CXF endpoints in the two routes are really the same endpoint. One used > by the web services test client, one used by the server. > > Route 1 (for test client): > > <camel:route id="clientRoute" handleFault="true"> > <camel:from uri="file:src/data/in" /> > <camel:to uri="cxf:bean:ttEndpoint2" /> > <camel:to uri="file:src/data/out" /> > <camel:log message="Web Services call for > ${headers.CamelFileName} > completed." /> > </camel:route> > > Route 2 (for web services server): > > <camel:route id="serverRoute"> > <camel:from uri="cxf:bean:ttEndpoint" /> > <camel:setHeader headerName="echoString"> > <camel:xpath > resultType="java.lang.String">/ns:SayHello/in</camel:xpath> > </camel:setHeader> > <camel:to uri="velocity:helloWorldResponse.vm" /> > </camel:route> > > Any help will be greatly appreciated. Here is the error message from > console: > > [ default-workqueue-12] clientRoute INFO Web > Services call for test20130502-221000754.xml completed. > [ default-workqueue-1] clientRoute INFO Web > Services call for test20130502-221001478.xml completed. > [ default-workqueue-20] clientRoute INFO Web > Services call for test20130502-221001519.xml completed. > [ default-workqueue-10] clientRoute INFO Web > Services call for *test20130502-221001559.xml* completed. > [ default-workqueue-11] clientRoute INFO Web > Services call for test20130502-221001425.xml completed. > [ default-workqueue-7] clientRoute INFO Web > Services call for test20130502-221001003.xml completed. > [ default-workqueue-22] clientRoute INFO Web > Services call for test20130502-221000915.xml completed. > [ default-workqueue-3] clientRoute INFO Web > Services call for test20130502-221001312.xml completed. > [ default-workqueue-5] clientRoute INFO Web > Services call for test20130502-221001180.xml completed. > [thread #0 - file://src/data/in] DefaultErrorHandler ERROR Failed > delivery for (MessageId: ID-John-PCI-50932-1367546949875-0-4910 on > ExchangeId: ID-John-PCI-50932-1367546949875-0-4911). Exhausted after > delivery attempt: 1 caught: org.apache.camel.InvalidPayloadException: No > body available of type: org.apache.camel.component.cxf.CxfPayload but has > value: GenericFile[test20130502-221001559.xml] of type: > org.apache.camel.component.file.GenericFile on: test20130502-221001559.xml. > Caused by: Error during type conversion from type: > org.apache.camel.component.file.GenericFile to the required type: byte[] > with value GenericFile[test20130502-221001559.xml] due > java.io.FileNotFoundException: > C:\Users\John\workspace\TestConcurrency\src\data\in\test20130502-221001559.xml > (The system cannot find the file specified). > Exchange[test20130502-221001559.xml]. Caused by: > [org.apache.camel.TypeConversionException - Error during type conversion > from type: org.apache.camel.component.file.GenericFile to the required type: > byte[] with value GenericFile[test20130502-221001559.xml] due > java.io.FileNotFoundException: > C:\Users\John\workspace\TestConcurrency\src\data\in\*test20130502-221001559.xml > *(The system cannot find the file specified)] > org.apache.camel.InvalidPayloadException: No body available of type: > org.apache.camel.component.cxf.CxfPayload but has value: > GenericFile[test20130502-221001559.xml] of type: > org.apache.camel.component.file.GenericFile on: test20130502-221001559.xml. > Caused by: Error during type conversion from type: > org.apache.camel.component.file.GenericFile to the required type: byte[] > with value GenericFile[test20130502-221001559.xml] due > java.io.FileNotFoundException: > C:\Users\John\workspace\TestConcurrency\src\data\in\test20130502-221001559.xml > (The system cannot find the file specified). > Exchange[test20130502-221001559.xml]. Caused by: > [org.apache.camel.TypeConversionException - Error during type conversion > from type: org.apache.camel.component.file.GenericFile to the required type: > byte[] with value GenericFile[test20130502-221001559.xml] due > java.io.FileNotFoundException: > C:\Users\John\workspace\TestConcurrency\src\data\in\test20130502-221001559.xml > (The system cannot find the file specified)] > at > org.apache.camel.impl.MessageSupport.getMandatoryBody(MessageSupport.java:101) > at > org.apache.camel.component.cxf.CxfProducer.getParams(CxfProducer.java:305) > at > org.apache.camel.component.cxf.CxfProducer.process(CxfProducer.java:112) > at > org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:73) > at > org.apache.camel.processor.SendProcessor$2.doInAsyncProducer(SendProcessor.java:122) > at > org.apache.camel.impl.ProducerCache.doInAsyncProducer(ProducerCache.java:298) > at > org.apache.camel.processor.SendProcessor.process(SendProcessor.java:117) > at > org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:73) > at > org.apache.camel.processor.DelegateAsyncProcessor.processNext(DelegateAsyncProcessor.java:99) > at > org.apache.camel.processor.DelegateAsyncProcessor.process(DelegateAsyncProcessor.java:90) > at > org.apache.camel.processor.interceptor.BacklogTracerInterceptor.process(BacklogTracerInterceptor.java:84) > at > org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:73) > at > org.apache.camel.processor.DelegateAsyncProcessor.processNext(DelegateAsyncProcessor.java:99) > at > org.apache.camel.processor.DelegateAsyncProcessor.process(DelegateAsyncProcessor.java:90) > at > org.apache.camel.processor.interceptor.TraceInterceptor.process(TraceInterceptor.java:91) > at > org.apache.camel.processor.interceptor.HandleFaultInterceptor.process(HandleFaultInterceptor.java:41) > at > org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:73) > at > org.apache.camel.processor.DelegateAsyncProcessor.processNext(DelegateAsyncProcessor.java:99) > at > org.apache.camel.processor.DelegateAsyncProcessor.process(DelegateAsyncProcessor.java:90) > at > org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:73) > at > org.apache.camel.processor.RedeliveryErrorHandler.processErrorHandler(RedeliveryErrorHandler.java:390) > at > org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:273) > at > org.apache.camel.processor.RouteContextProcessor.processNext(RouteContextProcessor.java:46) > at > org.apache.camel.processor.DelegateAsyncProcessor.process(DelegateAsyncProcessor.java:90) > at > org.apache.camel.processor.interceptor.DefaultChannel.process(DefaultChannel.java:335) > at > org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:73) > at org.apache.camel.processor.Pipeline.process(Pipeline.java:117) > at org.apache.camel.processor.Pipeline.process(Pipeline.java:80) > at > org.apache.camel.processor.RouteContextProcessor.processNext(RouteContextProcessor.java:46) > at > org.apache.camel.processor.DelegateAsyncProcessor.process(DelegateAsyncProcessor.java:90) > at > org.apache.camel.processor.UnitOfWorkProcessor.processAsync(UnitOfWorkProcessor.java:150) > at > org.apache.camel.processor.UnitOfWorkProcessor.process(UnitOfWorkProcessor.java:117) > at > org.apache.camel.processor.RouteInflightRepositoryProcessor.processNext(RouteInflightRepositoryProcessor.java:48) > at > org.apache.camel.processor.DelegateAsyncProcessor.process(DelegateAsyncProcessor.java:90) > at > org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:73) > at > org.apache.camel.processor.DelegateAsyncProcessor.processNext(DelegateAsyncProcessor.java:99) > at > org.apache.camel.processor.DelegateAsyncProcessor.process(DelegateAsyncProcessor.java:90) > at > org.apache.camel.management.InstrumentationProcessor.process(InstrumentationProcessor.java:72) > at > org.apache.camel.component.file.GenericFileConsumer.processExchange(GenericFileConsumer.java:350) > at > org.apache.camel.component.file.GenericFileConsumer.processBatch(GenericFileConsumer.java:197) > at > org.apache.camel.component.file.GenericFileConsumer.poll(GenericFileConsumer.java:163) > at > org.apache.camel.impl.ScheduledPollConsumer.doRun(ScheduledPollConsumer.java:141) > at > org.apache.camel.impl.ScheduledPollConsumer.run(ScheduledPollConsumer.java:91) > at > java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471) > at > java.util.concurrent.FutureTask$Sync.innerRunAndReset(FutureTask.java:351) > at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:178) > at > java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:178) > at > java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293) > at > java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110) > at > java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603) > at java.lang.Thread.run(Thread.java:722) > Caused by: org.apache.camel.TypeConversionException: Error during type > conversion from type: org.apache.camel.component.file.GenericFile to the > required type: byte[] with value GenericFile[test20130502-221001559.xml] due > java.io.FileNotFoundException: > C:\Users\John\workspace\TestConcurrency\src\data\in\test20130502-221001559.xml > (The system cannot find the file specified) > at > org.apache.camel.impl.converter.BaseTypeConverterRegistry.mandatoryConvertTo(BaseTypeConverterRegistry.java:173) > at > org.apache.camel.component.file.FileBinding.loadContent(FileBinding.java:57) > at > org.apache.camel.component.file.GenericFileConverter.genericFileToInputStream(GenericFileConverter.java:123) > at sun.reflect.GeneratedMethodAccessor15.invoke(Unknown Source) > at > sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) > at java.lang.reflect.Method.invoke(Method.java:601) > at > org.apache.camel.util.ObjectHelper.invokeMethod(ObjectHelper.java:980) > at > org.apache.camel.impl.converter.StaticMethodTypeConverter.convertTo(StaticMethodTypeConverter.java:47) > at > org.apache.camel.component.cxf.converter.CxfPayloadConverter.convertVia(CxfPayloadConverter.java:249) > at > org.apache.camel.component.cxf.converter.CxfPayloadConverter.convertTo(CxfPayloadConverter.java:157) > at sun.reflect.GeneratedMethodAccessor14.invoke(Unknown Source) > at > sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) > at java.lang.reflect.Method.invoke(Method.java:601) > at > org.apache.camel.util.ObjectHelper.invokeMethod(ObjectHelper.java:980) > at > org.apache.camel.impl.converter.StaticMethodFallbackTypeConverter.convertTo(StaticMethodFallbackTypeConverter.java:50) > at > org.apache.camel.impl.converter.BaseTypeConverterRegistry.doConvertTo(BaseTypeConverterRegistry.java:311) > at > org.apache.camel.impl.converter.BaseTypeConverterRegistry.mandatoryConvertTo(BaseTypeConverterRegistry.java:164) > at > org.apache.camel.impl.MessageSupport.getMandatoryBody(MessageSupport.java:99) > ... 50 more > Caused by: org.apache.camel.RuntimeCamelException: > java.io.FileNotFoundException: > C:\Users\John\workspace\TestConcurrency\src\data\in\test20130502-221001559.xml > (The system cannot find the file specified) > at > org.apache.camel.util.ObjectHelper.wrapRuntimeCamelException(ObjectHelper.java:1338) > at > org.apache.camel.util.ObjectHelper.invokeMethod(ObjectHelper.java:984) > at > org.apache.camel.impl.converter.StaticMethodTypeConverter.convertTo(StaticMethodTypeConverter.java:47) > at > org.apache.camel.component.file.GenericFileConverter.convertTo(GenericFileConverter.java:97) > at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) > at > sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) > at > sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) > at java.lang.reflect.Method.invoke(Method.java:601) > at > org.apache.camel.util.ObjectHelper.invokeMethod(ObjectHelper.java:980) > at > org.apache.camel.impl.converter.StaticMethodFallbackTypeConverter.convertTo(StaticMethodFallbackTypeConverter.java:50) > at > org.apache.camel.impl.converter.BaseTypeConverterRegistry.doConvertTo(BaseTypeConverterRegistry.java:311) > at > org.apache.camel.impl.converter.BaseTypeConverterRegistry.mandatoryConvertTo(BaseTypeConverterRegistry.java:164) > ... 67 more > Caused by: java.io.FileNotFoundException: > C:\Users\John\workspace\TestConcurrency\src\data\in\test20130502-221001559.xml > (The system cannot find the file specified) > at java.io.FileInputStream.open(Native Method) > at java.io.FileInputStream.<init>(FileInputStream.java:138) > at > org.apache.camel.converter.IOConverter.toInputStream(IOConverter.java:73) > at > org.apache.camel.converter.IOConverter.toByteArray(IOConverter.java:248) > at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) > at > sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) > at > sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) > at java.lang.reflect.Method.invoke(Method.java:601) > at > org.apache.camel.util.ObjectHelper.invokeMethod(ObjectHelper.java:980) > ... 77 more > [thread #0 - file://src/data/in] GenericFileOnCompletion WARN > Rollback file strategy: > org.apache.camel.component.file.strategy.GenericFileRenameProcessStrategy@49cad364 > for file: GenericFile[test20130502-221001559.xml] > [ default-workqueue-6] clientRoute INFO Web > Services call for test20130502-221001598.xml completed. > [ default-workqueue-24] clientRoute INFO Web > Services call for test20130502-221001717.xml completed. > [ default-workqueue-4] clientRoute INFO Web > Services call for test20130502-221001657.xml completed. > [ default-workqueue-13] clientRoute INFO Web > Services call for test20130502-221001889.xml completed. > > > > -- > View this message in context: > http://camel.465427.n5.nabble.com/Camel-retries-a-message-after-the-message-has-been-completed-successfully-tp5731930.html > Sent from the Camel - Users mailing list archive at Nabble.com. -- Claus Ibsen ----------------- Red Hat, Inc. FuseSource is now part of Red Hat Email: cib...@redhat.com Web: http://fusesource.com Twitter: davsclaus Blog: http://davsclaus.com Author of Camel in Action: http://www.manning.com/ibsen