【问题标题】:How to set a timeout on a java function call, and kill its execution once timeout is over?如何在 java 函数调用上设置超时,并在超时结束后终止其执行?
【发布时间】:2019-02-22 19:43:34
【问题描述】:

我尝试使用 Callable 选项设置函数调用超时,同时在 Spring Boot 的配置文件 (spring.mvc.async.request-timeout) 中设置超时持续时间。

设置超时后代码确实返回,但问题是函数本身继续执行。

我无权访问该函数的源代码,因为它是第三方 libaray,因此我无法在该代码中设置中断检查。

有没有办法在超时结束后强制终止函数/线程?我在这里使用了错误的路径吗?还有其他方法可以实现这个目标吗?

当前代码的示例,在超时后“返回”,但并没有真正停止在后台执行该代码:

@RequestMapping(value = "/api/test", method = RequestMethod.POST, produces = "application/json")
    public Callable<ResponseEntity<String>> test(@RequestParam(...) Boolean bbb) {
        return new Callable<ResponseEntity<String>>() {
            @Override
            public ResponseEntity<String> call() throws Exception {
                try {
                    <POTENTIALLY LONG 3RD-PARTY FUNCTION CALL HERE>
                    .....
                } catch (Exception e) {
                    return new ResponseEntity<String>("..." }", HttpStatus.BAD_REQUEST);
                }
            }
        };
    }

谢谢。

【问题讨论】:

    标签: java timeout


    【解决方案1】:

    最后,为了行使超时,您正在查看多个线程一起工作。 Java 线程的问题是:你不应该杀死它们。例如,请参见此处:How do you kill a Thread in Java?

    换句话说:如果您打算真正控制 3rd 方代码并能够杀死它,那么线程将无法做到。您可以尝试看看使用 thread.stop() 是否对您来说“足够可靠”。当然,您可以看到中断运行您的方法的线程是多么简单。您绝对必须直接使用裸金属线程。

    如果所有这些都失败了......什么肯定会起作用:在它自己的专用 jvm 中运行该函数调用!你总是可以杀死一个子进程。

    当然有缺点:现在您需要担心进程内通信以及如何将数据获取到该函数并从该函数返回!

    【讨论】:

    • 感谢您的评论。我希望有一个更简单的解决方案.. :(
    • 目前我什么都想不到。赞成感谢您的意见。
    猜你喜欢
    • 1970-01-01
    • 2020-05-22
    • 1970-01-01
    • 2016-10-18
    • 2011-09-26
    • 1970-01-01
    • 2012-01-17
    • 1970-01-01
    • 2017-03-11
    相关资源
    最近更新 更多