現時点では、長時間実行されるタスク(ジョブ)を処理するRESTfulAPIを使用してWebサービスを構築しようとしています。
アイデアは、ユーザーがPOSTを実行してジョブを送信することです。このPOSTは、結果のURLも含むジョブステータスをチェックするためのURLを返します。ジョブが完了すると(つまり、何らかの値がデータベースに書き込まれると)、結果のURLは(結果がないのではなく)適切な情報を返し、ジョブのURLは完了したステータスを示します。
残念ながら、計算は非常に集中的であるため、一度に実行できるのは1つだけであるため、ジョブをキューに入れる必要があります。
疑似的にはこのようなものが必要になります
(def job-queue (atom queue)) ;; some queue
(def jobs (atom {}))
(defn schedule-job [params]
;; schedules the job into the queue and
;; adds the job to a jobs map for checking status via GET
;; note that the job should not be evaluated until popped from the queue
)
(POST "/analyze" [{params :params}]
(schedulde-job params))
(GET "job/:id" [:d]
(get @jobs id))
;; Some function that pops the next item from the queue
;; and evaluates it when the previous item is complete
;; Note: should not terminate when queue is empty!
非同期処理を可能にするLaminaを調べましたが、ニーズに合わなかったようです。
私の質問は、キューが空になったときに終了せずに、つまり着信ジョブを永続的に処理することなく、ジョブキューをデキューして、前のタスクが終了した後にそのタスクを実行する方法です。