みなさんこんにちは。
salesforceお助け隊の加藤です。
Apexスケジューラに登録したApexクラスから、外部サービスを呼び出す場合、
futureアノテーションを使用する必要があります。
futureアノテーションを使用しないで、
Apexスケジューラに登録したApexクラスから外部サービスを実行した場合、
外部との通信処理時に、以下の例外が発生します。
System.CalloutException: Callout from scheduled Apex not supported.
futureアノテーションを指定できるメソッドは静的メソッドで且つ、
値を返さないメソッド(void)である必要があります。
また、オプションとして(callout=true)を指定します。
例:
@future(callout=true)
static void myMethod(String s) {
・・・
}
なので、外部サービスを呼び出す処理は、
Apexスケジューラに登録できるSchedulableインターフェースを継承したApexクラスではなく、
別のクラスで処理を実装することになります。
なぜ、Apexスケジューラから実行する場合に、
外部サービスを呼び出すメソッドには、
futureアノテーションを使用しないとエラーが発生するかというと、
futureアノテーションがない場合、外部サービスを呼び出す処理は、
Apexスクリプトを実行している同じスレッドから実行され、
処理が完了するまで同期されてしまいます。
逆に、futureアノテーションを指定すると非同期で実行することが可能になります。
以上のことから、Apexスケジューラのように定期的に処理を実行する場合、
外部サービスとのやりとりで同期を取ってしまうと、後続のジョブに影響がでるため、
強制的にfutureアノテーションの実装を促しているのだと思われます。
「セールスフォースお助け隊ブログ」へのコメントやご意見等ありましたら
ファンページまでお願いします。 Facebookのファンページ