Java 如何处理大型XML';阿帕奇骆驼怎么样?

Java 如何处理大型XML';阿帕奇骆驼怎么样?,java,xml,apache-camel,Java,Xml,Apache Camel,我使用的是ApacheCamel 2.14.0版本。 我创建了一个路由来轮询包含XML的目录,然后将其传递给activeMQ代理 from("file://D:/test?sortBy=file:modified&include=test_.*.xml$&noop=true").to("activemq:queue:temp.XMLFileQueue"); 它适用于小型XML(高达20Mb),但如果文件大小更大,则会产生OutOfMemoryError 为了避免这种情况,我改变

我使用的是ApacheCamel 2.14.0版本。 我创建了一个路由来轮询包含XML的目录,然后将其传递给activeMQ代理

from("file://D:/test?sortBy=file:modified&include=test_.*.xml$&noop=true").to("activemq:queue:temp.XMLFileQueue");
它适用于小型XML(高达20Mb),但如果文件大小更大,则会产生
OutOfMemoryError

为了避免这种情况,我改变了路线如下

from("file://D:/test?sortBy=file:modified&include=test_.*.xml$&noop=true").split(body().tokenizeXML("ship", "ships")).streaming().to("activemq:queue:temp.XMLFileQueue");
完成此操作后,我看到Camel正在创建多个线程来处理每个块,因此我面临一些新问题。按照我处理XML后的逻辑,它应该被删除-之前它是单线程的,所以还可以,但现在由于有多个线程,1个线程删除文件,但另一个线程仍尝试处理该文件并抛出
FileNotFoundException


如何避免这种情况?请告诉我使用单线程处理大型XML的正确方法。

您使用的是什么版本的Camel?请尝试升级到最新的2.14.x版本-在使用拆分器EIP等时,对流缓存进行了一些改进和修复。根据您的要求,可以选择实现。请参见您是否尝试设置jvm的堆大小?另外,在您的逻辑中,您在哪里执行删除操作?我无法在文件组件中看到它,因为它被设置为
noop=true
。我会限制使用线程池的线程数量,然后仅在拆分器完成删除文件之后。很难说您当前的示例,因为我看不出您实际上在哪里删除了该文件。您使用的是什么版本的Camel?尝试升级到最新的2.14.x版本-在使用拆分器EIP等时,对流缓存进行了一些改进和修复。根据您的要求,可以选择实施。请参见您是否尝试设置jvm的堆大小?另外,在您的逻辑中,您在哪里执行删除操作?我无法在文件组件中看到它,因为它被设置为
noop=true
。我会限制使用线程池的线程数量,然后仅在拆分器完成删除文件之后。很难说您当前的示例,因为我看不出您实际上在哪里删除了该文件。您使用的是什么版本的Camel?尝试升级到最新的2.14.x版本-在使用拆分器EIP等时,对流缓存进行了一些改进和修复。根据您的要求,可以选择实施。请参见您是否尝试设置jvm的堆大小?另外,在您的逻辑中,您在哪里执行删除操作?我无法在文件组件中看到它,因为它被设置为
noop=true
。我会限制使用线程池的线程数量,然后仅在拆分器完成删除文件之后。很难说你目前的例子,因为我看不到你实际上删除文件的地方。