我使用Apache Fuse ESB和Apache Camel 2.4.0以及Spring 3.0.3来处理一些大文件。 ActiveMQ 5.5.0代理附带ServiceMix,它几乎是一个基本配置。架构看起来像这样: 1.服务单元,从文件中读取行并在交换机体内发送每一行 2.服务单元2从前一个交换中获取行,将其转换为xml并在交换机体内发送xml 3.获取xml的服务单元3,将其转换为另一个xml并发送xml 4.服务单元4获取最终的xml,将其解组成一个对象,将该对象插入到数据库中并将最终的交换发送给服务,该服务检查它是否是文件的末尾 5.服务单元5,如果它是文件的结尾,则重置标志
这个架构工作得很好,但有一个" minor"问题,进入db(服务单元4)的插入/更新操作非常慢,从初始文件处理18.000行需要3个多小时。最后,我发现必须设置一个参数"sendStringParametersAsUnicode=false"
,以便在使用Sql Server 2000 +时提高性能。
在jdbc驱动程序url上设置此参数后,性能确实显着提高,db操作将花费不到1秒,而不是之前的50秒。但是出现了异常,我不知道如何解决它。
这是Apache Camel用于从一个服务单元与下一个服务单元进行通信的队列的当前配置:
<amq:policyEntry queue=">" producerFlowControl="true" memoryLimit="256kb">
使用这种配置,当我添加&#34; sendStringParametersAsUnicode = false&#34;在集成了大约7000行之后,我得到了EOFException。如果我将其切换为:
<amq:policyEntry queue=">" producerFlowControl="true" memoryLimit="512mb">
我可以处理大约10000行,但我仍然得到例外。
如果我将memoryLimit增加到1mb或更多,我会得到另一个例外,说servicemix无法通过端口62626到达代理,因为该端口上已经有另一个绑定,这是无稽之谈,因为没有什么可以肯定的
我在我的本地计算机上运行256kb的基本配置,速度提高了3倍,无论我尝试多少,我都无法使代理崩溃并获得任何异常。
他有同样的问题并解决了,但我不明白他的观点: &#34;通过放松ActiveMQ的配置以解决快速生产者问题,解决了这个问题。&#34;
http://camel.465427.n5.nabble.com/handling-large-files-tp471986p472003.html
我怀疑这是一个ActiveMQ问题,代理只是关闭了从文件读取行的服务单元的连接,但我不明白为什么或在哪里。这是完整的堆栈跟踪:
错误| Camel Thread 0 - file:/// d:/ activesmx / inbox | DefaultErrorHandler | .apache.camel.processor.Logger 248 | exchangeId的交付失败:3889e287-a8aa-475c-b377-26a6963c19d2。 交付尝试后用尽:1抓住: org.springframework.jms.UncategorizedJmsException:未分类 JMS处理期间发生异常;嵌套异常是 javax.jms.JMSException:java.io.EOFException org.springframework.jms.UncategorizedJmsException:在JMS处理期间发生未分类的异常;嵌套异常是 javax.jms.JMSException:java.io.EOFException 在org.springframework.jms.support.JmsUtils.convertJmsAccessException(JmsUtils.java:316) 在org.springframework.jms.support.JmsAccessor.convertJmsAccessException(JmsAccessor.java:168) 在org.springframework.jms.core.JmsTemplate.execute(JmsTemplate.java:469) at org.apache.camel.component.jms.JmsConfiguration $ CamelJmsTemplate.send(JmsConfiguration.java:195) 在org.apache.camel.component.jms.JmsProducer.doSend(JmsProducer.java:375) 在org.apache.camel.component.jms.JmsProducer.processInOnly(JmsProducer.java:320) 在org.apache.camel.component.jms.JmsProducer.process(JmsProducer.java:150) at org.apache.camel.impl.converter.AsyncProcessorTypeConverter $ ProcessorToAsyncProcessorBridge.process(AsyncProcessorTypeConverter.java:50) at org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:70) 在org.apache.camel.processor.SendProcessor $ 2.doInAsyncProducer(SendProcessor.java:104) at org.apache.camel.impl.ProducerCache.doInAsyncProducer(ProducerCache.java:272) 在org.apache.camel.processor.SendProcessor.process(SendProcessor.java:98) .................................................. ................................. 在org.apache.camel.processor.Pipeline.process(Pipeline.java:143) 在org.apache.camel.processor.Pipeline.process(Pipeline.java:78) 在org.apache.camel.processor.UnitOfWorkProcessor.process(UnitOfWorkProcessor.java:99) at org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:70) at org.apache.camel.processor.DelegateAsyncProcessor.processNext(DelegateAsyncProcessor.java:98) 在org.apache.camel.processor.DelegateAsyncProcessor.process(DelegateAsyncProcessor.java:89) 在org.apache.camel.management.InstrumentationProcessor.process(InstrumentationProcessor.java:68) at org.apache.camel.component.file.GenericFileConsumer.processExchange(GenericFileConsumer.java:322) 在org.apache.camel.component.file.GenericFileConsumer.processBatch(GenericFileConsumer.java:153) 在org.apache.camel.component.file.GenericFileConsumer.poll(GenericFileConsumer.java:119) 在org.apache.camel.impl.ScheduledPollConsumer.run(ScheduledPollConsumer.java:98) at java.util.concurrent.Executors $ RunnableAdapter.call(Unknown Source) at java.util.concurrent.FutureTask $ Sync.innerRunAndReset(Unknown Source) at java.util.concurrent.FutureTask.runAndReset(Unknown Source) at java.util.concurrent.ScheduledThreadPoolExecutor $ ScheduledFutureTask.access $ 101(未知 资源) at java.util.concurrent.ScheduledThreadPoolExecutor $ ScheduledFutureTask.runPeriodic(Unknown 资源) at java.util.concurrent.ScheduledThreadPoolExecutor $ ScheduledFutureTask.run(Unknown 资源) at java.util.concurrent.ThreadPoolExecutor $ Worker.runTask(Unknown Source) at java.util.concurrent.ThreadPoolExecutor $ Worker.run(Unknown Source) 在java.lang.Thread.run(未知来源) 引起:javax.jms.JMSException:java.io.EOFException 在org.apache.activemq.util.JMSExceptionSupport.create(JMSExceptionSupport.java:49) at org.apache.activemq.ActiveMQConnection.syncSendPacket(ActiveMQConnection.java:1296) at org.apache.activemq.ActiveMQConnection.ensureConnectionInfoSent(ActiveMQConnection.java:1393) 在org.apache.activemq.ActiveMQConnection.createSession(ActiveMQConnection.java:310) 在org.springframework.jms.support.JmsAccessor.createSession(JmsAccessor.java:196) 在org.springframework.jms.core.JmsTemplate.execute(JmsTemplate.java:457) ......还有144个 引起:java.io.EOFException 在java.io.DataInputStream.readInt(未知来源) 在org.apache.activemq.openwire.OpenWireFormat.unmarshal(OpenWireFormat.java:276) 在org.apache.activemq.transport.tcp.TcpTransport.readCommand(TcpTransport.java:230) 在org.apache.activemq.transport.tcp.TcpTransport.doRun(TcpTransport.java:222) 在org.apache.activemq.transport.tcp.TcpTransport.run(TcpTransport.java:205) ......还有1个