セールスフォースお助け隊ブログ | Salesforce
セールスフォース開発者のブログRSS
Apexスケジューラを使用して外部サービスを呼び出す場合の注意点

Apexスケジューラを使用して外部サービスを呼び出す場合の注意点

2010年12月 6日 20:08

みなさんこんにちは。
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のファンページ

Yahoo!ブックマークに登録 Google ブックマーク はてなブックマーク Livedoorクリップ

← 前のエントリー     次のエントリー →

顧客管理システム Salesforce CRM