#java #amazon-web-services #aws-lambda
#java #amazon-web-services #aws-lambda
Вопрос:
Моя текущая лямбда-функция синхронно вызывает стороннюю веб-службу.Время ожидания этой функции иногда истекает (текущий тайм-аут установлен на 25 секунд и не может быть увеличен в дальнейшем) Мой код выглядит примерно так:
handleRequest(InputStream input, OutputStream output, Context context) throws IOException {
try{
response = calling 3rd party REST service
}catch(Exception e){
//handle exceptions
}
}
1) Я хочу настроить обработку тайм-аута (отслеживание времени и обработка нескольких миллисекунд до фактического тайм-аута) в моей функции Lambda, отправив клиенту пользовательское сообщение об ошибке.
Как я могу эффективно использовать
context.getRemainingTimeInMillis()
способ отслеживания времени, оставшегося до выполнения моего синхронного вызова? Планирую вызвать context.getRemainingTimeInMillis() асинхронно.Это правильный подход? 2) Каков хороший способ протестировать пользовательские функции тайм-аута?
Ответ №1:
Я решил свою проблему, увеличив время ожидания Lambda и вызвав свой процесс в новом потоке и отключив поток через n секунд.
ExecutorService service = Executors.newSingleThreadExecutor();
try {
Runnable r = () ->{
try {
myFunction();
} catch (Exception e) {
e.printStackTrace();
}
};
f = service.submit(r);
f.get(n, TimeUnit.MILLISECONDS);// attempt the task for n milliseconds
}catch(TimeoutException toe){
//custom logic
}
Ответ №2:
Другой вариант — использовать
ReadTimeout
свойство RestClient (в моем случае Джерси) для установки тайм-аута.Но я вижу, что это свойство не работает последовательно в лямбда-коде.Не уверен, что это проблема с клиентом Джерси или с лямбдой.