gpt4 book ai didi

java - @Async 执行时如何让调用者方法等待?

转载 作者:行者123 更新时间:2023-12-03 13:18:35 24 4
gpt4 key购买 nike

我正在尝试运行通过防病毒软件上传的文件,并希望在单独的线程中运行每个文件。我写了如下方法

@Transactional( rollbackFor = DataException.class )
public void throwExceptionIfFilesIsAMalware( MultipartFile[] files ) throws DataException
{
try
{
NullEmptyUtils.throwExceptionIfInputIsNullOrEmpty(files, GeneralConstants.FILE_NOT_FOUND);
for( MultipartFile file : files )
{
Future<Boolean> future = throwExceptionIfFileIsAMalware(file);
}
}
catch( DataException e )
{
log.error(GeneralConstants.ERROR, e);
throw e;
}
catch( Exception e )
{
log.error(GeneralConstants.ERROR, e);
throw new DataException(GeneralConstants.EXCEPTION, GeneralConstants.SOMETHING_WENT_WRONG,
HttpStatus.BAD_REQUEST);
}
}

@Async
public Future<Boolean> throwExceptionIfFileIsAMalware( MultipartFile file ) throws DataException
{
try
{
NullEmptyUtils.throwExceptionIfInputIsNull(file, GeneralConstants.FILE_NOT_FOUND);
byte[] scannedResult = clamAVClient.scan(new BufferedInputStream(file.getInputStream()));
if( !ClamAVClient.isCleanReply(scannedResult) )
{
throw new DataException(GeneralConstants.EXCEPTION,
GeneralConstants.MALWARE_EXCEPTION + GeneralConstants.SINGLE_SPACE_STRING + file.getName(),
HttpStatus.BAD_REQUEST);
}
return new AsyncResult<>(true);
}
catch( IOException e )
{
log.error(GeneralConstants.ERROR, e);
throw new DataException(GeneralConstants.EXCEPTION, GeneralConstants.FILE_IO_EXCEPTION,
HttpStatus.BAD_REQUEST);
}
catch( DataException e )
{
log.error(GeneralConstants.ERROR, e);
throw e;
}
catch( Exception e )
{
log.error(GeneralConstants.ERROR, e);
throw new DataException(GeneralConstants.EXCEPTION, GeneralConstants.SOMETHING_WENT_WRONG,
HttpStatus.BAD_REQUEST);
}
}
我希望调用第二个异步方法的第一个方法等到所有线程都完成。
但是如果我调用 future.get()在循环内部,它不会并行运行线程中的所有文件。它将开始等待每个文件在单独的线程中处理。
我该如何处理?
谢谢

最佳答案

首先,不能使用@Async关于私有(private)方法。在运行时,它将无法创建代理,因此无法工作。
如果我理解你想要做的正确,你必须分开 throwExceptionIfFileIsAMalware到另一个类,然后使用带有 @Async 的 Spring 代理.这样,您可以在 main 方法中捕获您期望的异常并将其存储在一个变量(或者可能是异常列表)中。然后,在所有执行之后,您可以检查您的列表并抛出异常。

关于java - @Async 执行时如何让调用者方法等待?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62903843/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com