088_BatchApex_Callout




global class BatchSync implements Database.Batchable<sObject>, Database.AllowsCallouts { public String query = 'Select ID, Name from Account'; global Database.QueryLocator start(Database.BatchableContext BC) { return Database.getQueryLocator(query); } global void execute(Database.BatchableContext BC, List<Account> records) { String endpoint; for ( integer i = 0; i< records.size(); i++ ){ try { HttpRequest req = new HttpRequest(); HttpResponse res = new HttpResponse(); Http http = new Http(); // Set values to Params endpoint = 'Your endpoint'; req.setHeader('Authorization', header); req.setHeader('Content-Type', 'application/json'); req.setEndpoint(endpoint); req.setMethod('POST'); req.setBody('Information you wanna send'); req.setCompressed(true); // This is imp according to SF, but please check if // the webservice accepts the info. Mine did not :P // Had to set it to false if (!Test.isRunningTest()) { res = http.send(req); String sJson = res.getBody(); System.debug('Str:' + res.getBody()); } // now do what u want to with response. } catch (Exception e) { System.debug('Error:' + e.getMessage() + 'LN:' + e.getLineNumber() ); } } } global void finish(Database.BatchableContext BC){ } }

  BatchSync BS = new BatchSync();
Database.executeBatch(BS,10); // you can also do less than 10

You can also take  help from these   link

1-https://developer.salesforce.com/forums/?id=906F0000000kK6VIAU
2-http://www.forcedisturbances.com/2012/03/caching-data-from-googles-geocoding.html

 

http://www.platforce.org/batch-apex.html

 

 

 

https://www.biswajeetsamal.com/blog/batch-apex-with-webservice-callout/

global class batchAccountUpdate implements Database.Batchable<sObject>, Database.AllowsCallouts{

global Database.QueryLocator start(Database.BatchableContext BC)
{
    string obj = 'ACA';
    String query = 'Select Id, CreatedDate, CreatedBy.Name, Attest_ID__c from Case where Ticket_Type__c = :obj';
    return Database.getQueryLocator(query);
}

global void execute(Database.BatchableContext BC, List<Account> scope)
{
   List<Voice_File_Loader__c> searchVFL =  [Select Id, Call_Date_Time__c, End_Window__c, Agent_Name__c, Voice_File_Location__c from Voice_File_Loader__c];

    for (Account checkCase : scope){

  for (Voice_File_Loader__c matchVFL :searchVFL){
    boolean after = (checkCase.CreatedDate >= matchVFL.Call_Date_Time__c);
    boolean before = (checkCase.CreatedDate <= matchVFL.End_Window__c);
    boolean timeCheck = (after && before);
    boolean nameCheck = (checkCase.CreatedBy.Name.equalsIgnoreCase(matchVFL.Agent_Name__c));
    if (timeCheck && nameCheck){
      Attachment att = new Attachment();
        Http binding = new Http();
        HttpRequest req = new HttpRequest(); 
        req.setMethod('GET');                                                                                  
        req.setEndpoint(matchVFL.Voice_File_Location__c); 
        HttpResponse res = binding.send(req);
        Blob b = res.getbodyasblob();
        att.name = 'Voice Attestation.wav'; 
        att.body = b;
        att.parentid = checkCase.Id;
        system.debug('#############'+ att);
        insert att;
      delete matchVFL;
    }
  }
}



}   
global void finish(Database.BatchableContext BC)
{
}

  

batchAccountUpdate a = new batchAccountUpdate();
    database.executebatch(a,10);


global class AccountBatchApex implements Database.Batchable<sObject>, Database.AllowsCallouts{
     
    global Database.QueryLocator start(Database.BatchableContext bc){
        String soqlQuery = 'SELECT Name, AccountNumber, Type From Account';
        return Database.getQueryLocator(soqlQuery);
    }
     
    global void execute(Database.BatchableContext bc, List<Account> scope){
         
        for (Account acc : scope){
            if(acc.Type.equals('Customer - Direct')){
                try{
                    HttpRequest request = new HttpRequest();
                    HttpResponse response = new HttpResponse();
                    Http http = new Http();
                     
                    String username = 'YourUsername';
                    String password = 'YourPassword';
                    Blob headerValue = Blob.valueOf(username + ':' + password);
                    String authorizationHeader = 'BASIC ' + EncodingUtil.base64Encode(headerValue);
                     
                    request.setHeader('Authorization', authorizationHeader);
                    request.setHeader('Content-Type', 'application/json');
                    request.setEndpoint('Your Endpoint URL');
                    request.setMethod('POST');
                    request.setBody('Information to Send');
                    response = http.send(request);
                    if (response.getStatusCode() == 200) {
                        String jsonResponse = response.getBody();
                        System.debug('Response-' + jsonResponse);
                    }
                }
                catch(Exception){
                    System.debug('Error-' + e.getMessage());   
                }
            }
        }
    }
     
    global void finish(Database.BatchableContext bc){
         
    }
}

 

 

 

https://blogs.absyz.com/2017/12/11/making-callouts-with-batch-apex-for-data-of-over-12-mb/

global class mybatchclass Implements Database.Batchable <sObject>,database.stateful,database.allowcallouts {
 
    //variable to be used in SOQL
     public Date today = system.today();
     public set<ID> finalaccounts = new set<Id>();
     public String SOQL = 'SELECT Id, Name, Type from Account where CreatedDate =: today'  ;
 
    // Start Method of Batch class
    global Database.queryLocator start(Database.BatchableContext bc){
        // Query the records
         return Database.getQueryLocator(SOQL);
 
    }
 
    // Execute Method of Batch class
    global void execute(Database.BatchableContext bc, List<Account> accountlist) {
 
    // Iterate over the list of contacts and get their Account ids
      for(Account cc:accountlist){
         finalaccounts.add(cc.Id);
      }
 
   }
 
    // Finish Method of Batch class. This is where you make the callout
    global void finish(Database.BatchableContext bc) {
 
       attachfiles.attachfilestoaccount(finalaccounts);
     //make the callout here for getting the attachments data of size greater than 12 MB
 
    }
 
}

  

// You can invoke the batch class from the anonymous debug window with the below syntax
   mybatchclass mb = new mybatchclass();
   Database.executebatch(mb);

  

public class attachfiles(){
 
 public static void attachfilestoaccount(set<id> listaccount)
     {
       // First set the callout parameters such as the authToken, Endpoint and the accessToken
        String authToken = 'test authorization token';
        String authEndpoint = 'test authEndpoint';
        String calloutEndpoint = 'test calloutEndpoint';
        String accessToken = 'test_act';
 
       // Now make the HTTP callout
        Http h1 = new Http();
        HttpRequest hreq2 = new HttpRequest();
        String dealId = '';
        hreq2.setEndPoint(calloutEndpoint);
        hreq2.setMethod('POST');
        hreq2.setHeader('Content-type','application/xml');
        hreq2.setHeader('Authorization','Bearer'+' '+accessToken);
        hreq2.setTimeout(30000);
 
        hreq2.setBodyAsBlob(Blob.valueOf('testClass'));
 
       // Get the response which contains the attachment
        HttpResponse res = h1.send(hreq2);
 
       List<Attachment> atLst = new List<Attachment>();
 
       for(Account acc:listaccount){
        Attachment att1 = new Attachment();
        att1.Body = Blob.valueOf(res.getbody());
        att1.Name = String.valueOf('Response.txt');
        att1.ParentId = acc.Id;
        atLst.add(att1);
      }
 
     // Finally, insert the list
      if(atLst.size()> 0)
        insert atLst;
 
    }
}

 

 

 

http://mysfdc1.blogspot.com/2017/07/how-to-make-http-callouts-in-batch-class.html

global class BatchSync implements Database.Batchable<sObject>,   Database.AllowsCallouts {

 public String query = 'Select ID, Name from Account';
 global Database.QueryLocator start(Database.BatchableContext BC) {
    return Database.getQueryLocator(query);
 }

     global void execute(Database.BatchableContext BC, List<Account> records) {         
        String endpoint;        

        for ( integer i = 0; i< records.size(); i++ ){
         try {                  
          HttpRequest req = new HttpRequest();
          HttpResponse res = new HttpResponse();
          Http http = new Http();
          // Set values to Params

          endpoint = 'Your endpoint';

          req.setHeader('Authorization', header);
          req.setHeader('Content-Type', 'application/json');
          req.setEndpoint(endpoint);
          req.setMethod('POST');
          req.setBody('Information you wanna send');
          req.setCompressed(true); // This is imp according to SF, but please check if
                                 // the webservice accepts the info. Mine did not :P
                                 // Had to set it to false

          if (!Test.isRunningTest()) {      
            res = http.send(req);
            String sJson = res.getBody();
            System.debug('Str:' + res.getBody());
          }             
          // now do what u want to with response.               
          }
          catch (Exception e) {         
            System.debug('Error:' + e.getMessage() + 'LN:' + e.getLineNumber() );           
          }
       }
    }   

    global void finish(Database.BatchableContext BC){    
    }
}

  关于 异步处理的一些限制   :    http://www.salesforcenextgen.com/asynchronous-apex/

posted @ 2019-12-18 17:02  BandariFang  阅读(256)  评论(0编辑  收藏  举报