2012-06-25 135 views
4

我與他們的2列在這裏定義的10條路線。其他8個是相同的,但從端點是不同的目錄。每個路由選取一個位於目錄中的文件,並由一個常規類處理。當一個文件被放入其中一個目錄時它工作正常,但是當一個文件被放入每個目錄時,每個線程似乎都會失控。我確實收到了我已經拿到每個文件的日誌消息,但是似乎每個線程都使用一個進程「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」的implementaiton是線程安全的,這似乎是這樣的,其實不然。

基本上,有一些方法來解決這個問題。

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)創建一個新的bean每次beginProcess被稱爲時間:

<bean id="beginProcess" class="package.groovy.class" scope="prototype"/> 

有關的Spring bean的作用域一個好的頁面發現here

3)讓您package.groovy.class線程安全的。也就是說,任何字段和變量都不應該作爲狀態保存,或者應該可以在併發請求之間共享狀態並進行同步。

+0

我用SEDA運輸。這就像一個魅力。我相信我遇到了你在3中所說的話。謝謝! – Curt