4

10 のルートが定義されており、そのうちの 2 つがここにリストされています。他の 8 つは同じですが、from エンドポイントは別のディレクトリです。各ルートは、dir にあるファイルを取得し、1 つの groovy クラスによって処理されます。1 つのファイルがディレクトリの 1 つにドロップされると正常に動作しますが、ファイルが各ディレクトリに同時にドロップされると、各スレッドが混乱しているように見えます。各ファイルをピックアップしたというログメッセージを受け取りますが、各ファイルがピックアップされると、groovy で定義されたすべての変数が変更されるように、各スレッドが 1 つのプロセス「beginProcess」を使用しているように見えます。これに意味があるかどうかはわかりませんが、しかし、誰かが私が以下でやっていることは合法だと言うことができますか? 基本的に、複数のルートで 1 つのクラスを呼び出すことができます。もしそうなら、少なくとも私はそれが私のグルーヴィーなクラスになければならないことを知っているでしょう(しかし、それが1つのファイルで動作することを見ると、それはここにはないことを示唆していますが、現時点ではそれを想定していません). どうもありがとう!

<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>
4

1 に答える 1

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 を作成します。

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

Spring Bean のスコーピングに関する優れたページがここにあります

3) package.groovy.class をスレッドセーフにします。つまり、フィールドや変数を状態として保持しないか、状態を同時要求間で共有して同期できるようにする必要があります。

于 2012-06-25T20:47:19.760 に答える