Kodeffeminate
Kodeffeminate

Reputation: 81

Looking for ways to detect AWS Lambda timeouts(few seconds before timeout) in Java and to test the same

My current Lambda function is calling a 3rd party web service Synchronously.This function occasionally times out (current timeout set to 25s and cannot be increased further) My code is something like:

 handleRequest(InputStream input, OutputStream output, Context context) throws IOException {
       try{
       response = calling 3rd party REST service
       }catch(Exception e){
          //handle exceptions
       }
}

1)I want to custom handle the timeout (tracking the time and handling few milli seconds before actual timeout) within my Lambda function by sending a custom error message back to the client. How can I effectively use the

context.getRemainingTimeInMillis()

method to track the time remaining while my synchronous call is running? Planning to call the context.getRemainingTimeInMillis() asynchronously.Is that the right approach? 2)What is a good way to test the timeout custom functionality ?

Upvotes: 3

Views: 1647

Answers (3)

Shreenitha
Shreenitha

Reputation: 349

You can try with cancellation token to return custom exceptions with lambda before timeout.

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
}

Upvotes: 0

Kodeffeminate
Kodeffeminate

Reputation: 81

Another option is to use the

readTimeOut

property of the RestClient(in my case Jersey) to set the timeout.But I see that this property is not working consistently within the Lambda code.Not sure if it's and issue with the Jersey client or the Lambda.

Upvotes: 0

Kodeffeminate
Kodeffeminate

Reputation: 81

I solved my problem by increasing the Lambda timeout and invoking my process in a new thread and timing out the Thread after n seconds.

        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
        }

Upvotes: 1

Related Questions