首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在自定义方法和@Gateways方法上使用@Async注释处理异步过程中的错误

在自定义方法和@Gateways方法上使用@Async注释处理异步过程中的错误
EN

Stack Overflow用户
提问于 2021-02-04 20:56:57
回答 1查看 53关注 0票数 1

我有一个进程,我需要将文件异步上传到Sftp服务器。因此,在探索了更多关于网关中的异步之后,我发现我需要在@MessagingGateway参数中定义错误通道,然后使用处理程序来处理传播到错误通道的异常,但我觉得这种处理方式对我来说很复杂,因为我必须更新Pojo字段并根据文件上传、成功或失败而持久化到数据库中。

因此,我想到了使用@Async注释的自定义方法,并调用网关方法。还使用try块包围网关方法,并捕获下游发生的任何异常

代码示例:

代码语言:javascript
复制
 @Async
void upload(Resource file, FileStatus fileStatus){
    try{
        uploadGateway.upload(file,fileStatus.getFilePath(),fileStatus.getFileName());
    }catch(RuntimeException e){
        fileStatus.setUploadStatus("Failed");
        //save into db
    }
}

上传不带错误通道的网关,以便将错误发回调用者

代码语言:javascript
复制
 @MessagingGateway
 public interface UploadGateway {


@Gateway(requestChannel = "input.channel")
void upload(@Payload Resource file, @Header("path") String path, @Header("name") String fileName);
}

处理程序:

代码语言:javascript
复制
 @Bean
public IntegrationFlow uploadDocument() {
    return IntegrationFlows.from("input.channel")
            .log(LoggingHandler.Level.WARN)
            .handle(Sftp.outboundAdapter(sftpSessionFactory(), FileExistsMode.FAIL)
                    .autoCreateDirectory(true)
                    .remoteDirectoryExpression("headers['path']")
                    .fileNameExpression("headers['name']"))
            .get();
}

问:如果我以这种方式处理错误,会有什么后果?这是处理下游流程中发生的错误的正确方法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-02-04 23:35:03

由于@MessagingGateway类似于消息传递中的RPC,因此完全可以在其方法调用中捕获这样的异常。由于您使流程完全同步,因此它的工作方式类似于典型的Java异常子系统。

您对errorChannel异步错误处理的关注是有意义的,因为它在复杂性上与标准Java异步方法处理及其错误处理相似。

另一方面,如果在其他流程中需要一些复杂的逻辑,那么我们建议通过errorChannel来处理下游的错误。另外,您将返回一些补偿消息。

但是,最终还是由您自己选择:自己处理错误没有任何缺点。

请参阅Error Handling章节,了解更多可供思考的食物。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66046114

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档