3

I want to send salesforce data to another system, but when I send the data through a batch class when I call the web service in the execute method doesn't execute all the batches, but if in the execute method don't make the callout all the batches execute, I put two counters in the execute method and I am showing in the finish method one for the number of records in the list and the other for the times the execute method is running, and when I execute the batch without make the callouts run all the batches but when execute the batch calling the web service in the execute method don't run all the batches, this is my code:

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

    public Integer i = 0;
    public Integer j = 0;    
    public Integer action;

    global SendFirstDonorData(Integer act){
        action = act;
    }

    global Database.QueryLocator start(Database.BatchableContext BC){                   
         return Database.getQueryLocator('Select npsp__is_Address_Override__c, npsp__Soft_Credit_Last_N_Days__c, npsp__Primary_Contact__c, npsp__Primary_Affiliation__c, npsp__Number_of_Soft_Credits__c, npsp__Number_of_Soft_Credits_Two_Years_Ago__c, npsp__Number_of_Soft_Credits_This_Year__c, npsp__Number_of_Soft_Credits_Last_Year__c, npsp__Number_of_Soft_Credits_Last_N_Days__c, npsp__Last_Soft_Credit_Date__c, npsp__Last_Soft_Credit_Amount__c, npsp__Largest_Soft_Credit_Date__c, npsp__Largest_Soft_Credit_Amount__c, npsp__HHId__c, npsp__First_Soft_Credit_Date__c, npsp__First_Soft_Credit_Amount__c, npsp__Exclude_from_Household_Name__c, npsp__Exclude_from_Household_Informal_Greeting__c, npsp__Exclude_from_Household_Formal_Greeting__c, npsp__Do_Not_Contact__c, npsp__Deceased__c, npsp__Current_Address__c, npsp__Batch__c, npsp__Address_Verification_Status__c,'+ 
                   'npo02__Total_Household_Gifts__c, npo02__TotalOppAmount__c, npo02__TotalMembershipOppAmount__c, npo02__SystemHouseholdProcessor__c, npo02__Soft_Credit_Two_Years_Ago__c, npo02__Soft_Credit_Total__c, npo02__Soft_Credit_This_Year__c, npo02__Soft_Credit_Last_Year__c, npo02__SmallestAmount__c, npo02__OppsClosedThisYear__c, npo02__OppsClosedLastYear__c, npo02__OppsClosedLastNDays__c, npo02__OppsClosed2YearsAgo__c, npo02__OppAmountThisYear__c, npo02__OppAmountThisYearHH__c, npo02__OppAmountLastYear__c, npo02__OppAmountLastYearHH__c, npo02__OppAmountLastNDays__c, npo02__OppAmount2YearsAgo__c, npo02__NumberOfMembershipOpps__c, npo02__NumberOfClosedOpps__c, npo02__Naming_Exclusions__c, npo02__MembershipJoinDate__c, npo02__MembershipEndDate__c, npo02__LastOppAmount__c, npo02__LastMembershipOrigin__c, npo02__LastMembershipLevel__c, '+
                   'npo02__LastMembershipDate__c, npo02__LastMembershipAmount__c, npo02__LastCloseDate__c, npo02__LastCloseDateHH__c, npo02__LargestAmount__c, npo02__Household__c, npo02__Household_Naming_Order__c, npo02__Formula_HouseholdPhone__c, npo02__Formula_HouseholdMailingAddress__c, npo02__FirstCloseDate__c, npo02__Best_Gift_Year__c, npo02__Best_Gift_Year_Total__c, npo02__AverageAmount__c, npe01__Work_Address__c, npe01__WorkPhone__c, npe01__WorkEmail__c, npe01__Type_of_Account__c, npe01__SystemAccountProcessor__c, npe01__Secondary_Address_Type__c, npe01__Private__c, npe01__Primary_Address_Type__c, npe01__Preferred_Email__c, npe01__PreferredPhone__c, npe01__Other_Address__c, npe01__Organization_Type__c, npe01__Home_Address__c, npe01__HomeEmail__c, '+
                   'npe01__AlternateEmail__c, Total_Donado_Hist_rico__c, Total_Donado_2014__c, Total_Donado_2013__c, Total_Donado_2012__c, Total_Donado_2011__c, Total_Donado_2010__c, Total_Donado_2009__c, Total_Donado_2008__c, Total_Donado_2007__c, Total_Donado_2006__c, Total_Donado_2005__c, Total_Donado_2004__c, Total_Donado_2003__c, Total_Donado_2002__c, Total_Donado_2001__c, Title, Tipo_de_registro_CANDIDATO__c, Tiene_nietos__c, Tiene_hijos__c, SystemModstamp, Salutation, ReportsToId, Referente__c, RecordTypeId, PhotoUrl, Phone, Pa_s_Aldeas__c, PSN__c, PSN_Historico__c, PSN_Buscar_Contacto__c, OwnerId, OtherStreet, OtherStateCode, OtherState, OtherPostalCode, OtherPhone, OtherLongitude, OtherLatitude, OtherCountryCode, OtherCountry, OtherCity, OtherAddress, Ocupaci_n__c, No_Recibir_Correo_F_sico__c, Ni_Apadrinado__c, Name, N_mero_de_Documento__c,'+
                   'MobilePhone, Media_2014__c, Media_2013__c, Media_2012__c, Media_2011__c, Media_2010__c, Media_2009__c, Media_2008__c, Media_2007__c, Media_2006__c, Media_2005__c, Media_2004__c, Media_2003__c, Media_2002__c, Media_2001__c, MasterRecordId, MailingStreet, MailingStateCode, MailingState, MailingPostalCode, MailingLongitude, MailingLatitude, MailingCountryCode, MailingCountry, MailingCity, MailingAddress, M_xima_2014__c, M_xima_2013__c, M_xima_2012__c, M_xima_2011__c, M_xima_2010__c, M_xima_2009__c, M_xima_2008__c, M_xima_2007__c, M_xima_2006__c, M_xima_2005__c, M_xima_2004__c, M_xima_2003__c, M_xima_2002__c, M_xima_2001__c, LeadSource, LastViewedDate, LastReferencedDate, LastName, LastModifiedDate, LastModifiedById, LastCUUpdateDate, LastCURequestDate, LastActivityDate, JigsawContactId, Jigsaw, IsEmailBounced, IsDeleted, Id, '+
                   'ID_Externo_Hist_rico__c, HomePhone, Hobbie__c, HasOptedOutOfFax, HasOptedOutOfEmail, Gender__c, FirstName, Fecha_nacimiento_CANDIDATO__c, Fecha_de_ltima_donaci_n_hist_rica__c, Fecha_de_Pr_ximo_Cumplea_os__c, Fecha_de_Captaci_n__c, Fecha_de_Captaci_n_Migraci_n__c, Fecha_de_Activaci_n_Unificada__c, Fecha_de_Activaci_n_Hist_rica__c, Fax, Estado_Civil__c, EmailBouncedReason, EmailBouncedDate, Email, Edad__c, Duplicado__c, DoNotCall, Destino_de_la_Donaci_n__c, Description, Department, Cuotas_pagadas_2009__c, Cuotas_Pagadas_2014__c, Cuotas_Pagadas_2013__c, Cuotas_Pagadas_2012__c, Cuotas_Pagadas_2011__c, Cuotas_Pagadas_2010__c, Cuotas_Pagadas_2008__c, Cuotas_Pagadas_2007__c, Cuotas_Pagadas_2006__c, Cuotas_Pagadas_2005__c, Cuotas_Pagadas_2004__c, Cuotas_Pagadas_2003__c, Cuotas_Pagadas_2002__c, Cuotas_Pagadas_2001__c, Cuotas_No_Pagadas_2014__c,'+ 
                   'Cuotas_No_Pagadas_2013__c, Cuotas_No_Pagadas_2012__c, Cuotas_No_Pagadas_2011__c, Cuotas_No_Pagadas_2010__c, Cuotas_No_Pagadas_2009__c, Cuotas_No_Pagadas_2008__c, Cuotas_No_Pagadas_2007__c, Cuotas_No_Pagadas_2006__c, Cuotas_No_Pagadas_2005__c, Cuotas_No_Pagadas_2004__c, Cuotas_No_Pagadas_2003__c, Cuotas_No_Pagadas_2002__c, Cuotas_No_Pagadas_2001__c, CreatedDate, CreatedById, Cantidad_de_donaciones_No_Pagadas__c, Cantidad_de_Hijos__c, Cantidad_cuotas_No_Pagadas_Hist_ricas__c, Cantidad_Cuotas_Pagadas_Hist_ricas__c, CallCenter_en_Contacto__c, CallCenter_Usuario_Contacto__c, CallCenter_Date_Contacto__c, Birthdate, AssistantPhone, AssistantName, AccountId FROM Contact'); 
    }

    global void execute(Database.BatchableContext BC, List<Contact> scope){
        i += scope.size();
        j ++;
        system.debug('#### ' + j);
        system.debug('#### ' + scope.size());
        Map<Id,User> userMap = new Map<Id,User>((List<User>)[SELECT Id, Name FROM User WHERE IsActive = true]);

        Map<Id,RecordType> rtMap = new Map<Id,RecordType>((List<RecordType>)[SELECT Id, Name FROM RecordType WHERE SobjectType = 'Contact']);
        JSONGenerator gen = JSON.createGenerator(true);
        gen.writeStartArray();
        for(Contact c : scope){
            gen.writeStartObject();
            gen.writeStringField('Id', c.Id);
            if(action==2){
                if(c.AccountId!=null){
                    gen.writeStringField('Account', c.AccountId);
                }
            }
            if(c.AssistantName!=null && c.AssistantName!=''){
                gen.writeStringField('AssistantName', c.AssistantName);
            }
            if(c.AssistantPhone!=null && c.AssistantPhone!=''){
                gen.writeStringField('AssistantPhone', c.AssistantPhone);
            }
            if(c.Birthdate!=null){
                gen.writeDateField('Birthdate', c.Birthdate);
            }
            if(c.OwnerId!=null){
                gen.writeStringField('Owner', userMap.get(c.OwnerId).Name);
            }
            if(c.RecordTypeId!=null){
                gen.writeStringField('RecordType', rtMap.get(c.RecordTypeId).Name);
            }
            if(c.Jigsaw!=null && c.Jigsaw!=''){
                gen.writeStringField('Jigsaw', c.Jigsaw);
            }
            if(c.Department!=null && c.Department!=''){
                gen.writeStringField('Department', c.Department);
            }
            if(c.Description!=null && c.Description!=''){
                gen.writeStringField('Description', c.Description);
            }
            if(c.DoNotCall!=null){
                gen.writeStringField('DoNotCall', String.valueOf(c.DoNotCall));
            }
            if(c.Email!=null && c.Email!=''){
                gen.writeStringField('Email', c.Email);
            }
            if(c.HasOptedOutOfEmail!=null){
                gen.writeStringField('HasOptedOutOfEmail', String.valueOf(c.HasOptedOutOfEmail));
            }
            if(c.Fax!=null && c.Fax!=''){
                gen.writeStringField('Fax', c.Fax);
            }
            if(c.HasOptedOutOfFax!=null){
                gen.writeStringField('HasOptedOutOfFax', String.valueOf(c.HasOptedOutOfFax));
            }
            if(c.HomePhone!=null && c.HomePhone!=''){
                gen.writeStringField('HomePhone', c.HomePhone);
            }
            if(c.LastCURequestDate!=null){
                gen.writeDateTimeField('LastCURequestDate', c.LastCURequestDate);
            }
            if(c.LastCUUpdateDate!=null){
                gen.writeDateTimeField('LastCUUpdateDate', c.LastCUUpdateDate);
            }
            if(c.LeadSource!=null && c.LeadSource!=''){
                gen.writeStringField('LeadSource', c.LeadSource);
            }
            if(c.MailingStreet!=null && c.MailingStreet!=''){
                gen.writeStringField('MailingStreet', c.MailingStreet);
            }
            if(c.MailingCity!=null && c.MailingCity!=''){
                gen.writeStringField('MailingCity', c.MailingCity);
            }
            if(c.MailingState!=null && c.MailingState!=''){
                gen.writeStringField('MailingState', c.MailingState);
            }
            if(c.MailingPostalCode!=null && c.MailingPostalCode!=''){
                gen.writeStringField('MailingPostalCode', c.MailingPostalCode);
            }
            if(c.MailingCountry!=null && c.MailingCountry!=''){
                gen.writeStringField('MailingCountry', c.MailingCountry);
            }
            if(c.MobilePhone!=null && c.MobilePhone!=''){
                gen.writeStringField('MobilePhone', c.MobilePhone);
            }
            if(c.Salutation!=null && c.Salutation!=''){
                gen.writeStringField('Salutation', c.Salutation);
            }
            if(c.FirstName!=null && c.FirstName!=''){
                gen.writeStringField('FirstName', c.FirstName);
            }
            if(c.LastName!=null && c.LastName!=''){
                gen.writeStringField('LastName', c.LastName);
            }
            if(c.OtherStreet!=null && c.OtherStreet!=''){
                gen.writeStringField('OtherStreet', c.OtherStreet);
            }
            if(c.OtherCity!=null && c.OtherCity!=''){
                gen.writeStringField('OtherCity', c.OtherCity);
            }
            if(c.OtherState!=null && c.OtherState!=''){
                gen.writeStringField('OtherState', c.OtherState);
            }
            if(c.OtherPostalCode!=null && c.OtherPostalCode!=''){
                gen.writeStringField('OtherPostalCode', c.OtherPostalCode);
            }
            if(c.OtherCountry!=null && c.OtherCountry!=''){
                gen.writeStringField('OtherCountry', c.OtherCountry);
            }
            if(c.OtherPhone!=null && c.OtherPhone!=''){
                gen.writeStringField('OtherPhone', c.OtherPhone);
            }
            if(c.Phone!=null && c.Phone!=''){
                gen.writeStringField('Phone', c.Phone);
            }
            if(c.Title!=null && c.Title!=''){
                gen.writeStringField('Title', c.Title);
            }
            if(c.npe01__AlternateEmail__c!=null && c.npe01__AlternateEmail__c!=''){
                gen.writeStringField('AlternateEmail', c.npe01__AlternateEmail__c);
            }
            if(c.CallCenter_Date_Contacto__c!=null){
                gen.writeDateTimeField('CallCenterDateContacto', c.CallCenter_Date_Contacto__c);
            }
            if(c.CallCenter_en_Contacto__c!=null){
                gen.writeStringField('CallCenterenContacto', String.valueOf(c.CallCenter_en_Contacto__c));
            }
            if(c.CallCenter_Usuario_Contacto__c!=null){
                gen.writeStringField('CallCenterUsuarioContacto', userMap.get(c.CallCenter_Usuario_Contacto__c).Name);
            }
            if(c.Fecha_nacimiento_CANDIDATO__c!=null){
                gen.writeDateField('FechaNacimiento', c.Fecha_nacimiento_CANDIDATO__c);
            }
            if(c.Cantidad_Cuotas_No_Pagadas_Hist_ricas__c!=null){
                gen.writeNumberField('CantidadCuotasNoPagadasHistoricas', c.Cantidad_Cuotas_No_Pagadas_Hist_ricas__c);
            }
            if(c.Cantidad_Cuotas_Pagadas_Hist_ricas__c!=null){
                gen.writeNumberField('CantidadCuotasPagadasHistoricas', c.Cantidad_Cuotas_Pagadas_Hist_ricas__c);
            }
            if(c.Cantidad_de_donaciones_No_Pagadas__c!=null){
                gen.writeNumberField('CantidadDonacionesNoPagadas', c.Cantidad_de_donaciones_No_Pagadas__c);
            }
            if(c.Cantidad_de_Hijos__c!=null && c.Cantidad_de_Hijos__c!=''){
                gen.writeStringField('CantidadHijos', c.Cantidad_de_Hijos__c);
            }
            if(c.Destino_de_la_Donaci_n__c!=null && c.Destino_de_la_Donaci_n__c!=''){
                gen.writeStringField('DestinoDonacion', c.Destino_de_la_Donaci_n__c);
            }
            if(c.npsp__Do_Not_Contact__c!=null){
                gen.writeStringField('DoNotContact',  String.valueOf(c.npsp__Do_Not_Contact__c));
            }
            if(c.Duplicado__c!=null){
                gen.writeStringField('Duplicado', String.valueOf(c.Duplicado__c));
            }
            if(c.Edad__c!=null){
                gen.writeNumberField('Edad', c.Edad__c);
            }
            if(c.Estado_Civil__c!=null && c.Estado_Civil__c!=''){
                gen.writeStringField('EstadoCivil', c.Estado_Civil__c);
            }
            if(c.Fecha_de_Activaci_n_Hist_rica__c!=null){
                gen.writeDateField('FechaActivacionHistorica', c.Fecha_de_Activaci_n_Hist_rica__c);
            }
            if(c.Fecha_de_Activaci_n_Unificada__c!=null){
                gen.writeDateField('FechaActivacionUnificada', c.Fecha_de_Activaci_n_Unificada__c);
            }
            if(c.Fecha_de_Captaci_n__c!=null){
                gen.writeDateField('FechaCaptacion', c.Fecha_de_Captaci_n__c);
            }
            if(c.Fecha_de_Pr_ximo_Cumplea_os__c!=null){
                gen.writeDateField('FechaProximoCumpleaños', c.Fecha_de_Pr_ximo_Cumplea_os__c);
            }
            if(c.Fecha_de_ltima_donaci_n_hist_rica__c!=null){
                gen.writeDateField('FechaUltimaDonacionHistorica', c.Fecha_de_ltima_donaci_n_hist_rica__c);
            }
            if(c.Fecha_de_Captaci_n_Migraci_n__c!=null){
                gen.writeDateField('FechaMigracion', c.Fecha_de_Captaci_n_Migraci_n__c);
            }
            if(c.Gender__c!=null && c.Gender__c!=''){
                gen.writeStringField('Gender', c.Gender__c);
            }
            if(c.Hobbie__c!=null && c.Hobbie__c!=''){
                gen.writeStringField('Hobbie', c.Hobbie__c);
            }
            if(c.ID_Externo_Hist_rico__c!=null && c.ID_Externo_Hist_rico__c!=''){
                gen.writeStringField('IdExternoHistorico', c.ID_Externo_Hist_rico__c);
            }              
            gen.writeEndObject();
        }
        gen.writeEndArray();

        String method = 'POST';

        if(action==2){
            //action = '?Id=' + c.Id;
            method = 'PUT';
        }
        final PageReference theUrl = new PageReference('http://xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx');

        HttpRequest request = new HttpRequest();
        request.setEndpoint(theUrl.getUrl());
        request.setHeader('Content-Type', 'application/json');
        request.setMethod(method);
        request.setTimeout(120000);
        request.setBody(gen.getAsString());        

        HttpResponse response = (new Http()).send(request);
        system.debug('#### getBody' + response.getBody());
    }

    global void finish(Database.BatchableContext BC) {
        system.debug('#### list size: ' + i);
        system.debug('#### number of executions: ' + j);
    }
}
2

You could be experiencing the same Known Issue as @RobertSösemann in Total number of Batch jobs decreases during execution. Why that?

Batch Apex job finishes unexpectedly in Spring'17 without processing all specified records

In Spring'17 apex batch class (Database.Batchable) doesn't process all the batches if batch execute method takes long time to run but within limits.

It stops processing batches after some number of processed records and finishes unexpectedly. No error is reported, no exception is thrown

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.