次の点についてアドバイスが必要です。
私は @Scheduled サービス メソッドを持っています。これには数秒の fixedDelay があり、作業キューをスキャンし、適切な作業が見つかった場合は適切な作業を処理します。同じサービスで、作業を作業キューに入れるメソッドがあり、このメソッドが完了したらすぐにキューのスキャンをトリガーしたいと思います (スキャナーに対して行う作業があると確信しているため)スケジュールされた開始前の遅延を回避するため (これは数秒である可能性があり、時間が多少重要であるため)。
Task Execution and Scheduling サブシステムの「今すぐトリガー」機能が理想的です。これは、実行が手動で開始された後に fixedDelay もリセットする機能です (手動実行がスケジュールされたものと衝突したくないため)。注: キュー内の作業は外部ソースから取得される可能性があるため、定期的なスキャンを実行する必要があります。
どんなアドバイスでも大歓迎です
編集:キューはドキュメントベースのデータベースに保存されるため、ローカルキューベースのソリューションは適切ではありません。
私があまり満足していない解決策(生のスレッドの使用があまり好きではない)は、次のようになります。
@Service
public class MyProcessingService implements ProcessingService {
Thread worker;
@PostCreate
public void init() {
worker = new Thread() {
boolean ready = false;
private boolean sleep() {
synchronized(this) {
if (ready) {
ready = false;
} else {
try {
wait(2000);
} catch(InterruptedException) {
return false;
}
}
}
return true;
}
public void tickle() {
synchronized(this) {
ready = true;
notify();
}
}
public void run() {
while(!interrupted()) {
if(!sleep()) continue;
scan();
}
}
}
worker.start();
}
@PreDestroy
public void uninit() {
worker.interrup();
}
public void addWork(Work work) {
db.store(work);
worker.tickle();
}
public void scan() {
List<Work> work = db.getMyWork();
for (Work w : work) {
process();
}
}
public void process(Work work) {
// work processing here
}
}