2009年10月16日金曜日

[SFDC]:Database.Batchableの動作テスト

ということで、動くか試してみた。
面倒なのでソースをそのまま張る。
------------------------------------------------>>

/**
 * バッチの実行テスト
 * 全取引先の数値項目をインクリメント、日付に実行日時をセットするだけ
 * カスタム項目, batch_Sum__c 数値項目,あらかじめ0を入れること、batchLastUpdateDate__c 日時型
 */
global class batchTest implements Database.Batchable{

 global database.querylocator start(Database.BatchableContext bc){
  System.debug('■■■■■■batchTest start■■■■■■');
  return Database.getQueryLocator('select Id, Name, batch_Sum__c, batchLastUpdateDate__c from Account');
 }

 global void execute(Database.BatchableContext bc, SObject[] objects){
  System.debug('■■■■■■batchTest execute■■■■■■');
  System.debug(objects);
  Account[] accns = new Account[]{};
  for(SObject s : objects){
   Account a = (Account)s;
   a.batch_Sum__c = a.batch_Sum__c + 1;
   a.batchLastUpdateDate__c = system.now();
   accns.add(a);
   System.debug('■ update entity:' + a);
  }
  update accns;
 }

 global void finish(Database.BatchableContext bc){
  system.debug('□□□□□□batchTest finish□□□□□□');
 }
}
------------------------------------------------<<
呼び出すApex Class 今回はVFからボタン押してます。 実際はスケジューラから実行かな。
------------------------------------------------>>
/**
 * バッチできるかな?
 */
public PageReference batch() {
 System.debug('■■■■■■batch Btn■■■■■■');
 batchTest job = new batchTest();
 ID batchprocessid = Database.executeBatch(job);
 system.debug(batchprocessid);
 return NULL;
}
------------------------------------------------<<
とりあえず、動いた。
次は負荷テストか、、、startメソッドのquerylocatorごとにガバナがクリアされるから大量レコード処理できるぜフフン♪みたいなこと書いてあったけど、どうなることやら

4 件のコメント:

匿名 さんのコメント...

このバッチをApex Jobで定期的に
動かすにはどうすればよいですか?
ご教授頂ければ幸いです。

shimot さんのコメント...

>匿名様
最適なものとしては"Apex Scheduler"機能があげられますがWinter'10現在パイロットリリースのため、運用組織での使用は難しいと考えています。
(試用することをサポートに連絡する必要があります)となると、タイムトリガ等を使用してApexTrigger内による起動も考えられますが未検証です。
お力になれず申し訳ありません。

匿名 さんのコメント...

回答ありがとうございます。
とてもためになりました。

日本語でSFの技術情報を発信してくださっているBlogは少ないので
大変重宝させて頂いています。

これからもがんばってください。

shimot さんのコメント...

ありがとうございます。2006年から携わっていたこともありナレッジは溜まっているので、折を見て大量に書き出せれば、と思います。
 ※ゲームやってる時間を割り当てればすぐなんですけど。