Batch Apex Class for Salesforce-Jira Integration and Sync
Why Batch Apex Class?
In our series of posts on Salesforce-Jira Integration we saw how we can pull issues from Jira and save into Salesforce in a Custom Object using Jira's REST API. However, the integration makes sense only if the push-pull of issues are done in the background automatically in a defined period of time. This is where Batch Apex Classes comes into picture.
Salesforce Developer Guide defines Batch Apex as below which is pretty much self explanatory.
Batch Apex operates over small batches of records, covering your entire record set and breaking the processing down to manageable chunks.
For more information on Batch Apex and its usage refer the below links,
If you are using the Batch Apex to operate over the records within your Salesforce org, then there isn't any additional code required apart from the one explained in the developer guide. But since the batch is supposed to operate on records that are external to the Salesforce (i.e. Jira), we need some extra classes which are explained hereafter.
Batchable Class
Again from the developer guide; to make a class batchable it has to implement Database.Batchable
interface which in turn requires the three interface methods to be implemented. Starting with the start
method, the return type could either be Database.QueryLocator
or Iterable<sObject>
. Obviously and unfortunately we cannot have a QueryLocator
for the response that we get from the JIRA REST URL. So the start
method has to be with the below signature:
global Iterable<sObject> start(Database.BatchableContext bc) {}
Note that the sObject type in Iterable<sObject>
will be nothing but the custom object we created for storing the issues in Salesforece, i.e. JiraIssue__c
Iterable to Iterator
Now to make the start
method return an Iterable<sObject>
type we have to create a class say IssueIterableImplementation
that implements the iterable
interface. This interface has a method named iterator
whose return type is Iterator<sObject>
.
So similarly to have a return type of Iterator<sObject>
we need to create a class that implements the iterator
interface which in turn has two methods to be implemented.
hasNext()
andnext()
Let's call this class as IssueIterator()
then the two classes would be as below,
IssueIterableImplementation Class
global class IssueIterableImplementation implements iterable<Issues__c>{
global Iterator<Issues__c> Iterator(){
return new IssueIterator();
}
}
IssueIterator Class
global class IssueIterator implements Iterator<Issues__c>{
// Issus class and other variables from previous post goes here
Integer i {get; set;} //Counter for current index of supportIssues List
public IssueIterator(){
//JiraIntegrationController from previous post goes here
}
global boolean hasNext(){
if(i >= supportIssues.size()) {
return false;
} else {
return true;
}
}
global Issues__c next(){
if(i == supportIssues.size()){return null;}
i++;
return supportIssues[i-1];
}
}
Finally the start
method will be like:
global Iterable<Support_Issues__c> start(Database.BatchableContext bc){
return new IssueIterableImplementation();
}
And the execute
method be like:
global void execute(Database.BatchableContext bc,
List<Support_Issues__c> supportIssuesList){
// Code to iterate over the issues list and do the desired operations.
}
And the final Batch apex class will look like:
global class SalesforceJiraSynchronizer implements
Database.batchable<Issues__c>,
Database.AllowsCallouts{
...
}
That is it !!! Now this batch class can be scheduled to run every one hour or more than that using Cron expression based upon how frequently the issues are updated in your Jira. Below given is the sample apex code that can be executed in the developer console to schedule our batch apex run every hour. Once you run the code you can confirm the schedule by checking the Monitor - Jobs - Scheduled Jobs section.
SalesforceJiraSynchronizer sjs= new SalesforceJiraSynchronizer ();
String cronString = '0 0 * * * ?';
System.schedule('Salesforce Jira Synchronizer', cronString, sjs);
If you face any issues with the Batch Apex Class for Salesforce-Jira Sync then please feel free to write me or comment below. Thank You.