4

when i execute this schedule apex class from developer console the class is scheduled at 4 different timings as queue. when "schedule Job2" running i got this exception in debug log shows

"|EXCEPTION_THROWN|[21]|System.AsyncException: The Apex job named "Scheduled Job0" is already scheduled for execution"

and in debug log the future call shows : "Number of future calls: 1 out of 50" but i'm not getting the any records pulling from external source

this is scheduled class

global class SchedulingService implements Schedulable {

    global void execute(SchedulableContext SC){

          ServiceNowUpsert.GetIncident('abcd','1234','https://abcd.service-now.com');         
          String day = string.valueOf(system.now().day());
          String month = string.valueOf(system.now().month());
          String hour = string.valueOf(system.now().hour());
          String minute = string.valueOf(system.now().minute() + 15);
          String second = string.valueOf(system.now().second());
          String year = string.valueOf(system.now().year());

          String cronStr = '0 0,15 * * * *';//changes required
          String strJobName = 'Job-' + second + '_' + minute + '_' + hour + '_' + day + '_' + month + '_' + year;
          // String strSchedule = '0 ' + minute + ' ' + hour + ' ' + day + ' ' + month + ' ?' + ' ' + year;
          //System.schedule(strJobName, cronStr, new SchedulingServiceNow()); //changes required
          System.schedule('Scheduled Job0', '0 0 * * * ?',  new SchedulingService ());   
          System.schedule('Scheduled Job1', '0 15 * * * ?', new SchedulingService ());
          System.schedule('Scheduled Job2', '0 30 * * * ?', new SchedulingService ());
          System.schedule('Scheduled Job3', '0 45 * * * ?', new SchedulingService ());

          for( CronTrigger c:[Select State,Id,EndTime,CronExpression From CronTrigger where  
                                            NextFireTime= null  AND State='DELETED' Limit 100]){

                        System.abortJob(c.id);
                }
            }
       }

   This is my apex class 

global with sharing class ServiceNowUpsert {

    @TestVisible static HttpResponse res;

    @future(callout=true) 
    global static void GetIncident(String username1, String password1, String endpointUrl1){  
        Http http = new Http();
        HttpRequest req =  new HttpRequest();
        Blob headerValue = Blob.valueOf(username1 + ':' + password1);
        String authorizationHeader = 'BASIC ' +
        EncodingUtil.base64Encode(headerValue);
        req.setHeader('Authorization', authorizationHeader);
        req.setHeader('Content-Type', 'application/json');  //displays data in JSON format


        req.setEndpoint(endpointUrl1+'/api/now/table/incident?sysparm_query=sys_updated_onONLast+hour%40javascript%3Ags.hoursAgoStart%282%29%40javascript%3Ags.hoursAgoEnd%280%29&sysparm_fields=impact%2Cincident_state%2Cshort_description%2Csys_id%2Ccontact_type&u_sftype=true');       
        req.setMethod('GET'); 

        res = http.send(req);
        System.debug('MyResult == :'+res.getBody());



        Deserialization.ResponseResult theresult1 = (Deserialization.ResponseResult)JSON.deserialize(res.getBody(),  Deserialization.ResponseResult.class);
        System.debug('MyResult == :' + theresult1 ); 

        List<Case> casesToUpsert = new List<Case>();        
        for(Deserialization d : theresult1.result ){

                Case c = new Case(); 
                c.Priority = d.impact;
                c.Status = d.incident_state;
                c.Subject = d.short_description;
                c.ServiceNowId__c = d.sys_id;
                c.Origin = d.contact_type;

                casesToUpsert.add(c);

        }
        system.debug('Cases to UPsert ::: ' +casesToUpsert);

        if(casesToUpsert.size()>0){
            Database.upsert(casesToUpsert,false) ;
        }       


    }

}

How to work my scheduled class perfectly running for every 15 mins and pulling the records from external source?

1
  • 2
    So every 15 minutes, you re-schedule all four scheduled jobs? That doesn't make any sense.
    – Adrian Larson
    Commented Apr 20, 2017 at 13:50

1 Answer 1

8

Its basically the issue with the scheduled job names. When Scheduled Job2 is running and trying to scheduled next set of Scheduled job its finding that a job named Scheduled Job0 is already running or scheduled. So you should develope a logic to name your scheduled jobs to be unique.

You can use the current timestamp in your scheduled job name like this:

System.schedule('Scheduled Job0'+System.now(), '0 0 * * * ?',  new SchedulingService ());   
System.schedule('Scheduled Job1'+System.now(), '0 15 * * * ?', new SchedulingService ());
System.schedule('Scheduled Job2'+System.now(), '0 30 * * * ?', new SchedulingService ());
System.schedule('Scheduled Job3'+System.now(), '0 45 * * * ?', new SchedulingService ());

It should make your scheduled job names unique and conflict-less.

1
  • 1
    This solution works like charm:). But why is it that it is not considering job names as unique as all the 4 jobs already have different names: Scheduled Job0 ,Scheduled Job1,Scheduled Job2,Scheduled Job3? How did stamping current time made job names unique?
    – Return0
    Commented Aug 24, 2021 at 9:29

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .