微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决在自定义方法上使用@Async 注释处理异步过程中的错误与@Gateways 方法

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

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

代码示例:

 @Async
void upload(Resource file,FileStatus fileStatus){
    try{
        uploadGateway.upload(file,fileStatus.getFilePath(),fileStatus.getFileName());
    }catch(RuntimeException e){
        fileStatus.setUploadStatus("Failed");
        //save into db
    }
}

上传网关没有错误通道,以便将错误返回给调用

 @MessagingGateway
 public interface UploadGateway {


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

处理程序:

 @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();
}

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

解决方法

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

您对使用 errorChannel 进行异步错误处理的担忧确实有道理,因为它与标准 Java 异步方法处理及其错误处理的复杂性相似。

另一方面,如果在其他流程中将是一些复杂的逻辑,那么通过 errorChannel 处理下游错误是非常值得推荐的。另外,您将返回一些补偿信息。

然而,最终选择权在您手中:自己处理错误没有任何缺点。

请参阅Error Handling章节了解更多值得思考的食物。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?