骆驼文件组件无法使用多线程进行并行消费。

问题描述 投票:0回答:1

我有一个目录,文件通过骆驼路由被推送到这个目录。从同一个目录中,我需要多个线程来消耗和处理这些文件,我知道使用1个线程,readLock=changed会带来至少1000ms的延迟。

<route id="processMessagesFromDirectory">
    <from uri="file:/directory?readLock=changed" />
        <threads poolSize="8"></threads>
        <doTry>
            <log message="process Initiated for ${body}" />
            <doCatch>
                <exception>java.lang.Exception</exception>
            </doCatch>
        </doTry>
    <log message="Processed ${body}" />
</route>

我知道使用1个线程,readLock=changed会带来至少1000ms的延迟。使用多个线程,同样的事情发生了,一个线程在等待1000ms的时间取走一个文件并处理,然后另一个线程取走另一个文件并处理,以此类推。使用readLock=changed选项到底是怎么回事?如何引入并行性?

我通过不使用readLock=markerFile选项能够并行处理它们,但我不想处理部分消息,也不想多次处理消息。我怎样才能做到这一点?

multithreading apache-camel
1个回答
0
投票

如果你需要使用 readLock,您可以将其值设置为 markerFile. 这将使文件得到异步处理。

<routes xmlns="http://camel.apache.org/schema/spring">
    <route id="processMessagesFromDirectory">
        <from uri="file:/directory?readLock=markerFile" />
        <threads poolSize="8" />
            <doTry>
                <log message="process Initiated for ${body}" />
                <doCatch>
                    <exception>java.lang.Exception</exception>
                </doCatch>
            </doTry>
        <log message="Processed ${body}" />
    </route>
</routes>
© www.soinside.com 2019 - 2024. All rights reserved.