バッチ処理にカスタム表示ラベルを利用する場合、ハマったことを紹介致します。
Salesforceの中に、変わりそうな変数や定数がある場合、その変数や定数をカスタム表示ラベルで定義して、今後業務ニーズにより、カスタム表示ラベルの値だけを変更すれば、コード修正なしで業務調整することができるのは通常な考え方かと思います。
ただし、バッチ処理にカスタム表示ラベルを利用する場合、カスタム表示ラベルの呼び出す方により、修正後のカスタム表示ラベルの値が読み込まれないことがあります。
◆事象
実装手順
①Apexクラスにカスタム表示ラベルを取得処理が実装
※下記のtestBatchのCase01の実装
②そのApexクラスをバッチスケジューラ登録する(毎日定刻に実行)
③バッチスケジューラを登録した後に、カスタム表示ラベルの値を修正
事象
次回のバッチで、修正後の値で動作することを期待していたが、修正後のカスタム表示ラベルの値が使用されず、修正前の値でバッチが動作していた。
global class implements Schedulable {
Public String x01 = System.Label.X01;
global void execute() {
System.debug('変数に指定した場合:' + x01);
// Case01:カスタム表示ラベルを変更しても、出力が変わらない。
System.debug('直接利用した場合:' + System.Label.X01);
// Case02:カスタム表示ラベルを変更したら、出力が変わる。
}
}
◆原因説明
スケジュール済みジョブオブジェクトとそのメンバー変数及びプロパティは、初期化から後続のスケジュールされた実行まで存続します。
System.schedule()を呼び出した時点(スケジュールジョブを作成した時点)のオブジェクトの状態は、後続のジョブ実行時も存続する動作になります。
つまり、バッチ処理にカスタム表示ラベルを利用する場合、登録済のバッチ処理に対し、変数に指定したカスタム表示ラベルを修正してもその値が読み込まれないことです。
◆対策案
・既存ソースはCase01で実装していた場合、コード修正なしで、カスタム表示ラベルを修正した後に、ジョブを再スケジューラすれば、最新カスタム表示ラベルが読み込まるようにする。
・今後Apexクラスを作成する時に、カスタム表示ラベルを利用する場合、なるべくCase02のように直接利用するのはお勧めですでしょうかね。