最近我在 Spring 实现了将图像上传到cloudinaryapi。
一切都很好(在非异步运行时),但是当我想重构我的 uploadImage
方法异步工作,程序一直运行到 Cloudinary.uploader().upload(...)
被称为。在这个地方,程序停止而不抛出任何异常。
当我摆脱 Cloudinary.uploader().upload(...)
,整个异步方法工作正常。
以下是我的配置:
@Configuration
@EnableAsync
public class AsyncConfig {
}
调用@async method时控制器的终结点:
@PostMapping(path = "/uploadImage/{productId}")
public void uploadImage(@PathVariable("productId") Long productId,
@RequestParam("file") MultipartFile file) {
ImageToUpload imageToUpload = new ImageToUpload(); //my custom entity used just for validation, don't focus on it
imageToUpload.setFile(file);
productService.uploadImage(imageToUpload, productId); //<--- Here is @Async method call
}
使用异步方法的服务:
@Override
@Async
@Transactional
public CompletableFuture<Void> uploadImage(final ImageToUpload imageToUpload, final Long productId) {
return CompletableFuture.runAsync(() -> {
ProductDTO productDTO = findById(productId);
ImageDTO imageDTO = imageService.createNewImage(imageToUpload); // <-- here program stops without any exception
productDTO.setImageId(imageDTO.getId());
update(productId, productDTO);
});
}
createnewimage()方法:
public ImageDTO createNewImage(final ImageToUpload imageToUpload) {
Map uploadResult = cloudinary.uploader().upload( // <-- here's the problem - when Cloundinary tries to upload image and never ending
imageToUpload.getFile().getBytes(),
ObjectUtils.asMap("resource_type", "auto")
);
imageToUpload.setParams(uploadResult);
Image image = imageRepository.save(
new Image(uploadResult.get("url").toString(), imageToUpload.getPreloadedFile())
);
log.info("Image: " + image.getTitle() + " saved and uploaded successfully.");
return imageMapper.toDto(image);
}
当我打电话的时候 .get()
在控制器中的async方法上,一切都可以工作,但在这种情况下,async是无用的。这很奇怪,因为在我以前的项目中,所有异步方法都可以正常工作 get()
(他们回来了 Void
,因此不需要对他们进行呼叫)。
有人遇到过这个问题吗?我不知道我还能做些什么使它异步工作。
我会感谢你的帮助。
暂无答案!
目前还没有任何答案,快来回答吧!