2012-06-25 4 views
4

У меня есть 10 маршрутов, определенных двумя из перечисленных здесь. Остальные 8 идентичны, но от конечной точки - другой каталог. Каждый маршрут берет файл, который находится в каталоге и обрабатывается одним классом groovy. Когда один файл выгружается в один из файлов, он работает нормально, но когда файл попадает в каждый из директорий, каждый поток, по-видимому, переходит в haywire. Я получаю сообщения о регистрации, которые я выбрал для каждого файла, но тогда кажется, что каждый поток использует один процесс «beginProcess», потому что его, как и все мои переменные, определенные в 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> 

ответ

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 id="beginProcess" class="package.groovy.class" scope="prototype"/> 

Хорошая страница о весеннем боба обзорного найден here.

3) Сделайте свой пакет.groovy.class потоком безопасным. То есть никакие поля и переменные не должны храниться как состояние или, состояние должно быть доступно для совместного использования между параллельными запросами и быть синхронизированными.

+0

Я использовал транспорт SEDA. Это работало как шарм. Я считаю, что я столкнулся с тем, что вы сказали в 3. Спасибо! – Curt

Смежные вопросы