4

最大同時ジョブ数=4に設定してZendServerJobsを使用していますが、この設定が必要です。多くの優先度の高いジョブは、できるだけ早く提供する必要があります。

また、実行時間が5〜7分と長い優先度の低いジョブがあります-重いDB操作-並列実行がDBリソースとタイムアウトを求めて競合する場合は、このジョブを一度に1つずつ実行します。それらを作成するループがあり(約30ジョブ)、getJobsList()を使用して適切な名前のジョブがキューに存在するかどうかを確認し、最大のジョブIDを取得して、次のジョブの先行として設定します。ただし、ジョブがすでに作成されていても(2回目の反復)getJobsList()によって取得されず、後続の反復では最大/最新のジョブIDが取得されません...

ジョブの作成中に遅延が発生しますか?createHttpJob()およびそれに続くgetJobsList()は、最近作成されたものを返しません。

先行が設定され、先行が失敗した後(タイムアウトなど)、依存関係は自動的に失敗します。

これは、ステータスに関係なく完了するように先行タスクを設定する方法ですか?キューに入っていないか、すでに実行されているだけですか?

4

1 に答える 1

1

私はあなたの問題を理解しようとしていますが、それは私がしばらく前に修正した問題に私を連れて行きます.私はここで私の問題/解決策を共有しています.それからのいくつかのヒントであなたの問題。

投稿する必要があるメッセージのテーブルがあるというかなり単純な問題がありました(ステータスが保留中から送信済みまたはエラーに更新されるようにするため)。単一の JOB を実行し、このすべての送信を行うと問題が発生するため、5 秒ごとに開始する crontab で行った複数のインスタンスを生成する必要があります (このためには、cron がデフォルトで毎分のみ開始されるため、スリープ ロジックを記述する必要があります)。これで、各ジョブは 5 秒間隔で開始されるようにスケジュールされ、特定の JOB-WORKER-ID がスクリプトへの引数として手動で割り当てられます。これは、各ジョブの ID が必要であり、同時に JOB-WORKER- が重複しないためです。 ID有効。

そのために、すべてのジョブをログに記録し、start_time、end_time、および各ジョブの実行中に送信されたメッセージの数を格納する、JOB_LOG のようなテーブルを保持しています。新しいJOBを開始するたびに、同じJOB-WORKER-IDが実行されているかどうかを確認しますか? JOB_LOG テーブルに対して次のクエリを実行します。

SELECT end_time FROM JOB_LOG WHERE job_worker_id = <N> ORDER BY JOB_LOG_ID DESC

end_time が指定されていない場合は、JOB がまだ実行中であることを意味します。それ以外の場合は、新しい JOB を安全に開始できます。:-)

テーブルのテーブル構造は、次のようになります。

job_log
 - job_log_id
 - start_time
 - end_time
 - message_sent_count
 - job_worker_id

私の答えがあなたの問題を正確に解決するわけではないことは知っていますが、いくつかの類似点があり、内部からいくつかの手がかりを見つけることができることがわかります.

幸運を。

于 2012-05-27T12:11:04.643 に答える