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.