6

次の点についてアドバイスが必要です。

私は @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
    }

}
4

1 に答える 1