簡體   English   中英

Java ExecutorService REST調用錯誤

[英]Java ExecutorService REST call error

我正在嘗試使用Java的ExecutorService發出並發的REST請求,該請求會生成各種系統信息日志(來自控制器),但是遇到了錯誤。 我的請求中大約有一半成功地到達了目標,但另一半看起來就像已被發送,但在發送到的服務器上找不到。 我認為在設置ExecutorService的邏輯上可能存在缺陷。 可以從對控制器的REST調用中調用下面顯示的函數log(),並且應該創建一個新線程,該線程發送一個單獨的HTTP請求,並繼續執行主線程,以免等待網絡I /哦 經過大量搜索之后,我相信我已經正確關閉了ExecutorService,等待線程完成。 由於來自控制器的多個請求會繼續出現,因此有人在我的線程創建邏輯中看到某種類型的錯誤嗎?

//Controller
//code
 @RequestMapping(value="/log", method= RequestMethod.GET)
public String log()
{
    genomicsLogger.log(Severity.err, Category.LOG, "This is a log from the reporting manager!");
    return "Hopefully logged";
}


//ClassB
public String log(String trns , String user, Severity severity, Category category, String msg) {
                trnsField = trns;
                userField = user;
                ...
                ...
                ...
                ExecutorService executor = Executors.newFixedThreadPool(1);
                Runnable task = () -> {



                        try {
                            System.out.println("Started thread: " + Thread.currentThread().getName());
                            restService.consumeRest(true, instance.getUri().toString(), LOG_URI, list, log, HttpMethod.POST, new HttpHeaders(), String.class);
                            System.out.println("SENT REST REQUEST");
                        } catch (URISyntaxException e) {
                            e.printStackTrace();
                        } catch (KeyStoreException e) {
                            e.printStackTrace();
                        } catch (IOException e) {
                            e.printStackTrace();
                        } catch (CertificateException e) {
                            e.printStackTrace();
                        } catch (NoSuchAlgorithmException e) {
                            e.printStackTrace();
                        } catch (UnrecoverableKeyException e) {
                            e.printStackTrace();
                        } catch (KeyManagementException e) {
                            e.printStackTrace();
                        }

                    }
                };
                    executor.submit(task);
                try {
                    System.out.println("attempt to shutdown executor");
                    executor.shutdown();
                    executor.awaitTermination(5, TimeUnit.SECONDS);
                }
                catch (InterruptedException e) {
                    System.err.println("tasks interrupted");
                }
                finally {
                    if (!executor.isTerminated()) {
                        System.err.println("cancel non-finished tasks");
                    }
                    executor.shutdownNow();
                    System.out.println("shutdown finished");
                }

                return "";
            }

您正在使用每個日志創建執行程序服務並將其殺死。

這不是使用它的方法,而是要被重用,使其成為此類的一個字段,並設置一些您願意為其使用的線程(可能大於1)。 並且,除非您確實確定將不使用它,否則請不要對其進行關閉(例如,在應用程序關閉期間)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM