zoukankan      html  css  js  c++  java
  • 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/

    此刻,静下心来学习
  • 相关阅读:
    Spring MVC中的(多)文件上传和下载
    SSM整合案例
    事务的四种隔离级别和七种传播行为
    注解方式实现IOC和AOP
    顾问包装通知
    使用ProxyFactoryBean进行AOP
    动态代理(jdk&cglib)的用法
    英语中12个典型的中国式错误
    翻译:你的声音太小了,可以大一些吗
    今天天气怎么样
  • 原文地址:https://www.cnblogs.com/bandariFang/p/12060847.html
Copyright © 2011-2022 走看看