spring – 处理相同文件的多个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>

解决方法:

看起来你正在使用类的单例(单实例)对象,因为当你定义“beginProcess”时,这将是spring的默认值.

这很好,如果“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"/>

关于春豆范围的好页面被发现here.

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

相关文章

背景:    8月29日,凌晨4点左右,某服务告警,其中一个...
https://support.smartbear.comeadyapi/docs/soapui/steps/g...
有几个选项可用于执行自定义JMeter脚本并扩展基线JMeter功能...
Scala和Java为静态语言,Groovy为动态语言Scala:函数式编程,...
出处:https://www.jianshu.com/p/ce6f8a1f66f4一、一些内部...
在运行groovy的junit方法时,报了这个错误:java.lang.Excep...