Queueableインタフェースを使った非同期処理実行

エンジニアの谷隈です。

Winter'15から導入された新機能Queueableインタフェースについて書きます。


Queueableインタフェースはfutureメソッドと機能的にはすごく似ています。
どちらも非同期に処理を実行する仕組みです。
ドキュメントで謳われている両者の違い、Queueableインタフェースを利用するメリットは次の2点です。

・ジョブIDを取得して、進行状況を監視できる
・ジョブの連鎖が可能(Winter'15時点では2連鎖まで。Spring'15で無制限になる予定。)

次のコードはQueueableインタフェースを実装したクラスの簡単なサンプルです。
非同期に実行したい処理をexecuteメソッドの中に書きます。

public class QueueableExample implements Queueable {
    public void execute(QueueableContext context) {
		String n = 'Queueable_' + DateTime.now().getTime();
        Account a = new Account(Name=n,Phone='(03) 1234-1234');
        insert a;        
    }
}

処理のキューへの登録にはsystem.enqueueJobメソッドを使用します。
キューに入れられた処理の開始タイミングは呼び出し側のトランザクション完了後の模様。

ID jobID = System.enqueueJob(new QueueableExample());
System.debug('jobID = '+ jobID);

1トランザクション中でキューに登録できるジョブ数は50。
ガバナ制限を超えてキューにジョブを登録しようとした場合は、例外が発生します。

System.LimitException: Too many queueable jobs added to the queue: 51

ジョブの進行状況の取得はAsyncApexJobレコードを検索して取得できます。

AsyncApexJob jobInfo 
	= [SELECT Status,NumberOfErrors FROM AsyncApexJob WHERE Id=:jobID];

futureメソッドとの違いで、ちょっと面白いと思ったのはバッチジョブ内からもキューへの登録/実行が可能な点です。(バッチからfutureメソッドを呼び出した場合は例外が発生)
ただ、現時点では制限により1つしかキューにジョブを追加できないので使えるケースはかなり限られそうです。

最近の派手系追加機能と比べるといかんせん地味なQueueableですが、その内容はfutureメソッドからの順当な進化系なので抑えておいて損はない機能だと思います。


リリースノート
http://docs.releasenotes.salesforce.com/ja-JP/winter15/release-notes/rn_apex_queueing_jobs.htm

The New Apex Queueable Interface
https://developer.salesforce.com/blogs/engineering/2014/10/new-apex-queueable-interface.html
コメント(0)