この文章は Salesforce 機械翻訳システムを使用して翻訳されました。詳細はこちらをご参照ください。
英語に切り替える

Newer Version Available

This content describes an older version of this product. View Latest

future メソッド

future メソッドは、バッググラウンドで非同期で実行されます。外部 Web サービスへのコールアウト、独自のスレッドを独自の時間に実行する処理など、長時間にわたる処理を実行する場合に future メソッドをコールできます。また、混合 DML エラーを回避するために異なる sObject 型に対する DML 操作を分離する場合にも future メソッドを使用できます。各 future メソッドは、キューに入れられ、システムリソースが使用可能になったときに実行されます。この方法によって、長時間にわたる処理の完了を待たずにコードを実行できます。future メソッドを使用する利点は、SOQL クエリの制限やヒープサイズ制限など、一部のガバナ制限値が高くなる点にあります。

future メソッドを定義するには、単に次のように future アノテーションを使用してアノテーションを付加します。

future アノテーションのあるメソッドは静的メソッドである必要があり、void 型のみを返します。指定するパラメータはプリミティブデータ型、プリミティブデータ型の配列、プリミティブデータ型のコレクションである必要があります。future アノテーションのあるメソッドは、sObject またはオブジェクトを引数として取ることはできません。

future メソッドに sObject を引数として渡せない理由は、メソッドをコールしてからそのメソッドを実行するまでの間に sObject が変更されてしまう可能性があるためです。この場合、future メソッドが以前の sObject 値を取得して新しい値を上書きしてしまう可能性があります。  データベースにすでに存在する sObject を使用���るには、代わりに sObject ID (または ID のコレクション) を渡し、ID を使用して最新のレコードに対してクエリを実行します。次の例では、ID のリストを使用してこれを実行する方法を示します。

次の例は、外部サービスへのコールアウトを実行する future メソッドの骨格です。このアノテーションは、コールアウトが許可されることを示す追加パラメータ (callout=true) を取っています。コールアウトについての詳細は、Apex を使用したコールアウトの呼び出しを参照してください。

null 以外のロールを持つユーザの挿入は、他の sObject に対する DML 操作とは別のスレッドで実行する必要があります。次の例では、future メソッドを使用してこれを行っています。future メソッド insertUserWithRole は、Util クラスで定義され、COO ロールを持つユーザの挿入を実行します。この future メソッドを使用するには、組織に COO ロールを定義しておく必要があります。MixedDMLFutureuseFutureMethod メソッドで、取引先が挿入され、future メソッド insertUserWithRole がコールされます。

次は、null 以外のロールを持つユーザを挿入する future メソッドが含まれる、Util クラスの定義です。

これは、上記で定義した future メソッドをコールするメインメソッドが含まれるクラスです。

future メソッドを呼び出す方法は、他のメソッドを呼び出す方法と同じです。ただし、future メソッドで別の future メソッドを呼び出すことはできません。

future アノテーションのあるメソッドには次のような制限事項があります。

  • Apex 呼び出しごとの、メソッドのコール数は 50 以下にする必要があります。

    startTest ブロックおよび stopTest ブロックでコールされた @future または executeBatch などの非同期コールは、キュー内ジョブ数の制限に対してカウントされません。

    メモ

  • 24 時間あたりの future メソッドの最大呼び出し数は、250,000 または組織のユーザライセンス数の 200 倍のいずれか大きいほうです。これは組織全体の制限で、他のすべての非同期 Apex (Apex の一括処理、スケジュール済み Apex、およびキュー可能 Apex) と共有されます。この制限のカウント対象となるライセンスは、Salesforce フルユーザライセンスおよび Force.com アプリケーションサブスクリプションのユーザライセンスです。Chatter Free ユーザ、Chatter 顧客ユーザ、カスタマーポータルユーザ、およびパートナーポータルユーザライセンスは、含まれません。

Salesforce サービスメンテナンスダウンタイム前にキューに入れられた future メソッドジョブは、キューに入れられたままになります。サービスのダウンタイムが終了してシステムリソースが使用可能になったときに、キューにある future メソッドが実行されます。ダウンタイム中に future メソッドが実行されていた場合、その future メソッドの実行はロールバックされ、サービスが再開された後に再実行されます。

メモ

future メソッドのテスト

future アノテーションのあるメソッドをテストするには、startTest()stopTest() コードブロック内でメソッドを含むクラスをコールします。startTest メソッドの後に作成されたすべての非同期コールはシステムによって収集されます。stopTest を実行する場合、すべての非同期プロセスが同期して実行されます。

この例では、テストクラスは次のようになります。