4

我定义了 10 条路线,其中列出了 2 条。其他 8 个相同,但 from 端点是不同的目录。每条路由都会选择一个位于目录中的文件,并由一个 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>
4

1 回答 1

5

似乎您正在使用类的单例(单实例)对象,因为当您定义“beginProcess”时,这将是春季的默认设置。

没关系,如果“package.groovy.class”的实现是线程安全的,似乎是这样,但事实并非如此。

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

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 作用域的一个很好的页面可以在这里找到。

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

于 2012-06-25T20:47:19.760 回答