为什么Apex Schedulable类中的全局Map不包含任何值?

时间:2013-08-06 01:18:29

标签: salesforce

我正在尝试在batchable类的finish()方法中使用全局Map变量,但它表现得很奇怪,我确定我做错了什么,但不知道在哪里。 在下面的简化代码中,第一个调试消息按预期输出映射的实际大小。但是,finish()方法中的调试消息输出0,作为相同映射的大小。看起来地图会在某个地方重新实例化,但我不知道在哪里。

 global class MySchedulableClass implements Database.Batchable<sObject> {


    global map<string,string> StringStringMap;
    global string query;


    global MySchedulableClass(){    

      if (query == null)
         query = 'Select id, name From Contact LIMIT 20';  
      if (StringStringMap == null){
            StringStringMap = new map<string,string>();
        }
     }

    global Database.QueryLocator start(Database.BatchableContext BC){

        return Database.getQueryLocator(query);
    }

    global void execute(Database.BatchableContext BC,List<sObject> scope){
        for(Sobject s: scope) {
            con = (Contact) s;          
            StringStringMap.put(s.id, s.name);                                                                  
        }
        system.debug('Map size:' + StringStringMap.size());

    }

    global void finish(Database.BatchableContext BC){       
          system.debug('Map size:' + StringStringMap.size());
    }
}

1 个答案:

答案 0 :(得分:2)

如果要在批处理运行期间保留信息,请查看Database.Stateful。见Using State in Batch Apex。它涵盖了您的全局变量不持久的原因。

  

批处理Apex作业的每次执行都被视为离散事务。例如,包含1,000条记录并且在没有可选范围参数的情况下执行的批处理Apex作业被视为五个事务,每个事务有200条记录。

     

如果在类定义中指定Database.Stateful,则可以跨这些事务维护状态。