Страницы

Поиск по вопросам

четверг, 21 марта 2019 г.

Ограничение времени выполнения метода в основном потоке

Есть некоторая проблема - работаю с одним API примерно следующим образом:
событие -> запрос от их API к моему серверу -> [какие-то действия -> мой запрос к их API (или несколько)] -> на основе их ответа уже мой ответ их запросу
Так вот, действия, происходящие в [квадратных скобках] могут выполняться очень долго (как ни странно, в виду долгого их ответа, а не моего). Несмотря на это, после 20 или 25 секунд, примерно, их сервер перестаёт ждать моего ответа.
Что мне нужно сделать:
событие -> запрос от их API к моему серверу -> я запускаю обработку запроса, которая должна длиться не более 20 секунд, если дольше - возвращаю дефолтный ответ -> [какие-то действия -> мой запрос к их API (или несколько)] -> на основе их ответа уже мой ответ их запросу
То есть нужно сделать так, чтобы при превышении времени обработки, я давал дефолтный ответ. Я не хочу уменьшать сам время ожидания, и так далее, мне нужно сделать именно так, как я описал, не меняя ничего остального в коде.
Я могу всю свою обработку сунуть в переопределённый run() нового потока, и заjoin()ить его, и как в этом примере, интерраптить через определенное количество секунд. Но это крайне небезопасно, и всё такое прочее. К тому же, во время выполнения, я и к базе данных обращаюсь, и сам запросы какие-то делаю.
Буду рад, если подскажете возможное решение.

Немного конкретики, если вдруг кто решит уточнить:
Работаю с VK Callback API, во время обработки их запросов, появляется необходимость скачать аватар пользователя или ещё некоторые файлы. То есть, я обращаюсь к файлу по URL и скачиваю его на диск следующим образом (не спрашивайте, почему так, а не с использованием библиотек апачей):
public void downloadFile(String fileURL, String saveFilePath) { try { int BUFFER_SIZE = 4096; URL url = new URL(fileURL); HttpURLConnection httpConn = (HttpURLConnection) url.openConnection(); int responseCode = httpConn.getResponseCode();
// always check HTTP response code first if (responseCode == HttpURLConnection.HTTP_OK) {
// opens input stream from the HTTP connection InputStream inputStream = httpConn.getInputStream();
// opens an output stream to save into file FileOutputStream outputStream = new FileOutputStream(saveFilePath);
int bytesRead; byte[] buffer = new byte[BUFFER_SIZE]; while ((bytesRead = inputStream.read(buffer)) != -1) { outputStream.write(buffer, 0, bytesRead); }
outputStream.close(); inputStream.close(); } httpConn.disconnect(); } catch (IOException e) { e.printStackTrace(); } }
Или же просто считываю картинку с URL:
BufferedImage img = ImageIO.read(new URL("https://..."));
И постоянно ошибки, либо такая (ссылается на строчку, приведенную чуть выше):
javax.imageio.IIOException: Can't get input stream from URL! at javax.imageio.ImageIO.read(ImageIO.java:1395)
Либо такая:
java.net.ConnectException: Connection timed out (Connection timed out)
Которая ссылается на эту строчку:
int responseCode = httpConn.getResponseCode();
Такое случается не всегда, и только последнее время, + было еще чуть больше недели назад. Но сейчас уже два дня подряд, причем постоянно, и с этим надо как-то бороться. Пробовал добавлять User-Agent, вдруг в этом проблема, но это тоже не помогает. Да и вычислить, помогает это или нет, довольно трудно, потому что эта ошибка выскакивает когда хочет, и приходится повторять действия неоднократно, чтобы понять, решена проблема или нет.


Ответ

Поскольку на первый вопрос мне изначально не ответили, я решил его переформулировать и задать этот вопрос. Отвечаю на вторую часть своего вопроса: мне нужно было сделать так, чтобы клиент не ждал окончания выполнения всех моих действий. На этот вопрос я ответил тут: Порядок выполнения содержимого методов doPost и doGet

Комментариев нет:

Отправить комментарий