目前我正在尝试找到在我的应用程序中管理并发API调用的最佳方法。目前我一直在使用HTTPURLConnection进行HTTP方法调用,虽然它工作正常但最终我会遇到一些“Socket”异常:连接重置'正在打电话。但是,我正在使用多线程,因为我有许多不同的api调用并发运行。
我已经研究过使用AsyncRestTemplate虽然它正在工作但我发现在控制台中显示了池和线程的列表,即[pool-6-thread-1]但是当它变为[pool-2018-thread- 1]就是当它决定停止再进行api调用时。
这是我正在使用的代码:
//This method is inside another class in my actual application but here for simplicity
public static ListenableFuture<ResponseEntity<String>> getLastPrice( AsyncRestTemplate asyncRestTemplate) {
String url = "https://bittrex.com/api/v1.1/public/getmarketsummary?market=btc-dar";
asyncRestTemplate = new AsyncRestTemplate(new ConcurrentTaskExecutor(Executors.newCachedThreadPool()));
return asyncRestTemplate.exchange(url, HttpMethod.GET, new HttpEntity<>("result"), String.class);
}
public PriceThread(JTextField lastPriceJT) {
this.lastPriceJT = lastPriceJT;
}
@Override
public void run() {
AsyncRestTemplate asyncRestTemplate = new AsyncRestTemplate(new ThreadPoolTaskExecutor());
while (true) {
try {
getLastPrice(coin, asyncRestTemplate)
.addCallback(new ListenableFutureCallback<ResponseEntity<String>>() {
@Override
public void onSuccess(ResponseEntity<String> response) {
//TODO: Add real response handling
try {
JSONObject result = new JSONObject(response.getBody());
String status = LOGGER.printResponseToLogger(result);
BigDecimal last = result.getJSONArray("result").getJSONObject(0).getBigDecimal("Last");
lastPriceJT.setText(last.toPlainString());
} catch (Exception e) {
LOGGER.printResponseToLogger(e.getMessage());
}
}
@Override
public void onFailure(Throwable ex) {
//TODO: Add real logging solution
LOGGER.printResponseToLogger(ex.getMessage());
}
});
} catch (Exception e) {
LOGGER.printResponseToLogger(e.getMessage());
}
}
}
目前我认为这个问题的解决方案是让我重用池,这样如果可能的话,它就不会增加到2018年,但我还没有找到办法。