Java 如何增加AWS Lambda客户端的超时

Java 如何增加AWS Lambda客户端的超时,java,asynchronous,amazon-s3,aws-lambda,Java,Asynchronous,Amazon S3,Aws Lambda,我正在尝试使用AWS Lambda扫描文件,由于扫描功能花费的时间比预期的要长,因此出现超时 我想增加客户端的超时时间,因为这个进程是@Async的,我可以再处理几秒钟 这是我的方法: @Override @Async public void scanFile( String s3Bucket, String fileName, String path, String documentId, String createdBy ) throws IOException {

我正在尝试使用AWS Lambda扫描文件,由于扫描功能花费的时间比预期的要长,因此出现超时

我想增加客户端的超时时间,因为这个进程是@Async的,我可以再处理几秒钟

这是我的方法:

   @Override
   @Async
   public void scanFile( String s3Bucket, String fileName, String path, String documentId, String createdBy ) throws IOException {

      FileScanInput input = new FileScanInput();
      input.setS3Bucket( s3Bucket );
      input.setS3Key( path );

      logger.debug( "Scan file: " + path + ", in S3 bucket:  " + s3Bucket );
      if ( fileScanService == null ) {
         fileScanService = buildFileScanService();
      }

      FileScanOutput fileScanOutput = fileScanService.scanFile( input );
//      TODO: if the scan process failed, ask what should be the next step.
//      for now, the file stays in S3.
      Assert.notNull( fileScanOutput );
      String status = fileScanOutput.getStatus();

      // in case the document owner was not found an infected file was file. Email approved emails
      if ( status.equalsIgnoreCase( VIRUS_SCAN_INFECTED ) ) {
         // delete file on S3
         this.deleteFile( s3Bucket, path );
         String toEmail = personInfoMapper.findStudentEmail( createdBy );
         try {
            sendVirusDetectedEmail( fileName, toEmail );
         }
         catch ( Exception e ) {
            logger.error( e.getMessage() );
         }

         //         we clean up the metadata table in case there was a virus since this is running async.
         metadataDao.cleanUpMetadata( documentId );

         logger.error( "The file is infected." );
         throw new VirusFoundException( "File is infected." );
      }
   }


   public final FileScanService buildFileScanService() {
      return LambdaInvokerFactory.builder().lambdaClient( AWSLambdaClientBuilder.defaultClient() ).build( FileScanService.class );
   }
这是为Lambda函数配置的资源。

更新 我还注意到我的Lambda函数实际上完成了它的工作,这意味着问题基本上在这一行
FileScanOutput FileScanOutput=fileScanService.scanFile(输入)

fileScanOutput未初始化,而是出现超时问题

我的其他课程看起来像:

public interface FileScanService {

   @LambdaFunction( functionName = "s3-antivirus-api-scan" )
   public FileScanOutput scanFile( FileScanInput fileScanInput );
}

public class FileScanInput {

   private String s3Bucket;
   private String s3Key;

   public String getS3Bucket() {
      return s3Bucket;
   }

   public void setS3Bucket( String value ) {
      s3Bucket = value;
   }

   public String getS3Key() {
      return s3Key;
   }

   public void setS3Key( String value ) {
      s3Key = value;
   }
}



public class FileScanOutput {

   private String status;

   public FileScanOutput() {
   }

   public FileScanOutput( String status ) {
      this.status = status;
   }

   public String getStatus() {
      return status;
   }

   public void setStatus( String value ) {
      status = value;
   }
}

AWS Lambda函数每个请求的最大执行持续时间为900秒(15分钟),默认值为30秒

您可以在功能设置中增加此值:

打开位于的AWS Lambda控制台

选择你的功能

更改超时设置


当你说你的客户端超时时,你是说你的Lambda SDK客户端吗?如果是这样,您可能需要在创建客户端时传递更长的套接字超时:

awslambdadaclientbuilder.standard()
.withClientConfiguration(新的ClientConfiguration()
.withSocketTimeout(套接字超时)
.build();
默认套接字超时为50秒:


无论客户端上的套接字是否关闭,Lambda函数本身都将继续运行,这很可能是您看到函数完成作业的原因。

我的默认设置为5分钟,但仍然会超时。FWIW,我的lambda函数完成了它的工作,除了对我的调用者的响应超时。也许,你的函数没有“完成”lambda函数进程(例如:返回一些东西)
if(status.equalsIgnoreCase(VIRUS\u SCAN\u INFECTED))
如果条件为
false
,我认为您的函数将等到timedout…此函数适用于扫描小文件用例,但如果使用较大的文件作为输入。然后在我的客户机代码上花费更多的时间和时间。请检查我的更新并分享您的想法。您可以找到另一个解决方案,例如:使用另一个服务来处理大文件(EC2…),或破解lambda函数客户端触发超时需要多长时间?似乎有,也许间隔会让你知道它是哪一个。