I am attempting to use batch to handle a deserialized JSON response of 12,000 records to upsert objects.
I currently have a class that makes the webservice callout, deserializes the response, and sets the value of my new custom object list to the response values. I am trying to use batch due to the 10000 DML limit.
How do I pass my list of custom objects from currentCalloutClass into the batch class to handle the upsert? Is there a better a way to do this?
Note: The pasted code will results in:
Illegal conversion from List<Custom_Object__c> to Database.QueryLocator error
Which makes sense, but since I already have the list of objects I need to update I do not need to run a query. Should I be converting my currentCalloutClass into a batchable class? Do I have to set a query?
currentCalloutClass:
public class currentCalloutClass {
public void currentCalloutClass(){
jsonStr = '';
List <Custom_Object__c> cObjList = new list <Custom_Object__c()>;
...webservice response stored in jsonStr...
JSON2ApexConverter calloutGet = (JSON2ApexConverter )JSON.deserialize(jsonStr, JSON2ApexInfo.class);
for(i = 0; i < calloutGet.object.size(); i++) {
Custom_Object__c cObj = new Custom_Object__c;
cObj.custom_field__c = calloutGet.object.field_1;
cObjList.add(cObj);
}
}
Database.executeBatch(new batchTestNew(cObjList), 250);
}
batchTestNew
global class batchTestNew implements Database.Batchable<sObject>{
public List <Contact> accountsToParseSet = new List<Custom_Object__c>();
global batchTestNew(List<Custom_Object__c> accountsToParseGet){
accountsToParseSet = accountsToParseGet;
}
global Database.QueryLocator start(Database.BatchableContext BC){
return accountsToParseSet;
}
global void execute(Database.BatchableContext BC,
List<sObject> scope){
for(sObject s : scope){
upsert accountsToParseGet;
}
update scope;
}
global void finish(Database.BatchableContext BC){
}
}