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

Spring@Async失败并拒绝执行异常

贲宜春
2023-03-14

我们需要并行运行任务,所以我们使用Spring@Async功能。为了提供执行器配置,我们正在创建一个执行器bean。

@Bean(name = "async")
    public Executor threadPoolTaskExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(2);
        executor.setMaxPoolSize(2);
        executor.setQueueCapacity(5);
        executor.setThreadNamePrefix("MyExecutor-");
        executor.initialize();
        return executor;
    } 

一旦并行任务的数量超过maxpoolSize队列大小,下一个任务提交就会失败,并出现rejectedExecutionexception。

为了克服这一问题,我们从源html" target="_blank">代码研究了调用方中止策略:https://www.baeldung.com/java-rejectedexecutionhandler它提供了在队列和线程已满的情况下,主线程本身运行任务的功能。

设置需要:executor。setRejectedExecutionHandler(新的ThreadPoolExecutor.CallerRunPolicy());

Q1.我需要了解的是,ThreadPoolTaskExecator使用的是LinkedBlock队列,我的期望是,一旦最大池线程和队列大小已满并被占用,主线程将被阻塞,同时提交一个新任务,但相反,它是失败的拒绝例外,即使阻塞队列是目前在ThreadPoolTaskExec导师?

问题2。为了克服这一问题,我们如何实现一种阻塞机制,使main在提交新任务时不会失败,也不会自行运行(如executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunPolicy()),但会阻塞队列中的可用空间以将任务放入队列?

共有1个答案

荀豪
2023-03-14

无限期地阻塞主线程可能会导致死锁情况。这就是为什么要为应用程序用户提供一个处理程序,以决定当线程池队列容量超过时应该采取什么行为。

正如下面的线程中所讨论的,可以实现所需阻塞行为的各种实现,但应该注意阻塞的时间和其他死锁场景。

队列已满时ThreadPoolExecutor块?

 类似资料:
  • 我在jetty异步超文本传输协议客户端上运行以下程序。 我得到的错误是 请在这方面帮助我摆脱错误::

  • 我有一个多项目gradle构建,Spring Boot按照默认gradle约定进行结构化。 我目前的项目是(A)将gradle从5. x升级到7.3. x,(B)使用带有Spring Boot的嵌入式Tomcat。 这是一个已经存在很多年的项目,是Spring Boot,但是传统上一直作为一个战争文件部署在Tomcat中。 我已经按照gradle迁移指南将gradle升级到7.3.3,并正确构建了

  • 问题内容: 我正在尝试运行elasticsearch,并使用以下命令尝试放置数据- 但我收到以下错误- 我试图通过增加队列大小- 但是我仍然遇到同样的错误。 问题答案: 您遇到的问题是因为 批量操作队列 已满。 节点ES具有许多线程池,包括通用线程,搜索线程,索引线程,建议线程,批量线程等。在您的情况下,问题在于批量操作队列已满。 尝试调整批量操作的线程池的队列大小: 或减少一次发送的批量操作数量

  • 我正在使用默认配置,同时添加在我的ubuntu 12.04计算机上安装了nginx的特定目录。 我只需要一个简单的静态nginx服务器来提供该目录之外的文件。但是,请检查我明白了 我已经在上完成了,我已经将它们设置为。我不知道还需要设置什么。

  • 我使用Java连接MySQL和Json将数据发送到android,当我通过URL地址将数据从Java发送到Json时: 一切都很好,但是当我在Android中解析数据时,我收到了一个错误结果,如下所示: logcat: (192.168.1.221)IP地址是我的PC机,如果我从192.168.1.221更改为本地主机,我仍然会收到相同的错误。

  • 无法执行目标org.apache.maven.plugins:maven-compiler-plugin:3.1:在项目gameoflife上编译(default-compile)-core:编译失败[错误]此环境中未提供编译器。也许您运行的是JRE而不是JDK? 我已经在我的机器上安装了Java,但仍然面临这个问题。 我在做EC2。