首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Spring Async未捕获异常处理程序

Spring Async未捕获异常处理程序
EN

Stack Overflow用户
提问于 2012-01-05 00:00:14
回答 4查看 32.5K关注 0票数 28
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Override
@Async
public void asyncExceptionTest() {
    int i=1/0;
}

我如何使用Spring Async框架来记录这一点,而不必在每个异步方法中都放入try catch?它似乎不会像正常的那样传递给DefaultUncaughtExceptionHandler

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-01-28 13:57:05

可以使用自定义Executor配置@Async方法,以记录任何抛出的异常。

下面的代码实现了这个模式。任何用@Async标记的方法都将使用由方法public Executor getAsyncExecutor()返回的Executor。这将返回负责所有日志记录的HandlingExecutor (在本例中,它只打印单词"CAUGHT!“但您可以将其替换为日志。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Configuration
@EnableAsync
public class ExampleConfig implements AsyncConfigurer {
    @Bean
    public Runnable testExec() {
        return new TestExec();
    }

    @Override
    public Executor getAsyncExecutor() {
        final ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(7);
        executor.setMaxPoolSize(42);
        executor.setQueueCapacity(11);
        executor.setThreadNamePrefix("MyExecutor-");
        executor.initialize();
        return new HandlingExecutor(executor);
    }
}

public class HandlingExecutor implements AsyncTaskExecutor {
    private AsyncTaskExecutor executor;

    public HandlingExecutor(AsyncTaskExecutor executor) {
        this.executor = executor;
    }

    @Override
    public void execute(Runnable task) {
        executor.execute(task);
    }

    @Override
    public void execute(Runnable task, long startTimeout) {
        executor.execute(createWrappedRunnable(task), startTimeout);
    }

    @Override
    public Future<?> submit(Runnable task) {
        return executor.submit(createWrappedRunnable(task));
    }

    @Override
    public <T> Future<T> submit(final Callable<T> task) {
        return executor.submit(createCallable(task));
    }

    private <T> Callable<T> createCallable(final Callable<T> task) {
        return new Callable<T>() {
            @Override
            public T call() throws Exception {
                try {
                    return task.call();
                } catch (Exception e) {
                    handle(e);
                    throw e;
                }
            }
        };
    }

    private Runnable createWrappedRunnable(final Runnable task) {
        return new Runnable() {
            @Override
            public void run() {
                try {
                    task.run();
                } catch (Exception e) {
                    handle(e);
                }
            }
        };
    }

    private void handle(Exception e) {
        System.out.println("CAUGHT!");
    }
}
票数 24
EN

Stack Overflow用户

发布于 2012-01-05 08:35:31

更新:自4.1Spring以来的

从Spring4.1开始,可以为@Async void方法提供一个AsyncUncaughtExceptionHandler

Spring参考文档,Chapter 34.4.5 Exception management with @Async

...然而,对于void返回类型,异常是未捕获的,并且不能传输。对于这些情况,可以提供一个AsyncUncaughtExceptionHandler来处理此类异常。

默认情况下,仅记录异常。可以通过AsyncConfigurer或AsyncUncaughtExceptionHandler :注解驱动的XML元素定义自定义任务。

(此功能是在DD提出改进请求后引入的:,请参阅此答案的评论)

Spring 4.1之前的

看起来缺少如何处理返回@Async方法的void异常的功能。(我在参考资料或java文档中找不到任何提示)

我能想到的解决方案是:尝试使用AspectJ在记录异常的所有@Async方法周围编写某种包装器。

对于日志术语,我建议在spring bug跟踪器中创建一个freature请求。

票数 21
EN

Stack Overflow用户

发布于 2017-10-20 13:57:22

首先,您应该创建一个自定义异常处理程序类,如下所示;

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Component
public class AsyncExceptionHandler implements AsyncUncaughtExceptionHandler {

        private final Logger logger = LoggerFactory.getLogger(AsyncExceptionHandler.class);

        @Override
        public void handleUncaughtException(Throwable ex, Method method, Object... params) {
            logger.error("Unexpected asynchronous exception at : "
                    + method.getDeclaringClass().getName() + "." + method.getName(), ex);
        }

    }

在此之后,您应该在配置中设置自定义的异常处理程序类,如下所示;

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Configuration
@EnableAsync
public class AsyncConfig extends AsyncConfigurerSupport {

    @Autowired
    private AsyncExceptionHandler asyncExceptionHandler;

    @Override
    public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
        return asyncExceptionHandler;
    }

}

