我定义了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>
解决方法:
看起来你正在使用类的单例(单实例)对象,因为当你定义“beginProcess”时,这将是spring的默认值.
这很好,如果“package.groovy.class”的实现是线程安全的,似乎是这种情况,事实并非如此.
基本上,有几种方法可以解决这个问题.
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"/>
关于春豆范围的好页面被发现here.
3)使您的package.groovy.class线程安全.也就是说,不应将任何字段和变量保存为状态,或者应该可以在并发请求之间共享状态并进行同步.