我定义了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&sortBy=ignoreCase:file:name&readLock=markerFile&readLockCheckInterval=5000&readLockTimeout=10m&maxMessagesPerPoll=1" />
<process ref="beginProcess"></process>
</route>
<route>
<from
uri="file://directoryStructure2/?move=archive&sortBy=ignoreCase:file:name&readLock=markerFile&readLockCheckInterval=5000&readLockTimeout=10m&maxMessagesPerPoll=1" />
<process ref="beginProcess"></process>
</route>
</camel:camelContext>
<bean id="beginProcess" class="package.groovy.class"> </bean>
答案 0 :(得分:5)
好像你正在使用你的类的单例(单实例)对象,因为当你定义&#34; beginProcess&#34;时,这将是默认的。
如果&#34; package.groovy.class&#34;的实现,那很好。是线程安全的,似乎是这种情况,它不是。
基本上,有几种方法可以解决这个问题。
1)永远不要处理并发。使用SEDA传输很容易实现,可以在处理另一个文件时将文件堆叠在队列中。
<route>
<from
uri="file://directoryStructure1/?move=archive&sortBy=ignoreCase:file:name&readLock=markerFile&readLockCheckInterval=5000&readLockTimeout=10m&maxMessagesPerPoll=1" />
<to uri="seda:process"/>
</route>
<route>
<from
uri="file://directoryStructure2/?move=archive&sortBy=ignoreCase:file:name&readLock=markerFile&readLockCheckInterval=5000&readLockTimeout=10m&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线程安全。也就是说,不应将任何字段和变量保存为状态,或者应该可以在并发请求之间共享状态并进行同步。