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

Spring靴。如何创建带注释的TaskExecutor?

仉英朗
2023-03-14

我在Spring Boot应用程序中使用应该异步运行的方法之一做了一个@Service类。因为我读的方法应该是@Async注释,而且我还必须运行一个TaskExecatorbean。但是在Spring手册中http://docs.spring.io/spring/docs/current/spring-framework-reference/html/scheduling.html我没有找到任何信息或示例,如何在没有XML配置的情况下使用注释运行TaskExec导师。有没有可能在Spring Boot中创建TaskExec导师bean而不使用XML,只使用注释?这里我的服务类:

@Service
public class CatalogPageServiceImpl implements CatalogPageService {

    @Override
    public void processPagesList(List<CatalogPage> catalogPageList) {
        for (CatalogPage catalogPage:catalogPageList){
            processPage(catalogPage);
        }
    }

    @Override
    @Async("locationPageExecutor")
    public void processPage(CatalogPage catalogPage) {
        System.out.println("print from Async method "+catalogPage.getUrl());
    }
}

共有3个答案

龙洛城
2023-03-14

更新:从Spring Boot 2.2开始,不需要通过代码创建ThreadPoolTaskExecutor,因为ThreadPoolTaskExecutor是默认值,可以使用前缀为Spring的属性完全配置。任务执行

因此,以下步骤:

  1. @配置-注释类中使用@EnableAsync

属性示例:

spring.task.execution.pool.core-size=1
spring.task.execution.pool.max-size=20
spring.task.execution.pool.keep-alive=120s
spring.task.execution.pool.queue-capacity=1000
spring.task.execution.shutdown.await-termination=true
spring.task.execution.shutdown.await-termination-period=5m
spring.task.execution.thread-name-prefix=async-executor-
spring.task.execution.pool.allow-core-thread-timeout=false

如果需要更多的定制,还可以实现TaskExecutorCustomzer接口,例如(在kotlin中):

@Component
class AsyncExecutorCustomizer : TaskExecutorCustomizer {
    override fun customize(taskExecutor: ThreadPoolTaskExecutor?) {
        taskExecutor?.let { executor ->
            executor.setRejectedExecutionHandler(ThreadPoolExecutor.CallerRunsPolicy())
        }
    }
}
孔征
2023-03-14

首先–让我们回顾一下规则-@Async有两个限制:

  • 它只能应用于公共方法
  • 自调用——从同一个类中调用异步方法——将不起作用

因此,processPage()方法应该在单独的类中

马华茂
2023-03-14

添加一个@Bean方法到Spring Boot应用程序类:

@SpringBootApplication
@EnableAsync
public class MySpringBootApp {

    @Bean
    public TaskExecutor taskExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(5);
        executor.setMaxPoolSize(10);
        executor.setQueueCapacity(25);
        return executor;
    }

    public static void main(String[] args) {
        // ...
    }
}

请参阅Spring框架参考文档中基于Java的容器配置,了解如何使用Java配置而不是XML配置Spring。

(注意:你不需要添加@Configuration到类中,因为@SpringBootApplication已经包含了@Configuration)。

 类似资料:
  • 问题内容: 我在Spring Boot应用程序中使用一种应该异步运行的方法来做一个类。当我阅读方法时,应该加上注释,而且我还必须运行一个bean。但是在Spring手册http://docs.spring.io/spring/docs/current/spring- framework- reference/html/scheduling.html中, 我找不到任何信息或示例如何在没有XML配置的

  • 问题内容: 我正在尝试做一些Java注释魔术。我必须说,我仍在追赶注释技巧,并且某些事情对我来说还不太清楚。 所以…我有一些带注释的类,方法和字段。我有一个方法,它使用反射对类进行一些检查并将一些值注入到类中。这一切都很好。 但是,我现在面临的情况是我需要一个注释实例(可以这么说)。所以…批注与常规接口不同,您不能对类进行匿名实现。我知道了。我在这里浏览了有关类似问题的一些帖子,但似乎无法找到所需

  • 问题内容: 是否存在列注释语法,该语法允许我直接在创建表语句(即,内联)中声明列的位置指定列注释?该11克规范没有提到任何东西,在另一页中提到的东西,但我无法得到它的工作。创建表后有一种指定注释的方法,但是我认为将注释与字段定义分开很烦人。我正在寻找这样的东西(不起作用): 问题答案: 恐怕“烦人”的语法是这样做的唯一方法。SQL Server,PostgreSQL和DB2使用相同的语法(尽管据我

  • 我试图创建一个使用的组合注释,但是我似乎无法使其工作。 这是有效的(使用): 但是,直接使用不起作用(大概是由于只允许在方法上使用): 无法将用作可组合注释吗?

  • 我需要处理从带有注释的类的公共方法中抛出的所有异常。我尝试使用Spring AOP。这是我的记录器: 是我的注释。 然后,我将注释添加到我的配置类中。 首先,我尝试注释一些引发异常的方法。它工作得很好,但是我如何才能使这种工作用于用注释注释的类中的所有公共方法呢?

  • 我有两个项目。我用Angular2 cli构建的Angular2应用程序和只为Angular2应用程序服务的Spring Boot应用程序。我用构建Angular2应用程序,它会生成一个文件夹。然后,我将文件夹的内容放在Spring Boot应用程序的中。 我的Spring启动应用程序有两个文件。 Spring Boot应用程序类: 及其应用。属性文件: 它工作得很好,但是如果我转到一个url并点