ConcurrentHashMap<String, Future<String>>
PDF識別子(ファイルパスなど)をキーとして使用し、変換操作自体を表すタスクを値として使用できます。
のputIfAbsent
メソッドはコンペア アンド セット操作ConcurrentHashMap
の問題を処理でき、 のメソッドは変換が終了したかどうかを示すことができます。isDone
Future
がputIfAbsent
返された場合null
、指定された PDF の変換タスクがまだ存在していないことを意味します。そのためExecutorService.submit(Callable<T> task)
、新しく作成した変換タスクを起動するために呼び出す必要があります。それ以外の場合は、この手順を省略して、既存のタスクが完了するまで待ちます。
モックアップ:
Future<String> conversionTask = ... // blah
Future<String> existingTask = conversions.putIfAbsent(pdfId, conversionTask);
if (existingTask != null) {
conversionTask = existingTask;
}
// Either way, conversion is scheduled by now.
はExecutorService
変換リクエストをキューに入れます。
変換が完了すると、Future<V>.get()
メソッドを介して結果を取得できます。
Java EE アプリケーション内でスレッドを生成することは、仕様では許可されていないことに注意してください。一般的なアプローチは、非同期処理を JMS サービスとして分離することです。ここではApache Camelが役立ちます。