Java ExecutorService REST 调用错误

标签 java multithreading rest

我正在尝试使用 Java 的 ExecutorService 发送并发 REST 请求,这些请求会生成各种系统信息日志(来自 Controller ),但是遇到了错误。我的请求中约有一半成功到达目标,但另一半看起来好像已发送,但在发送到的服务器上找不到。我认为我在设置 ExecutorService 的逻辑上可能存在缺陷。下面显示的函数 log() 可以从对 Controller 的 REST 调用中调用,并且应该创建一个新线程来发送单独的 HTTP 请求,并继续主线程,以免等待网络 I/O。经过大量搜索,我相信我已正确关闭 ExecutorService 并等待线程完成。由于来自 Controller 的多个请求可以继续传入,任何人都可以看到我的线程创建逻辑中存在某种类型的错误吗?

//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)。并且在您确实确定不会使用它之前不要关闭它(例如在应用程序关闭期间)。

关于Java ExecutorService REST 调用错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38060824/

相关文章:

java - 如何检测已安装的JRE版本

java - 是否可以针对特定(错误)调用快速修复解决方案(eclipse)?

java - 如何保存 imageView 设置?

java - setProgressbar 未在 Activity 上运行的线程中更新 getView 内部?

java - 监听多个套接字 (InputStreamReader)

c++ - 关于使用 QThreadStorage 的线程安全

java - Jersey & Jackson - 修改 Jackson 输出的资源

javascript - 在上一个 GET 请求的对象可用后直接发送 GET 请求?

javascript - Chrome 开发者工具可确定代码中何处执行 REST 调用?

java - 一个方法是否有可能确定它的返回值是否会被使用?