2

ビジネスプロセスを自動化するためにバッチ処理を行う必要があります。新しいファイルを検出して処理を行うために、定期的にディレクトリをポーリングする必要があります。古いファイルが処理されている間に、新しいファイルが入ってきます。今のところ、Quartz スケジューラとスレッド同期を使用して、1 つのスレッドだけがファイルを処理できるようにしています。

コードの一部は次のとおりです。

アプリケーションコンテキスト.xml

<bean id="methodInvokingJob"
  class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"><br/>
  <property name="targetObject" ref="documentProcessor" /><br/>
  <property name="targetMethod" value="processDocuments" /><br/>
</bean>

DocumentProcessor
.....

public void processDocuments() { 
  LOG.info(Thread.currentThread().getName() + " attempt to run.");
  if (!processing) {
     synchronized (this) {
        try {
           processing = true;
           LOG.info(Thread.currentThread().getName() + " is processing");
           List<String> xmlDocuments = documentManager.getFileNamesFromFolder(incomingFolderPath);               
           // loop over the files and processed unlock files.
           for (String xmlDocument : xmlDocuments) {
              processDocument(xmlDocument);
           }
        }
        finally {
           processing = false;
        }
     }
  }
}

現在のコードでは、1 つのスレッドが処理しているときに他のスレッドがファイルを処理できないようにする必要があります。それは良い考えですか?または、マルチスレッド処理をサポートしています。その場合、どのファイルが処理中で、どのファイルが到着したかをどのように知ることができますか? どんなアイデアでも大歓迎です。

4

2 に答える 2

5

私はこれらの部品でそれを構築します:

  1. TxF でのキャッスル トランザクション

  2. FileSystemWatcher JavaVersion

  3. TransactionScope (たくさんハックしない限り、Java バージョンはありません)

  4. ロックフリー キュー* (Perf Java と .Net について議論している論文では、Java のソースをそれらから取得できる可能性があります) Java ロックベースのキュー

    そのような:

新しいファイルがある場合、ファイル システム ウォッチャーはそれを検出し (正しいフラグを設定し、エラー状態を処理し、Enbled <- True を設定し、二重に注意することを忘れないでください)、ファイル パスをキューに入れます。

アプリケーション スレッド、n 個のワーカー スレッドがあります。これが唯一のアプリである場合は、キュー TryDequeue でスピン待機し、それ以外の場合はモニターでブロックします while(!Monitor.Enter(has_items)) ;

ワーカー スレッドは、デキュー操作によってパスを取得すると、そのパスで作業を開始し、他のスレッドはそのパスで作業できなくなります。二重の出力がある場合 (セットアップによって異なります)、出力ファイルを書き込んでいるときにファイル トランザクションを使用できます。コミット操作が失敗した場合、別のスレッドが既に出力ファイルを書き込んでいることがわかり、キューのポーリングを再開します。

于 2010-03-08T10:28:21.577 に答える
2

私は次のことをします:

  • ファイル名を取得して同期キューに追加する 1 つのスレッド。

  • 実際の読み取りを行うための複数のスレッド: 同期されたキューから項目を取得して処理します。

ファイルが使用されているかどうかを確認するには、ファイルの名前を変更/移動してみてください。

于 2010-03-08T10:17:20.233 に答える