spring@async for cloudinary upload不起作用-程序无一例外地停止

9rnv2umw  于 2021-07-23  发布在  Java
关注(0)|答案(0)|浏览(213)

最近我在 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 ,因此不需要对他们进行呼叫)。
有人遇到过这个问题吗?我不知道我还能做些什么使它异步工作。
我会感谢你的帮助。

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题