当前位置: 首页 > 知识库问答 >
问题:

Spring调用方法捕获@async方法引发的异常

阙佐
2023-03-14

TestController使用一个TestService,它有一个Spring@async asyncComp.getGood(s)方法。当输入字符串不是“good”时,会引发异常。TestController将获得异常,在其余响应中,状态500内部服务器错误。我找不到我项目的确切代码,但找到了一些关于使用CompletableFuture的想法。在答案区域,我发布了我写的作为测试应用程序的内容,它以我想要的方式工作。

共有1个答案

阎裕
2023-03-14

这是我的测试代码,它允许控制器获取异步方法引发的异常。

@SpringBootApplication
public class AsyncApplication {

    public static void main(String[] args) {
        SpringApplication.run(AsyncApplication.class, args);
    }

}
@Configuration
@EnableAsync()
@ComponentScan
public class SpringAsyncConfig implements AsyncConfigurer {
    @Bean(name = "threadPoolTaskExecutor")
    public Executor threadPoolTaskExecutor() {
        return new ThreadPoolTaskExecutor();
    }

    @Override
    public Executor getAsyncExecutor() {
        return new SimpleAsyncTaskExecutor();
    }

    @Override
    public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
        return new CustomAsyncExceptionHandler();
    }
}
@RestController
public class TestController {
   
    @Autowired
    TestService service; 
    
    @GetMapping("/test")
    public String test() throws Exception {
        return service.getGood("bad");
        
    }
    
}
@Service
public class TestService {
    
    @Autowired
    AsyncComponent asyncComp;
    
    public String getGood(String s) throws Exception {
        
            CompletableFuture<String> result = asyncComp.getGood(s);
            return result.get();
        
    }
    

}

@Component
public class AsyncComponent {

    
    @Async
    public CompletableFuture<String> getGood(String s) throws Exception {
        if (s.equalsIgnoreCase("good")) {
            return CompletableFuture.completedFuture(s);
        } else {
            throw new Exception("test exception");
        }

    }

}

pom。xml

    <?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.5.4</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.aaa</groupId>
    <artifactId>async</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>Async</name>
    <description>async</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>
 类似资料:
  • 我无法在Spring中捕获异步方法抛出的异常。我已经编写了一个未捕获的异常处理程序来捕获,但没有成功。该应用程序将启用启动任意数量的永远运行的异步作业。我认为我的异步方法需要返回Future,以便我可以将其存储在hashmap中并检查其状态或停止作业。我也可以通过存储它来获取所有正在运行的作业。我认为我不能使用get method of Future,因为如果输入正确,它会阻塞,我的作业将永远运行

  • 问题内容: 关于程序流,这一直困扰着我一段时间。 我想知道是否有可能从Method中捕获错误,以阻止它执行通常无法跟着它执行的Method,就像下面我无法工作的示例所示。 我通常会有一个静态int变量,该变量会在程序运行时初始化为0,然后,如果某个方法捕获到异常,它将使int递增,并且每个方法仅在int为0时才运行。 这行得通,但我只是想知道是否可以用异常处理替换int shindig。 问题答案

  • 问题内容: 关于程序流,这一直困扰着我一段时间。 我想知道是否有可能从Method中捕获错误,以阻止它执行通常无法跟着它执行的Method,就像下面我无法工作的示例所示。 我通常会有一个静态int变量,该变量会在程序运行时初始化为0,然后,如果某个方法捕获到异常,它将使int递增,并且每个方法仅在int为0时才运行。 这行得通,但我只是想知道是否可以用异常处理替换int shindig。 问题答案

  • 我有两个模块,一个从rest模板调用另一个。(管理员调用notifServer)notifServer有一个用Async注释的方法。我想在该方法中抛出一个异常,但管理员获取响应太快,并且无法在admin中捕获异常方法。 我是spring和@Async进程的新成员。我已经尝试将响应主体从NotifServer映射到C的CompletableFuture。类 。但我仍然没有得到错误响应。 此代码来自管

  • 作为pdfbox 2.0.2的新手(https://github.com/apache/pdfbox/tree/2.0.2)用户,我想获取页面(PDPage)的所有笔划线(例如,表的列和行边框),因此我创建了以下类:package org。阿帕奇。pdfbox。翻译 根据我的理解,为了得到页面的行路径,必须先处理该页面,所以我在该行中调用了过程页方法,在那里我标记了“此处捕获异常”。它意外地捕获了

  • 我是Spring Boot的新手。在一个项目中,我想异步发送一封电子邮件。下面,你可以看到我到目前为止有什么。 我遇到的一个问题是:外部系统向控制器发送POST请求。如果在生成或发送邮件时发生异常,则不会调用。因此,控制器总是返回HTTP 201,因此调用者认为一切正常。 我将如何集成我的异常处理程序与在这样的异步方法? 控制器 服务 异常处理程序