2

Alfresco (Java ベースのもの) で Web スクリプトを作成しています。一定の間隔で、この Web スクリプトはリモート システムからファイル (大量のファイル) をダウンロードして処理し、Alfresco でファイルをバージョン管理する必要があります。

現在、この Web スクリプトは Jenkin ボックスからトリガーされるため、プロセス全体がプロセスを完了するまで、この Web スクリプトのステータスが完了しているかどうかをポーリングする予定です。これは、毎日または毎週定期的に発生します。

Jenkinジョブに定期的に中間応答を送信して処理を進めるWebscriptを作成するにはどうすればよいですか。すべてのプロセスが完了すると、同じ Webscript 呼び出しが完了ステータスをジェンキン ボックスに送信する必要があります。

どうすればこれを達成できますか?

注: Cron は使用できません。Webscript への入力として Jenkin のみを使用できます。Jenkin から送信されます (別の製品から受信されます)。

4

2 に答える 2

3

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)

上で説明した。

于 2016-01-18T01:09:25.170 に答える
1

ロジックを実装するための Web スクリプトの選択については議論しませんが、100% 大丈夫というわけではありません。

あなたの質問に関しては、ジョブ/ロジック実行の全体的な進行状況をいくつかのシングルトンに保存し、他の webscript (または異なるパラメーターを持つ同じもの) がその値を返すようにすることができます。

于 2016-01-14T23:48:11.250 に答える