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

Spring Boot-将排定的作业作为单独的进程运行

韦安怡
2023-03-14

我怀疑存在性能问题,特别是当长时间运行的API击中控制器时。

// Heavy Job
@Scheduled(fixedRate = 10000)
public void processAlerts(){
}


@Scheduled(fixedDelayString = "${process.events.interval}")
public void triggerTaskReadiness() throws IOException {
    log.info("Trigger event processing job");
}
// Heavy Job to process data from different tables.
@Scheduled(fixedDelayString = "${app.status.interval}")
public void triggerUpdateAppHealth() throws IOException {
    log.info("Trigger application health");
}

是否可以将作业作为单独的进程。让spring boot应用程序具有繁重工作的最佳实践是什么。

共有1个答案

寇鸿
2023-03-14

这个问题太笼统了,伊莫。这完全取决于你的资源和工作具体做什么。

Spring boot提供了一个通用的调度机制,但并不对作业的性质做任何假设。

总而言之,当您运行一个繁重的作业时,会消耗CPU、网络、I/O和任何资源(同样,这取决于您的作业的实际代码)。

  1. 看起来像是处理数据库的作业。在这种情况下,Spring boot支持与数据源、连接池、事务管理、更高级别的API(如JPA)甚至Spring数据的集成,您还可以插入Jooq这样的框架。最重要的是,它使数据库的实际工作变得容易得多。

您已经在question标记中说明了Mongodb-嗯,spring也在spring数据中集成了Mongodb。

底线如果您在一个外部进程中运行该作业,您就有点依赖自己(这并不意味着它不能完成,它只是意味着您失去了spring袖子上的所有好处)

AppHealth-spring boot已经提供了一个具有db healthendpoint的执行器特性,它还提供了一种创建您自己的endpoint以检查任何具体资源的健康的方法(您用代码实现它,这样您就可以自由地检查任何您想要的资源)。确保您在正确的工作中使用了正确的工具。

关于控制器API。如果您运行的是传统的spring mvc,那么tomcat有一个线程池来为API服务,所以从线程管理的角度来看,job的线程不会与controller的线程竞争,但是它们很可能共享同一个db连接,这样就会成为瓶颈。

关于@schedule的实现。默认情况下,将有一个线程为所有@schedule作业提供服务,这可能不够。

您可以通过创建自己的TaskScheduler来更改此行为:

@Bean(destroyMethod = "shutdown")
public Executor taskScheduler() {
    return Executors.newScheduledThreadPool(10); // allocate 10 threads to run @Scheduled jobs
}

您可能有兴趣阅读这篇讨论

Spring@schedule总是在一个Spring托管应用程序上下文的“边界”内工作。因此,如果您决定扩展实例,则每个实例都将运行“计划的”代码并执行繁重的作业。可以使用Quartz来集成spring。在集群模式下,您可以将其配置为每次选择一个节点并执行作业,但由于您计划每秒运行一次,因此我怀疑Quartz是否能工作得足够好。

 类似资料:
  • 问题内容: 我们正在考虑将Jenkins Pipeline插件用于一个相当复杂的项目,该项目由多个交付组成,这些交付需要在合并之前使用不同的工具(在不同的机器上)构建。尽管如此,使用单个进行完整的构建似乎很容易,而且我喜欢Pipeline随附的git分支的自动发现。 但是,在这一点上,我们为每个交货都有工作,并使用基于构建流的“元”工作来协调各个工作。这样做的好处是,如果只进行了很小的更改,它也允

  • 问题内容: 我想清除所有超过1周的SQL数据库,我想每晚进行一次。所以,我要安排一份工作。如何查询mySQL,而不必每次都手动输入密码? PHP中的查询如下: 有没有办法将其作为shell脚本运行?如果没有,有没有一种方法可以使cron运行php文件? 问题答案: 尝试创建如下所示的shell脚本: 然后可以将其添加到cron

  • 我已经创建了一个Python包并在PyPI上发布了它,比如说< code>spamandeggs。这个软件包是跨平台的(Windows、GNU/Linux、MacOSX ),目的是定期(比如每5分钟)向用户更新某些信息。可以从命令行通过命令< code>spamtheeggs运行该包。 以下是我面临的问题: 问题01:如何对通过< code>spamtheeggs命令运行的脚本进行daemoniz

  • 如何将CronTimer迭代器设置为1?或者如何停止排定程序多次执行作业。 有什么建议吗?谢谢,古扬·沙阿。

  • 问题内容: 我需要将php脚本作为守护进程运行(等待说明并执行操作)。cron工作不会为我做这件事,因为需要在指令到达后立即采取措施。我知道由于内存管理问题,PHP并不是守护进程的最佳选择,但是由于种种原因,在这种情况下我必须使用PHP。我遇到了libslack的一个名为Daemon的工具(http://libslack.org/daemon),它似乎可以帮助我管理守护进程,但是最近5年没有任何更

  • Etity公司 服务 Impl @服务公共类DateFMailServiceImpl实现DateFMailService{ } 存储库 @Repository公共接口DateFMailRepository扩展JpaRepository } 邮件分离器 控制器 保存运行程序 我已经纠正了我的问题。我已经在这里粘贴了所有与我的问题相关的代码。对于初学者,我只想将存储库的查询结果输出到控制台。但在我刚刚