我当前的Lambda函数正在调用第三方web服务同步。此函数偶尔会超时(当前超时设置为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( 测试超时自定义功能的好方法是什么?
我通过增加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
}
另一个选项是使用
readTimeOut
RestClient(在我的案例中是Jersey(的
属性来设置超时。但是我发现这个属性在Lambda代码中并不一致。不确定是泽西客户还是Lambda的问题。
您可以尝试使用取消令牌在超时前使用lambda返回自定义异常。
try
{
var tokenSource = new CancellationTokenSource(TimeSpan.FromMinutes(1)); // set timeout value
var taskResult = ApiCall(); // call web service method
while (!taskResult.IsCompleted)
{
if (tokenSource.IsCancellationRequested)
{
throw new OperationCanceledException("time out for lambda"); // throw custom exceptions eg : OperationCanceledException
}
}
return taskResult.Result;
}
catch (OperationCanceledException ex)
{
// handle exception
}