当前位置: 首页 > 面试题库 >

Spring Async Uncaught Exception处理程序

鞠鸿雪
2023-03-14
问题内容
@Override
@Async
public void asyncExceptionTest() {
    int i=1/0;
}

如何使用Spring
Async框架记录此日志,而不必尝试尝试每种异步方法?它似乎并没有DefaultUncaughtExceptionHandler像正常的那样通过。


问题答案:

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

以下代码实现了此模式。标记为的任何方法@Async都将使用Executormethod 的返回值public Executor getAsyncExecutor()。这将返回,HandlingExecutor它会处理所有日志记录(在这种情况下,它仅显示单词“
CAUGHT!”,但您可以将其替换为日志记录。

@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!");
    }
}


 类似资料:
  • 我正在使用带有thymeleaf的Spring Boot,我所有的资源都在Spring应用程序之外的路径上,例如。在dev env上应该使用url解析路径,并且live env继续路径。 为什么资源处理程序不处理这些类型的资源,但是如果我处理没有问题?我错过了什么吗? 编辑:如果是并且位置是url也没有被处理

  • 问题内容: 我试图在Go中启动一个HTTP服务器,该服务器将使用自己的处理程序来提供自己的数据,但与此同时,我想使用默认的http FileServer来提供文件。 我在使FileServer的处理程序在URL子目录中工作时遇到问题。 该代码不起作用: 我期望在localhost:1234 / files /中找到本地目录,但是它返回一个。 但是,如果我将文件服务器的处理程序地址更改为/,它将起作

  • 一个预处理器只是一些代码,运行在加载书之后,和渲染之前,允许您更新和改变本书。可能的用例是: 创建自定义帮助程序{{#include /path/to/file.md}} 更新链接[some chapter](some_chapter.md)自动更改为[some chapter](some_chapter.html),这是 HTML 渲染器功能 用 latex 样式($$ \frac{1}{3}

  • 我试图在db数据配置中使用jndiName属性。xml。这在tomcat中非常有效。然而,在websphere中存在问题。 引发以下异常 确保J2EE应用程序不会在静态代码块内或该J2EE应用程序创建的线程中对“java:”名称执行JNDI操作。此类代码不一定在服务器应用程序请求的线程上运行,因此“java:”名称上的JNDI操作不支持这些代码。[根异常是javax.naming.NameNotF

  • 我正在尝试使用多个处理器类在处理器步骤中处理记录。这些类可以并行工作。目前我已经编写了一个多线程步骤,其中我 设置处理器类的输入和输出行 提交给遗嘱执行人服务 获取所有未来对象并收集最终输出

  • 调用存储引擎的第1个方法是调用新的处理程序实例。 在存储引擎源文件中定义handlerton之前,必须定义用于函数实例化的函数题头。下面给出了1个来自CSV引擎的示例: static handler* tina_create_handler(TABLE *table); 正如你所见到的那样,函数接受指向处理程序准备管理的表的指针,并返回处理程序对象。 定义了函数题头后,用第21个handlerto

  • 主要内容:1. 查看正在运行的进程列表,2. 杀死/终止一个进程,3. 启动一个新的过程在本章中,我们将讨论批处理脚本中涉及的各种进程。 1. 查看正在运行的进程列表 在批处理脚本中,可以使用命令来获取系统中当前正在运行的进程的列表。 语法 以下是命令的选项的说明。 /S system - 指定要连接的远程系统。 /U [domain]user - 指定命令应在其下执行的用户上下文。 /P [password] - 指定给定用户上下文的密码。 提示输入,如果省略。 /M [modul

  • 主要内容:面向读者,前提条件,问题反馈批处理脚本存储在简单的文本文件中,其中包含按顺序依次执行的命令。 脚本是一种可以通过自动化这些命令序列,用来减轻重复执行命令的方法,以便让自动化工作更容易和更高效。 本教程将讨论学习批处理脚本的基本功能以及相关示例,以便于理解。 面向读者 本教程已经为初学者准备了解批处理脚本的基本概念。 前提条件 如果有计算机程序设计和概念,例如变量,命令,语法等是将对学习本教程有帮助。 问题反馈 我们不能保证您