当前位置: 首页 > 知识库问答 >
问题:

如何优雅地停止运行在eclipse中的java主程序

谷奕
2023-03-14

我在eclipse(java main method program)中运行一个脚本,它创建线程,每个线程处理一个excel表,然后将处理后的数据保存到数据库中。它已经处理数据2天了,今天突然我从excel处理完每条记录后打印的日志停止了。

我的代码的编写方式是,在处理完一个完整的工作表后,它将一条状态消息写入excel工作表记录中。这部分代码是在finally块中编写的。我一直在等待程序自行终止,但它仍在运行。我已经检查它正在运行,因为我从用户那里获取输入,以便阅读一个新的excel表。它从用户那里获取输入并打印日志。因此,我假设程序没有变得没有反应。

是否有一种方法可以安全地关闭我的程序,以便将所有的状态日志打印到excel表中。我的意思是确保finally块中的代码得到执行。脚本中没有写关机钩子。状态日志是非常重要的,因为我已经运行这个程序以来,过去2天。

根据这个链接,使用kill-15杀死一个程序会更安全,因为它可能会给程序做一些清理操作,但我不确定。

public static void validate(String sheetNameWithLocation, String threadName) {
        String fileName = sheetNameWithLocation.substring(sheetNameWithLocation.lastIndexOf("/") + 1);
        Workbook workbook = null;
        try (FileInputStream inputStream = new FileInputStream(sheetNameWithLocation);) {
            workbook = new XSSFWorkbook(inputStream);
            Sheet dataSheet = workbook.getSheet(AppConstants.DATA_SHEET);
            if (dataSheet != null) {
                String countryName = fileName.split("_")[0];
                long startTime = System.currentTimeMillis();
                for (int i = 1, count = 1; i <= dataSheet.getLastRowNum() && !shouldICleanUpAndStop; i++, count++) {
                    try {
                        validateAndProcessData(countryName, dataSheet, i, threadName);
                    } catch (Exception e) {
                        e.printStackTrace();
                        LOGGER.error(threadName + "::Exception occurred for record number:" + i + " Message is :: " + e.getMessage());
                    }
                    LOGGER.info(threadName + "::status is :: Processed " + count + " records in " + (System.currentTimeMillis() - startTime) + " ms");
                }
                LOGGER.info(threadName + "::Total time taken to process sheet is::" + (System.currentTimeMillis() - startTime) + " ms");
            } else {
                LOGGER.error(threadName + "::DATA sheet is not present. Program exiting....");
            }
        } catch (FileNotFoundException e) {
            LOGGER.error("Unable to locate file");
            e.printStackTrace();
        } catch (IOException e) {
            LOGGER.error("Unable to load or write to file.");
            e.printStackTrace();
        } finally {
            if (workbook != null) {
                try (FileOutputStream outputStream = new FileOutputStream(sheetNameWithLocation);) {
                    workbook.write(outputStream);
                } catch (FileNotFoundException e) {
                    LOGGER.error("Unable to locate file");
                    e.printStackTrace();
                } catch (IOException e) {
                    LOGGER.error("Unable to load or write to file.");
                    e.printStackTrace();
                }
            }
        }
    }

