1

私たちは、リクエストを個別に処理し、任意の外部 Web サービスに対して順番に処理するアウトバウンド メッセージ キュー システムを作成したいと考えていました。これらのリクエストを処理する頻度は可変ですが、例として、プロセスを 30 秒ごとに実行したい場合があります。

1 時間に 30 秒ごとに同じジョブを 120 回スケジュールすることは不可能であり、現実的ではありません。

私が最終的に落ち着いたアプローチは、頂点をスケジュールする(スケジュールされた時間まで待機し、将来のメソッドを呼び出し、それ自体を削除(中止)する)->将来の呼び出し(リクエストがある場合は処理し、クラスを再スケジュールして30秒で再実行する)を連鎖することでした。 apex (future メソッドを 30 秒以内に呼び出し、それ自体を中止) -> future 呼び出し (リクエストの処理と再スケジュール) などを無期限に繰り返します。最終結果は、現在 2 週間本番環境で実行されていますが、再スケジュールに失敗しただけで、その理由がわかりません。

何が起こっているのかは、ある種のガバナー制限に違反していると思いますが、その方法がわかりません。サンドボックスで同様の問題が頻繁に発生しており、将来のリクエストの制限を超えたことを示す制限例外を受け取りました。

サービスが失敗した時点から、過去 24 時間のすべての非同期ジョブ (将来だけでなく) を照会したところ、2200 だけが返されました。ジョブは future メソッドを呼び出した後、自分自身を中止します)。

それでも、Salesforce は、24 時間ごとに 250,000 回の非同期 Apex 実行が許可されていると述べているため、何が起こっているのかわかりません。この方法でスケジュールされたジョブをチェーンしようとした経験のある人はいますか? これを達成するためのより良い方法はありますか?私が認識していない制限はありますか、それとも非同期実行を間違った方法で測定していますか?

ヘルプやアドバイスをいただければ幸いです。

4

2 に答える 2

0

私は以前、Apex を 30 秒ではなく 5 分の粒度でこれを実行させることにかなり成功しましたが、いずれにせよ、この方法には固有の脆弱性があります。@future 呼び出しには実行時間が保証されていないため、通常は呼び出し後すぐに実行されますが、遅延する可能性があります。私は @future メソッドの実行で 20 分の遅延を経験したことがあります。そのため、スケジュールされた実行が思ったよりも少ない理由を説明できるかもしれません (ただし、予想のちょうど半分であるという事実は不可解です)。

つまり、少なくともこの記事の執筆時点では、Scheduled Apex は実際にはこのユースケース向けに作成されていないということです。私の場合、Heroku Schedulerを仲介として使用することになりました。これは理想的なソリューションではないことは承知しています (別のプラットフォーム、別の言語、それでも Force.com です) が、より堅牢です。

于 2013-06-19T20:20:50.320 に答える