2015-12-31

Apex Batchで既存レコードを使わずに回してみる

普通に知らなかったので備忘録として…。

BatchableなInterfaceを実装するApex Batchですがexecuteに入ってくるレコードは実在するSObjectじゃなくても良いし、そもそもSObjectである必要もなく、プリミティブやカスタムなApexClassも入れられちゃいます。

つまり、startの戻り値はDatabase.QueryLocatorではなくSytem.InterableなものもOK、ということです。(リファレンスに思いっきりstartメソッドが2つ定義されています)

ということでこんな感じなApex Batchでも全く問題ない、ということです。

public with sharing class HogeBatch implements Database.Batchable<Hoge> {
    public Iterable<Hoge> start(Database.BatchableContext BC) {
        return new List<Hoge> {
            new Hoge('123'),
            new Hoge('abc'),
            new Hoge('123abc')
        };
    }

    public void execute(Database.BatchableContext info, List<Hoge> hoges) {
        for (Hoge hoge : hoges) {
            System.debug(hoge.fuga);
        }
    }

    public void finish(Database.BatchableContext info) {}
}

今まで既存レコードでしか利用できないと思っていました…とは言えQueryLocatorを使った既存レコードでの利用が8割以上な気がしますが。

利用ケースとしては

という感じですかね。「1トランザクション内におけるガバナ回避」という用途で「レコードを残さない(残せない)」ケースでの利用になると思われます。

このエントリーをはてなブックマークに追加