Как установить таймаут для вызова функции Java и завершить его выполнение по истечении времени ожидания? - PullRequest
0 голосов
/ 22 февраля 2019

Я пытался использовать опцию Callable, чтобы установить тайм-аут для вызова функции, при этом сам устанавливая продолжительность тайм-аута в файле конфигурации Spring Boot (spring.mvc.async.request-timeout).

Код делаетВозврат по истечении установленного времени ожидания, но проблема в том, что сама функция продолжает выполнение.

У меня нет доступа к исходному коду этой функции, так как это сторонняя библиотека, поэтому у меня нетспособ установить проверку прерывания в этом коде.

Есть ли способ принудительно завершить функцию / поток после истечения времени ожидания?Использую ли я неправильный путь здесь, и есть ли другой способ достижения этой цели?

Пример текущего кода, который «возвращается» по истечении времени ожидания, но на самом деле не останавливает выполнение этого кода вфон:

@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 голосов
/ 22 февраля 2019

В конце концов, чтобы использовать тайм-аут, вы смотрите на несколько потоков, работающих вместе.Проблема с потоками Java заключается в следующем: вы не должны их убивать.Смотрите здесь, например: Как убить поток в Java?

Другими словами: если вы намереваетесь действительно контролировать сторонний код и иметь возможность его убить, то потоки выиграют 'т делатьВы можете попробовать и посмотреть, работает ли thread.stop () достаточно надежно для вас.И, конечно, вы можете видеть, к чему приводит простое прерывание потока, запускающего ваш метод.Вы определенно должны работать напрямую с голыми металлическими нитями.

Если все это не удастся ... что бы сработало: запустите вызов этой функции в своем собственном выделенном jvm!Вы всегда можете убить дочерний процесс.

Недостаток, конечно: теперь вам нужно беспокоиться о внутрипроцессном взаимодействии и о том, как получить ваши данные для этой функции и обратно из нее!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...