注意:可注入异常处理程序是一个选项。您可以为每个异常创建一个新实例。我的建议是对异常处理程序类使用注入,因为spring的默认作用域是singleton,所以没有必要为每个异常创建新的实例。

票数 17
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8735870

复制
相关文章
Arctan的快速近似算法
\(arctan\)的近似计算本质上是在所需精度范围内对\(arctan\)曲线进行拟合,比较直接的想法是泰勒展开,
李拜六不开鑫
2020/07/21
2K0
量子近似优化算法及其应用
量子近似优化算法(QAOA)是一种经典和量子的混合算法,是一种在基于门的量子计算机上求解组合优化问题的变分方法。一般而言,组合优化的任务就是从有限的对象中寻找使成本最小化的目标对象,在实际生活中的主要应用包括降低供应链成本、车辆路径、作业分配等。
量子发烧友
2023/03/08
1.2K0
量子近似优化算法及其应用
常见算法:最长子串
题目1: 1、给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度 class Solution { public: int lengthOfLongestSubstring(string s) { int startIndex = 0; int res = 0; map<char,int> charMap; for (int i = 0; i < s.length(); i++) { char tmp
艳龙
2021/12/16
4290
leetcode最长回文子串_最长回文子串算法
作者:翟天保Steven 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处
全栈程序员站长
2022/11/03
8010
a*算法最短路径_最长路径算法
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
全栈程序员站长
2022/11/08
2.9K0
a*算法最短路径_最长路径算法
基于局部直方图相关算法的近似优化和提速。
       这类算法有个通病,就是即使选择使用SIMD指令加速,因为其内在的特性,速度还是不能很快,但是又找不到其他合适的构架来优化他,还必须使用直方图技术,比如我们的中值滤波, 我尝试过各种商业软件,其速度都和我博客里提到的那个优化速度差不多,说明大家基本上都是那个套路。你们当确实某个场景需要更快的速度时,我们是否能有其他方法来加速呢,或者使用某个近似的方法来替代呢,经过个人的实践,我觉得还是可以有的。
用户1138785
2022/12/31
6280
基于局部直方图相关算法的近似优化和提速。
MCMC、蒙特卡洛近似和Metropolis算法简介
MCMC 是Markov Chain Monte Carlo 的简称,但在传统模拟中有一个很重要的假设是样本是独立的(independent samples),这一点在贝叶斯统计尤其是高纬度的模型中很难做到。所以MCMC的目的就是运用蒙特卡洛模拟出一个马可链(Markov chain)。
deephub
2020/11/02
1.2K0
MCMC、蒙特卡洛近似和Metropolis算法简介
LeetCode 算法 | 最长公共前缀?
首先,我们将描述一种查找一组字符串的最长公共前缀 LCP(S_1 \ldots S_n)LCP(S1…Sn) 的简单方法。 我们将会用到这样的结论:
技术从心
2019/08/06
8440
算法基础-最长递增子序列
【问题1】最长递增子序列问题 【问题描述】设L=<a1,a2,…,an>是n个不同的实数的序列,L的递增子序列是这样一个子序列Lin=<ak1,ak2,…,akm>,其中k1<k2<…<km且aK1<ak2<…<akm。求最大的m值。 采用一个数组temp[]保存 以当前元素结尾的最长递增子序列长度,最后求出全局最优解 更新最长递增子序列的条件:a[i]>a[j] (i>j) 且前一个递增序列长度大于等于当前递增序列长度
里克贝斯
2021/05/21
7590
☆打卡算法☆LeetCode 32、最长有效括号 算法解析
链接:32. 最长有效括号 - 力扣(LeetCode) (leetcode-cn.com)
恬静的小魔龙
2022/08/07
2060
☆打卡算法☆LeetCode 32、最长有效括号  算法解析
近似推断难题
许多概率模型很难训练的原因是很难进行推断。在深度学习中,通常我们有一系列可见变量 v 和一系列潜变量 h。推断困难通常是指难以计算 p(h | v) 或其期望。而这样的操作在一些诸如最大似然学习的任务中往往是必需的。许多仅含一个隐藏层的简单图模型会定义成易于计算 p(h | v) 或其期望的形式,例如受限玻尔兹曼机和概率 PCA。不幸的是,大多数具有多层隐藏变量的图模型的后验分布都很难处理。对于这些模型而言,精确推断算法需要指数量级的运行时间。即使一些只有单层的模型,如稀疏编码,也存在着这样的问题。我们可以参考几个用来解决这些难以处理的推断问题的技巧,其描述了如何将这些技巧应用到训练其他方法难以奏效的概率模型中,如深度信念网络、深度玻尔兹曼机。
用户10360156
2023/03/02
2740
近似子模函数最小化的量子经典算法
作者:Yassine Hamoudi,Patrick Rebentrost,Ansis Rosmanis,Miklos Santha
罗大琦
2019/07/18
8830
近似子模函数最小化的量子经典算法
试题 算法训练 最长字符串
资源限制 时间限制:1.0s 内存限制:512.0MB   求出5个字符串中最长的字符串。每个字符串长度在100以内,且全为小写字母。 样例输入 one two three four five 样例输出 three import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Scanner; public class 快速排序 { /** * @param ar
SingYi
2022/07/13
2020
LCS 算法 最长公共子序列
最长公共子序列不需要在原序列中占用连续的位置 #include <iostream> #include <string> #include <cstring> #include <vector> #include <algorithm> using std::cin; using std::cout; using std::endl; using std::string; using std::vector; using std::max; void LCS(const char* str1,
week
2018/12/12
5110
算法:最长公共子序列(LCS)
LCS 是 Longest Common Subsequence 的缩写,即最长公共子序列。一个序列,如果是两个或多个已知序列的子序列,且是所有子序列中最长的,则为最长公共子序列。
WEBJ2EE
2019/07/19
2K0
算法:最长公共子序列(LCS)
最长上升子序列(LIS)算法
LIS(Longest Increasing Subsequence)最长上升子序列 一个数的序列bi,当b1 < b2 < … < bS的时候,我们称这个序列是上升的。
ACM算法日常
2018/08/23
1.8K1
☆打卡算法☆LeetCode 128. 最长连续序列 算法解析
链接: 128. 最长连续序列 - 力扣(LeetCode) (leetcode-cn.com)
恬静的小魔龙
2022/08/07
2580
☆打卡算法☆LeetCode 128. 最长连续序列  算法解析
最长回文子串——马拉车算法
针对最长回文子串相关的问题,马拉车算法应该是比较通用的解法,今天我们就来具体看看这个算法。
健程之道
2020/03/11
7840
最长公共子串- LCS 算法
 LCS (Longest Common Subsequence) 算法 已知字符串str1="网站高并发解决方案",str2="如何解决网站高并发",如何字符串最长公共子串? lcs 算法原理
仙士可
2020/10/29
1.1K0
Redis 为何使用近似 LRU 算法淘汰数据,而不是真实 LRU?
在《Redis 数据缓存满了怎么办?》我们知道 Redis 缓存满了之后能通过淘汰策略删除数据腾出空间给新数据。
码哥字节
2022/05/26
5070
Redis 为何使用近似 LRU 算法淘汰数据,而不是真实 LRU?

相似问题

给定节点的最长路径近似算法

10

最长公共间隔(重排LCS)的快速算法

20

图算法,近似算法

10

Set算法近似

17

矩形近似算法

30
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文