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

Spring任务执行器和调度器

索瀚海
2023-03-14

我无法找到必要的信息,无论是在文档中还是在这里已经存在的问题中,这就是为什么我自己创建了一个(我还不能在类似的帖子下提问)。

我需要知道的是Spring任务执行器和调度器之间的关系。我当前的配置如下所示:

<task:executor
        id="executor"
        pool-size="1-2"
        queue-capacity="50"
        rejection-policy="CALLER_RUNS"
/>
<task:scheduler id="scheduler" pool-size="2"/>

<task:scheduled-tasks scheduler="scheduler">
    <task:scheduled ref="task1" method="methodInTask1" cron="0 1/5 * ? * *"/>
    <task:scheduled ref="task2" method="methodInTask2" cron="0 0/5 * ? * *"/>
</task:scheduled-tasks>

我不确定的是它是如何工作的。“谁”运行我的任务?是调度器,因为任务是和他一起安排的吗?或者调度器只是创建它们,放在队列中,由执行者运行它们?

如果没有,运行的是scheduler,我必须在特定类及其方法上方创建注释,以便executor启动它们?

对于它们是如何相关的,没有明确的解释,在留档中,对于“池大小”也没有,但至少在其他问题中可以找到。如果运行任务的调度程序在这个配置中是多余的执行程序吗?

共有1个答案

邵弘伟
2023-03-14

您的问题在文档中得到了很好的解决(有关完整的行为方面,请参阅本节)

回答你的具体问题

“谁”负责我的任务?是调度程序吗,就像他安排的任务一样?或者调度器只是在创建它们,将它们放入队列中,然后excutor运行它们?

调度程序命名空间创建一个ThreadPoolTaskScheduler的实例,该实例能够处理任务执行本身(因为它实现了AsyncTaskExecitor)。因此,调度程序在没有执行器帮助的情况下自己执行任务。

没有明确的解释它们是如何联系在一起的

调度器和执行器之间没有这样的关系,只是它们都实现了异步执行任务的AsyncTaskExecutor(另一方面,执行器名称空间创建了ThreadPoolTaskExecutor的一个实例)

两者都不适用于“池大小”

本节将为您提供相关详细信息。

如果运行任务的是调度程序,则此配置中的执行程序是否冗余?

仅当您计划在应用程序中使用计划任务时,它才是冗余的,否则它将用于标记为@Async的任何任务。

希望这回答了你的疑问,如果需要更多信息,请在评论中告知。

 类似资料:
  • 在上下文中没有Executor bean的情况下,Spring Boot会自动配置一个具有合理默认值的ThreadPoolTaskExecutor,这些默认值可以自动与异步任务执行(@EnableAsync)和Spring MVC异步请求处理相关联。 如果您在上下文中定义了自定义Executor,则常规任务执行(即@EnableAsync)将透明地使用它,但不会配置Spring MVC支持,因为它

  • 每隔一段时间需要调度任务执行,也许你想注册一个任务在客户端完成连接5分钟后执行,一个常见的用例是发送一个消息“你还活着?”到远端通,如果远端没有反应,则可以关闭通道(连接)和释放资源。 本节介绍使用强大的 EventLoop 实现任务调度,还会简单介绍 Java API的任务调度,以方便和 Netty 比较加深理解。 使用普通的 Java API 调度任务 在 Java 中使用 JDK 提供的 S

  • 我使用spring调度器任务在固定间隔后调用类中的方法,如下所示 一旦调度程序触发init方法。init方法将使用线程池执行器来执行队列中的所有作业。 问题:执行init方法的初始线程是否会等待init方法中的所有处理(由executor service通过生成新线程来完成)完成? 调度器任务的池大小属性仅用于触发任务,而不是用于执行或处理被触发任务内部的逻辑。

  • 我需要帮助设计基于多线程的应用程序,包括动态url创建和线程处理。 我在我的应用程序中使用了一个Spring调度器,它每30秒调度一次。从这个调度方法中,我调用了一些基于服务的api,它在循环中,而且我需要每个API有一个线程池执行器,上面有一个线程处理。 由于这个过程是从计划方法开始的,所以每次创建新的线程池时,这就是问题所在。你可以在代码中看到。 我想要的是,如果对于任何一个应用编程接口,如果

  • 问题3:如果我使用@Schedured(initaildelay=10000,fixedrate=20000)而不是@PostConstruct注释,它将解决第一个问题,但是它将每20秒执行一次我的作业。 有线索吗?