Alfrescoでバッチ処理を実装する方法を以下に説明します。詳細に入る前に、このプロセスを Activiti ワークフロー (または必要に応じて JBPM) と統合することもお勧めします。
後で説明するように、プロセスはイベントを送信して、ジョブの進行状況をリスナーに通知します。これらのイベントのリスナーは、Jenkins を直接呼び出すことができます。
Jenkins を直接呼び出す代わりに、リスナーはワークフローを更新できます。この場合、Jenkins を呼び出すロジックはワークフロー タスクに実装されます。これにより、バッチ プロセスのロジックをノーティファイアのロジックから簡単に分離できます。さらに、ワークフローを使用して、ジョブの進行状況に関する情報を保存することもできます。この情報は、関心のある人/何かによって最終的にポーリングされる可能性があります。
長時間実行プロセス:
使用している Alfresco のバージョンがわかりません。バージョン 4.1 のソリューションについて説明します。Alfresco は、主にパッケージ org.alfresco.repo.batch のクラスとインターフェイスを使用して、長時間実行されるバッチ プロセスをサポートしています。
BatchProcessWorkProvider
バッチプロセッサ
BatchProcessor.BatchProcessWorker
バッチモニター
BatchMonitorEvent.java
BatchProcessorWorkProvider と BatchProcessor.BatchProcessWorker の 2 つのインターフェイスの実装を提供する必要があります。
両方のインターフェースを以下に添付します。1 つ目は作業負荷を返し、2 つ目はワーカーとは何かを定義します。
バッチプロセッサ:
/**
* An interface that provides work loads to the {@link BatchProcessor}.
*
* @author Derek Hulley
* @since 3.4
*/
public interface BatchProcessWorkProvider<T>
{
/**
* Get an estimate of the total number of objects that will be provided by this instance.
* Instances can provide accurate answers on each call, but only if the answer can be
* provided quickly and efficiently; usually it is enough to to cache the result after
* providing an initial estimate.
*
* @return a total work size estimate
*/
int getTotalEstimatedWorkSize();
/**
* Get the next lot of work for the batch processor. Implementations should return
* the largest number of entries possible; the {@link BatchProcessor} will keep calling
* this method until it has enough work for the individual worker threads to process
* or until the work load is empty.
*
* @return the next set of work object to process or an empty collection
* if there is no more work remaining.
*/
Collection<T> getNextWork();
}
BatchProcessWorker :
/**
* An interface for workers to be invoked by the {@link BatchProcessor}.
*/
public interface BatchProcessWorker<T>
{
/**
* Gets an identifier for the given entry (for monitoring / logging purposes).
*
* @param entry
* the entry
* @return the identifier
*/
public String getIdentifier(T entry);
/**
* Callback to allow thread initialization before the work entries are
* {@link #process(Object) processed}. Typically, this will include authenticating
* as a valid user and disbling or enabling any system flags that might affect the
* entry processing.
*/
public void beforeProcess() throws Throwable;
/**
* Processes the given entry.
*
* @param entry
* the entry
* @throws Throwable
* on any error
*/
public void process(T entry) throws Throwable;
/**
* Callback to allow thread cleanup after the work entries have been
* {@link #process(Object) processed}.
* Typically, this will involve cleanup of authentication and resetting any
* system flags previously set.
* <p/>
* This call is made regardless of the outcome of the entry processing.
*/
public void afterProcess() throws Throwable;
}
実際には、BatchProcessWorkProvider は「実行する作業」(「T」クラス) のコレクションを返します。「作業」は、提供する必要があるクラスです。あなたの場合、このクラスは、リモート システムからファイルのサブセットを抽出するための情報を提供できます。メソッド プロセスは、この情報を使用して実際にジョブを実行します。例として、あなたの場合、T、ImportFiles を呼び出すことができます。
BatchProcessWorkProvider は、ファイルのリストを適切なサイズの ImportFiles のコレクションに分割する必要があります。
BatchProcessWorker の「最も重要な」メソッドは
public void process(ImportFiles filesToImport) throws Throwable;
これは、実装する必要があるメソッドです。他のメソッドには、デフォルトの実装を提供するアダプター BatchProcess.BatchProcessWorkerAdapter があります。
process メソッドはパラメーターとして ImportFiles を受け取り、それを使用してリモート サーバー内のファイルを検索し、インポートできます。
最後に、BatchProcessor をインスタンス化する必要があります。
try {
final RetryingTransactionHelper retryingTransactionHelper = transactionService.getRetryingTransactionHelper();
BatchProcessor<ImportFiles> batchProcessor = new BatchProcessor<ImportFiles>(processName,
retryingTransactionHelper, workProvider, threads, batchSize,
applicationEventPublisher, logger, loggingInterval);
batchProcessor.process(worker, true);
}
catch (LockAcquisitionException e) {
/* Manage exception */
}
どこ
processName: 長期実行プロセスの説明
BatchProcessWorkProvider のインスタンス
スレッド: ワーカー スレッドの数 (並列)
batchSize: 同じトランザクションで処理するエントリの数
logger: 進行状況の報告に使用するロガー
loggingInterval: 進行状況を報告する前に処理するエントリの数
retryingTransactionHelper: 同時更新の失敗 (楽観的ロック) またはデッドロック状態が発生した場合に、トランザクションを再試行するヘルパー クラスです。
applicationEventPublisher: これは通常 (Alfresco でも) Spring ApplicationContext である Spring ApplicationEventPublisher のインスタンスです。
Jenkins にイベントを送信するには、applicationEventPublisher を使用できます。以下のリンクで使い方が説明されています。Springの標準機能です。
春のイベント
イベントは、たとえばメソッドによって送信できます
process(ImportFiles filesToImport)
上で説明した。