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

Spring异步方法隐藏异常

越国源
2023-03-14

我对异步方法有一个奇怪的问题。如果我以异步方式运行它并且它的作业抛出一些特定的异常,它不会显示它并简单地停止执行(没有捕获,没有日志)。

我发现它可以使用jasperreport。这是故障块代码:

JasperPrint jp1=null;
try{
    jp1 = JasperFillManager.fillReport(reportD1, params, new JRBeanCollectionDataSource(ingressi));
}catch(Exception e){
    log.error(e);
    e.printStackTrace();
    throw e;
}

如果此代码位于异步注释方法内,则不会引发异常,也不会记录(只是停止执行)。如果删除异步注释,它会抛出以下内容:

java.lang.ClassNotFoundException: org.apache.commons.collections.map.ReferenceMap

我的问题不是异常本身,而是为什么异步方法抓不到它?

共有1个答案

景恩
2023-03-14

@Async到底是哪个方法?如果您正在运行异步方法,您应该始终倾向于将Future作为结果类型。如果您提供了空方法,则无法传输(异步)线程中发生的任何类型的异常

有一种捕获void方法。长话短说:Spring Framework 4.1允许您为这类事情注册一个异常处理程序,请检查SPR-8995。4.1.如果您想尝试,RC1将很快提供。

 类似资料:
  • 问题内容: 我使用的是Spring 4,我注意到了一个奇怪的行为……如果我从普通实例方法多次调用异步方法,那么它们都将在不同的线程中调用,并在随机时间完成。但是,如果我多次从另一个异步方法中调用一个异步方法,那么它们将按顺序完成。我有这样的事情: 我正在使用默认的异步执行器。我应该换一个吗?但是,该执行程序不会重用任何线程,而是每次都启动另一个线程,因此应该没问题……这仅仅是巧合吗?但是我尝试了十

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

  • 我可能还不够清楚--情况是,我的现有代码不支持异步,我希望使用新的库,如System.net.http和只支持异步方法的AWS SDK。因此,我需要弥补这一差距,并能够拥有可以同步调用的代码,然后可以在其他地方调用异步方法。 我读了很多书,有很多次有人问这个问题,也有人回答这个问题。 从非异步方法调用异步方法

  • 同步调用异步方法最安全的方法是什么?

  • 没有await并且在非异步方法中调用异步方法的行为是什么?我这样问是因为我看到Visual Studio在调用异步方法时没有显示任何警告,好像这是一件非常正常的事情。在这种情况下,异步方法的行为是否像是同步的?