如何在Java函数调用上设置超时,并在超时结束后终止其执行?

时间:2019-02-22 19:43:35

标签: java timeout

我尝试使用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);
                }
            }
        };
    }

谢谢。

1 个答案:

答案 0 :(得分:1)

最后,要执行超时操作,您需要查看多个协同工作的线程。 Java线程的问题是:您不应该杀死它们。例如,请参见此处:How do you kill a Thread in Java?

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

如果所有操作都失败了……肯定会起作用:在自己的专用jvm中运行该函数调用!您可以随时杀死一个子进程。

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