我们有基于java7的谷歌应用引擎应用程序。对于某些报告生成过程,我们已在AWS中使用外部服务。此外部服务基于spring,它部署在tomcat7实例上。
我们正在从gae应用程序中使用此外部服务的REST API并从中获取输出。最近,我们需要使用URLFetch并行化此报告生成任务。
我同时启动了12个POST请求,然后尝试使用URLFetch收集结果。 (我对所有请求使用相同的外部服务URL)
但是tomcat只同时收到2个请求,这给我们造成了瓶颈。
什么可能限制tomcat所以它只能同时处理2个请求?
在这里,您可以找到请求并收集部分代码,供您参考。
URLFetchService fetcher = URLFetchServiceFactory.getURLFetchService();
FetchOptions fetchOptions = FetchOptions.Builder.withDefaults();
fetchOptions.doNotValidateCertificate();
fetchOptions.setDeadline(60d);
/* Initiate requests */
ArrayList<Future<HTTPResponse>> asyncResponses = new ArrayList<Future<HTTPResponse>>();
for(int i=startPage;i<(endPage+1);i++){
/* Create list of parameters to pass wkhtmltoPDF */
Map<String, Object> map = new HashMap<String, Object>();
map.put("parameters", parameters);
targetUrl = referer + "?viewMode=export&subjectId="+ subjectId +"&page=" + i;
map.put("targetUrl", targetUrl);
Gson gson = new Gson();
String data = gson.toJson(map);
URL serviceUrl = new URL(EXS_SERVER_URL+"/wkhtmltopdf");
HTTPRequest request = new HTTPRequest(serviceUrl, HTTPMethod.POST, fetchOptions);
HTTPHeader header = new HTTPHeader("Content-Type", "application/json; charset=UTF-8");
request.setHeader(header);
request.setPayload(data.getBytes("UTF-8"));
Future<HTTPResponse> responseFuture = fetcher.fetchAsync(request);
asyncResponses.add(responseFuture);
}
/* collect responses */
ArrayList<Integer> responseCodes = new ArrayList<Integer>();
for(int i=0;i<asyncResponses.size();i++){
Future<HTTPResponse> serviceResponse = null;
try {
serviceResponse = asyncResponses.get(i);
int responseCode = serviceResponse.get(59, TimeUnit.SECONDS).getResponseCode();
responseCodes.add(responseCode);
byte[] pdfBuffer = serviceResponse.get(59, TimeUnit.SECONDS).getContent();
if (pdfBuffer != null){
PdfReader page = new PdfReader(pdfBuffer);
copy.addDocument(page);
}
} catch (Exception e) {
e.printStackTrace();
}
}