如何在应用程序的整个生命周期中管理并发API调用

时间:2017-09-15 08:24:10

标签: java spring multithreading concurrency

目前我正在尝试找到在我的应用程序中管理并发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年,但我还没有找到办法。

0 个答案:

没有答案