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

如何从@Async注释方法引发异常

酆勇
2023-03-14

我有两个模块,一个从rest模板调用另一个。(管理员调用notifServer)notifServer有一个用Async注释的方法。我想在该方法中抛出一个异常,但管理员获取响应太快,并且无法在admin中捕获异常方法。

我是spring和@Async进程的新成员。我已经尝试将响应主体从NotifServer映射到C的CompletableFuture。类 。但我仍然没有得到错误响应。

此代码来自管理员

ResponseEntity response = fcmRestTemplate.exchange(nsUrl + "/fcm/admin/" + bulkFcmId, HttpMethod.POST,
                    HttpEntityUtils.getHttpEntity(moduleCode), CompletableFuture.class);
            if (response.getStatusCode() != HttpStatus.CREATED && response.getStatusCode() != HttpStatus.ACCEPTED) {
                String errorMessage = ErrorResourceUtil.getErrorMessage((HashMap) response.getBody(),"Unable to send fcm");
                setStatusToFailedByBulkFcmId(bulkFcmId);
                throw new ClientException(errorMessage);
            }

这是NotifServer提供的

JobExecution jobExecution = jobLauncher
                    .run(importJob, new JobParametersBuilder()
                    .addString("fullPathFileName", TMP_DIR)
                    .addString("batch_fcm_id", String.valueOf(id))
                    .addLong("time",System.currentTimeMillis())
                    .toJobParameters());
            if(jobExecution.getStepExecutions().stream().map(StepExecution::getStatus).findFirst().get().equals(BatchStatus.ABANDONED)){
             throw new ClientException("INVALID CSV");

这是用@Async注释的。

那么,有没有一种方法可以让我在管理中的响应主体中捕获客户端异常?

编辑这是notifServer的API

@ResponseStatus(HttpStatus.CREATED)
    @PostMapping(value = "/admin/{bulkFcmId}")
    public void pushFCMByAdmin(@PathVariable Long bulkFcmId) {
        fcmService.sendFcmByAdmin(bulkFcmId, AuthUtil.getCurrentUser());
    }

然后,sendFcmByAdmin具有@异步注释。

共有1个答案

邴俊友
2023-03-14

在下面的代码中,您可以将返回类型提供为业务对象而不是CompletableFuture.class.由于您将CompletableFuture.class作为参数传递给交换,因此它需要CompletableF类型的响应返回值uture.class.

ResponseEntity response = fcmRestTemplate.exchange(nsUrl + "/fcm/admin/" + bulkFcmId, HttpMethod.POST,
                        HttpEntityUtils.getHttpEntity(moduleCode), CompletableFuture.class);
                if (response.getStatusCode() != HttpStatus.CREATED && response.getStatusCode() != HttpStatus.ACCEPTED) {
                    String errorMessage = ErrorResourceUtil.getErrorMessage((HashMap) response.getBody(),"Unable to send fcm");
                    setStatusToFailedByBulkFcmId(bulkFcmId);
                    throw new ClientException(errorMessage);
                }

您是否可以尝试按以下方式创建它,而不是传递完整的未来:

使用异步方法在admin中调用rest模板:

@Async
public CompletableFuture<List<BusinessObject>> getResponseAsynchronously(String value) {
    String url = "https://restendpoint.eu/rest/v2/lang/" + value + "?fields=name";
    BusinessObject[] response = restTemplate.getForObject(url, Country[].class);
    return CompletableFuture.completedFuture(Arrays.asList(response));
}

然后在控制器中读取CompletableFuture,如下所示:

@GetMapping("")
public List<String> getAllDataFromRestCall() throws Throwable {

    CompletableFuture<List<BusinessObject>> businessObjectsFuture = countryClient.getResponseAsynchronously("fr");
    List<String> europeanFrenchSpeakingCountries;

            try {
                europeanFrenchSpeakingCountries = new ArrayList<>(businessObjectsFuture
                .get()
                .stream()
                .map(Country::getName)
                .collect(Collectors.toList()));

     } catch (Throwable e) {
       throw e.getCause();
     }

   return europeanFrenchSpeakingCountries;
}
 类似资料:
  • 我完全遵循这条线索。您可以看到这两种异步方法具有几乎相同的结构。异步方法调用事务性方法。但是第二个抛出。 我甚至模仿第一个异步方法结构来修改第二个: 这一次,它给出了。 我想知道我的代码中的缺失点,任何帮助都将不胜感激。

  • 我是Spring异步任务执行的新手,所以如果这听起来像个愚蠢的问题,请原谅我。 我读到,从Spring 3. x开始,在方法级别引入了@Async注释,以便异步调用该方法。我还了解到,我们可以在Spring配置文件中配置ThreadPoolTaskExecator。 我无法理解的是,如何从tak执行器调用@Async注释的方法让我们假设-AsyncTaskExecutor 早些时候,我们经常在课堂

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

  • null 所有步骤2、3和4都将在一个带有@async注释的方法中执行。问题是,如果我重新启动后端服务器,只发送一个下载请求,一切都很好,这意味着电子邮件可以收到。但发送更多下载请求后就不起作用了。不会再发送电子邮件。没有错误,没有警告,但所有需要的数据都被正确接收,只是没有电子邮件被发送出去。 有人知道它的问题是什么吗? 我的电子邮件发件人:

  • 问题内容: 我有以下注释。 MyAnnotation.java SomeAspect.java SomeOther.java 在上面的课中, @MyAnnotation中* 传递了“ ABC ” 。现在如何在 SomeAspect.java 类的 处理 方法中访问“ ABC ”值? *** 谢谢! 问题答案: 您可以从ProceedingJoinPoint获取签名,如果方法调用,只需将其转换为Me