我定义了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线程安全.也就是说,不应将任何字段和变量保存为状态,或者应该可以在并发请求之间共享状态并进行同步.
标签:spring,groovy,apache-camel 来源: https://codeday.me/bug/20190620/1249126.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。