在自定义方法和@Gateways 方法上使用@Async 批注处理异步过程中的错误
Handling Error in asynchronous process using @Async annotation on custom method vs on @Gateways method
我有一个过程需要将文件异步上传到 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
处理下游错误确实值得称赞。另外你要return回复一些补偿消息。
但最终选择权在您:您自己处理错误没有任何缺点。
请参阅 Error Handling 章节了解更多食物。
我有一个过程需要将文件异步上传到 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
处理下游错误确实值得称赞。另外你要return回复一些补偿消息。
但最终选择权在您:您自己处理错误没有任何缺点。
请参阅 Error Handling 章节了解更多食物。