Apache Camel File进程导致TypeConversion错误

sca*_*cci 2 scala apache-camel akka akka-camel

我正在使用akka-camel来处理文件.我的初始测试工作得很好,但是当我开始传入实际的xml文件时,它正在尝试类型转换.

这是我的消费者(非常简单,但在msg.bodyAs [String]呕吐

class FileConsumer extends Consumer {
  def endpointUri = "file:/data/input/actor"

  val processor = context.actorOf(Props[Processor], "processor")

  def receive = {
    case msg: CamelMessage => {
      println("Parent...received %s" format msg)
      processor ! msg.bodyAs[String]
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

错误:

[ERROR] [04/27/2015 12:10:48.617] [ArdisSystem-akka.actor.default-dispatcher-5] [akka://ArdisSystem/user/$a] Error during type conversion from type: org.apache.camel.converter.stream.FileInputStreamCache to the required type: java.lang.String with value org.apache.camel.converter.stream.FileInputStreamCache@4611b35a due java.io.FileNotFoundException: /var/folders/dh/zfqvn9gn7cl6h63d3400y4zxp3xtzf/T/camel-tmp-807558/cos2920459202139947606.tmp (No such file or directory)
org.apache.camel.TypeConversionException: Error during type conversion from type: org.apache.camel.converter.stream.FileInputStreamCache to the required type: java.lang.String with value org.apache.camel.converter.stream.FileInputStreamCache@4611b35a due java.io.FileNotFoundException: /var/folders/dh/zfqvn9gn7cl6h63d3400y4zxp3xtzf/T/camel-tmp-807558/cos2920459202139947606.tmp (No such file or directory)
Run Code Online (Sandbox Code Playgroud)

我想知道它是否与xml的实际内容有关.它们一点都不大(大约70kb).我怀疑我是否能够提供XML本身的实际示例.只是感到困惑的是为什么这么小的东西和转换成字符串有问题.其他虚拟示例xml文件工作正常.

编辑: 我的建议之一是启用StreamCache,我做了.但是,它似乎仍然无法正常工作.正如Ankush评论的那样,错误令人困惑.我不确定它是否真的是Stream问题,或者它确实是转换问题.

http://camel.apache.org/stream-caching.html

添加以下内容

  camel.context.setStreamCaching(true)
Run Code Online (Sandbox Code Playgroud)

sca*_*cci 6

我终于弄清楚了问题.问题不是坏数据,而是文件的大小.为了解决这个问题,您需要向camel上下文添加addtional设置.

http://camel.apache.org/stream-caching.html

我使用的设置如下.如果我应该关闭streamcache,我将需要进一步研究,但这是一个开始.

camel.context.getProperties.put(CachedOutputStream.THRESHOLD, "750000");
Run Code Online (Sandbox Code Playgroud)

或关闭streamcache

 camel.context.setStreamCaching(false)
Run Code Online (Sandbox Code Playgroud)

希望这有助于其他人.