多个camel路由处理相同的文件

时间:2012-06-25 15:51:35

标签: spring groovy apache-camel

我定义了10条路线,其中2条列在此处。其他8个是相同的,但是从端点是不同的目录。每个路由选取一个位于目录中的文件,并由一个groovy类处理。当一个文件被放入其中一个目录时,它工作正常,但是当一个文件同时被丢弃到每个目录中时,每个线程似乎都会变得混乱。我确实收到了我已经获取每个文件的日志消息,但似乎每个线程使用一个进程“beginProcess”,因为它像groovy中定义的所有变量一样,每个文件被拾取时都会被更改。我不确定这是否有任何意义,但有人可以告诉我,我在下面做的是合法的吗?基本上可以多个路由调用一个类,如果是,我是否正确这样做?如果它是至少我会知道它必须在我的groovy类(但看到它适用于一个文件表明它不在这里,但不假设在这一点)。非常感谢!

<camel:camelContext id="myId"
    xmlns="http://camel.apache.org/schema/spring">

    <route>
        <from
            uri="file://directoryStructure1/?move=archive&amp;sortBy=ignoreCase:file:name&amp;readLock=markerFile&amp;readLockCheckInterval=5000&amp;readLockTimeout=10m&amp;maxMessagesPerPoll=1" />
        <process ref="beginProcess"></process>
    </route>

    <route>
        <from
            uri="file://directoryStructure2/?move=archive&amp;sortBy=ignoreCase:file:name&amp;readLock=markerFile&amp;readLockCheckInterval=5000&amp;readLockTimeout=10m&amp;maxMessagesPerPoll=1" />
        <process ref="beginProcess"></process>
    </route>
</camel:camelContext>

    <bean id="beginProcess" class="package.groovy.class">   </bean>

1 个答案:

答案 0 :(得分:5)

好像你正在使用你的类的单例(单实例)对象,因为当你定义&#34; beginProcess&#34;时,这将是默认的。

如果&#34; package.groovy.class&#34;的实现,那很好。是线程安全的,似乎是这种情况,它不是。

基本上,有几种方法可以解决这个问题。

1)永远不要处理并发。使用SEDA传输很容易实现,可以在处理另一个文件时将文件堆叠在队列中。

<route>
    <from
        uri="file://directoryStructure1/?move=archive&amp;sortBy=ignoreCase:file:name&amp;readLock=markerFile&amp;readLockCheckInterval=5000&amp;readLockTimeout=10m&amp;maxMessagesPerPoll=1" />
    <to uri="seda:process"/>
</route>
<route>
    <from
        uri="file://directoryStructure2/?move=archive&amp;sortBy=ignoreCase:file:name&amp;readLock=markerFile&amp;readLockCheckInterval=5000&amp;readLockTimeout=10m&amp;maxMessagesPerPoll=1" />
    <to uri="seda:process"/>
</route>

<route>
  <from uri="seda:process"/>
  <process ref="beginProcess"/>
</route>

2)每次调用beginProcess时都要创建一个新bean:

 <bean id="beginProcess" class="package.groovy.class" scope="prototype"/>

找到一个关于spring bean范围的好页面here

3)使您的package.groovy.class线程安全。也就是说,不应将任何字段和变量保存为状态,或者应该可以在并发请求之间共享状态并进行同步。