“threadid:13”#12918 prio=5 os_prio=0 tid=0x00007fde1c89f000 nid=0x155 runnable[0x00007fdde8bec000]java.lang.thread.state:runnable at java.net.socketinputstream.socketread0(本机方法)at java.net.socketinputstream.socketread(socketinputstream.java:116)at在java.io.bufferedInputstream.read1(BufferedInputstream.java:286)在java.io.bufferedInputstream.read(BufferedInputstream.java:345)-在sun.net.www.http.http.client.parseHttpHeader(httpclient.java:704)在sun.net.www.protocol.http.http.httpclient.parseHTTP(httpclient.java:647)在:1536)-在sun.net.www.protocol.http.httpurlconnection.getinp锁定<0x0000000760CC9168>(一个sun.net.www.protocol.http.httpurlconnection)utStream(httpurlconnection.java:1441)-在java.net.httpurlconnection.getResponseCode(httpurlconnection.java:480)在org.glassfish.jersey.client.httpurlconnector._apply(httpurlconnector.java:321)在org.glassfish.jersey.client.httpurlconnector.apply(httpurlconnector.java:227)在调用$1.在org.glassfish.jersey.client.jerseyinvocation$1.在org.glassfish.jersey.internal.errors.process(errors.java:667)调用(jerseyinvocation.java:664),在org.glassfish.jersey.internal.errors.process(errors.java:315),在org.glassfish.jersey.internal.errors.process(errors.java:297),在.invoke(JerseyInvocation.java:664)位于org.glassfish.jersey.client.jerseyInvoc在org.glassfish.jersey.client.jerseyinvocation$builder.get(jerseyinvocation.java:399)在transaction.script.excelsheet.validators.excelsheets.excelsheets.excelsheets.validator.getLocation(excelsheetsvalidator.java:428)在transaction.script.excelsheets.excelsheets.validator.excelsheets.validator.validator.java:231)在)在transaction.script.excelsheet.validators.excelsheetsValidator.run(excelsheetsValidator.java:122)在java.lang.thread.run(thread.java:745)

锁定的可拥有的同步器:-无

共有1个答案

丁勇
2023-03-14

您可能已经尝试过了,但我想如果您对数据库连接超时有某种异常处理,它可能会解决您的问题。

我是基于您给出的行,经过一些检查发现mongodb已经变得没有响应,因此我假设所有线程都在等待响应。

 类似资料:
  • 问题内容: 如何在Linux和Windows中正常停止Java进程? 什么时候被调用,什么时候不被调用? 终结器又如何呢? 我可以从外壳向Java进程发送某种信号吗? 我正在寻找最好的便携式解决方案。 问题答案: 在所有未强制终止VM的情况下,都会执行关机挂钩。因此,如果要发出“标准” kill(通过kill命令),则它们将执行。同样,它们将在调用后执行。 但是强行杀死(或),然后它们将不会执行。

  • 问题内容: 我写了一个线程,它花费太多时间执行,而且似乎还没有完全完成。我想优雅地停止线程。有什么帮助吗? 问题答案: 做到这一点的好方法是让一个线程保护一个Thread的变量,并在你要停止它的时候将其设置为外部变量,例如: `class MyThread extends Thread { volatile boolean finished = false; public void stopMe(

  • 问题内容: ,正如上面问题中回答的那样,我现在有一个maven-antrun-plugin,它可以分叉一个子进程并使用类似的配置来运行我的java appserver- 上面的配置作为后台进程顺利启动了我的appserver。 现在,我的问题是,有没有一种简便的方法可以定位此过程并在构建完成后根据需要停止该过程。 问题答案: 您可以使用JDK中捆绑的实用程序来获取正在运行的Java可执行文件的进程

  • 今天我遇到错误。 分析表明,最近的GC根是Logback thread: 即: 在中保存修改后,Tomcat8收到通知(我不确定用于监视fs上的更改的API是什么),然后开始重新部署应用程序。这就是之前发生的情况。 如何在容器环境中优雅地停止登录? 如何停止线程? null 更新我在中玩堆转储。在从坏的线程的引用跳转级别下: 它指的是 通过插入的日志源,我找到了changelog条目:

  • 问题内容: 有没有一种方法可以优雅地停止和及其相关联的。 我正在努力实现的目标。 停止使用消息。 优雅地停下来。 等待长期运行的消费者,并在完成后确认。 我可以停止使用,但是长期运行的使用者不会成功完成,并且一旦ListenerContainer恢复后,已处理的消息也不会被确认,因此将再次进行处理。 输出量 邮件已处理,但未确认。 我也许可以使用来实现正常关机,但是是否可以验证被取消的使用者是否已

  • 问题内容: 我有这段代码: 现在,我希望能够停止执行该线程。如何阻止它执行?例如,三秒钟后,我决定不再执行该命令,因此我想停止它。 问题答案: 您可以使用s。它们可以在s 上安排,并在执行前取消。