Есть некоторая проблема - работаю с одним 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
Комментариев нет:
Отправить комментарий