So my batch will collect 843 records, for each batch, which is 200 records, i constructed a json and made the callout, so in total, it is 5 batches and 5 callouts. I have a server hosting my rest service, on the server side, I saw the response looks fine. But on the salesforce side, I only received response from last callout, which is the 43 records one. 

Any idea why ?

here is the batch:

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

	global BatchCheckActiveProducing(){

	}

	global Database.QueryLocator start(Database.BatchableContext bc){
		String queryProjects = 'Select Id, Locus_ComponentId__c, Date_System_Actively_Producing__c from dsProject__c where ' + 
								'Locus_ComponentId__c != null and Date_System_Actively_Producing__c = null';

		return Database.getQueryLocator(queryProjects);
	}

	global void execute(SchedulableContext sc){
		BatchRefreshLocusComponentId batch = new BatchRefreshLocusComponentId();
		Id batchProcessId = Database.executeBatch(batch);
	}

	global void execute(Database.BatchableContext bc, List<dsProject__c> records){

		try{
			List<Id> projectList = new List<Id>();
			for (dsProject__c p : records){
				projectList.add(p.Id);
			}
			LocusHelper.checkActiveProducing(projectList);
		}
		catch(Exception e){

		}
	}

	global void finish(Database.BatchableContext bc){
		//Datetime sysTime = System.now();
		//sysTime = sysTime.addDays(1);
		//String chronExp = '' + sysTime.second() + ' ' + sysTime.minute() + ' ' + sysTime.hour() + ' ' + sysTime.day() + ' ' + sysTime.month() + ' ? ' + sysTime.year();
		//System.schedule('BatchCheckActiveProducing' + sysTime.getTime(), chronExp, new BatchCheckActiveProducing());
	}
}

here is helper method:

    global static void checkActiveProducing(List<Id> projectIds){

		System.DEBUG('incoming ids: ' + projectIds);

		List<dsProject__c> projectList = [Select Id, Locus_ComponentId__c from dsProject__c where Id In :projectIds];
		Http h = new Http();
		HttpRequest req = new HttpRequest();

		req.setMethod('POST');
		req.setEndpoint('*************************');
		//req.setHeader('Accept', 'application/json');
		req.setHeader('Content-Type', 'application/json');

		JSONGenerator gen = JSON.createGenerator(true);
		gen.writeStartObject();
		gen.writeFieldName('nodeList');
		gen.writeStartArray();

		// loop through all project list
		// add each into the json
		for (dsProject__c p : projectList){
			gen.writeStartObject();

			gen.writeStringField('componentId', p.Locus_ComponentId__c);
			gen.writeStringField('recordId', p.Id);

			gen.writeEndObject();
		}

		gen.writeEndArray();
		gen.writeEndObject();

		String bodyString = gen.getAsString();
		req.setBody(bodyString);

		System.DEBUG('req: ' + req.getBody());

		HttpResponse res = h.send(req);

		System.DEBUG('res: ' + res);
		System.DEBUG('res body: ' + res.getBody());

		// set of project ids
		Set<Id> projectIdSet = new Set<Id>();
		// map of <projectId, activeDate>
		Map<Id, String> projComponentMap = new Map<Id, String>();

		// loop through returned json list
		// update the active date on project
		if (res.getStatusCode() == 200){
			JSONParser parser = JSON.createParser(res.getBody());

			// advance after start_array
			parser.nextToken();
			while (parser.nextToken() != JSONToken.END_ARRAY){
				System.DEBUG('current token: ' + parser.getCurrentToken() + ' value: ' + parser.getText());
				if (parser.getCurrentToken() == JSONToken.FIELD_NAME && parser.getText() == 'recordId'){
					System.DEBUG('in if');
					parser.nextToken();
					String recordId = parser.getText();
					System.DEBUG('recordId: ' + recordId);
					parser.nextToken();
					parser.nextToken();
					String activeDate = parser.getText();
					System.DEBUG('activeDate: ' + activeDate);
					projectIdSet.add(recordId);
					projComponentMap.put(recordId, activeDate);
				}
			}
			System.DEBUG('projectId set: ' + projectIdSet);
			System.DEBUG('project component map: ' + projComponentMap);

			List<dsProject__c> updatingProjList = new List<dsProject__c>();
			for (dsProject__c p : [Select Id, Date_System_Actively_Producing__c from dsProject__c where Id In :projectIdSet]){
				p.Date_System_Actively_Producing__c = Date.valueOf( projComponentMap.get(p.Id) );
				updatingProjList.add(p);
			}


			try{
				update updatingProjList;
			}
			catch(DmlException e){

			}
		}
	}

so, the first 4 batches, for this line: `System.DEBUG('res body: ' + res.getBody());` it does not have anything, but for last batch, it does have value