@SuppressWarnings("rawtypes") private boolean retryFailedEntries(InputStream content, TrackingBytesArray data) throws IOException { ObjectReader r = mapper.reader(Map.class); JsonParser parser = mapper.getJsonFactory().createJsonParser(content); if (ParsingUtils.seek("items", new JacksonJsonParser(parser)) == null) { return false; } int entryToDeletePosition = 0; // head of the list for (Iterator<Map> iterator = r.readValues(parser); iterator.hasNext(); ) { Map map = iterator.next(); Map values = (Map) map.values().iterator().next(); String error = (String) values.get("error"); if (error != null) { // status - introduced in 1.0.RC1 Integer status = (Integer) values.get("status"); if (status != null && HttpStatus.canRetry(status) || error.contains("EsRejectedExecutionException")) { entryToDeletePosition++; } else { String message = (status != null ? String.format("%s(%s) - %s", HttpStatus.getText(status), status, error) : error); throw new IllegalStateException( String.format("Found unrecoverable error [%s]; Bailing out..", message)); } } else { data.remove(entryToDeletePosition); } } return entryToDeletePosition > 0; }
public void bulk(Resource resource, TrackingBytesArray data) throws IOException { Retry retry = retryPolicy.init(); int httpStatus = 0; do { Response response = execute(PUT, resource.bulk(), data); httpStatus = (retryFailedEntries(response.body(), data) ? HttpStatus.SERVICE_UNAVAILABLE : HttpStatus.OK); } while (data.length() > 0 && retry.retry(httpStatus)); }