【问题标题】:Is it thread-safe to run multiple CommandLineRunner at same time via Spring Boot?通过 Spring Boot 同时运行多个 CommandLineRunner 是否线程安全?
【发布时间】:2021-03-22 03:44:35
【问题描述】:

我有一个旧应用程序(从 main() 方法开始的简单 Java 文件)由 4-5 个 autosys 作业同时调用,并传递不同的参数。

现在,我已将此应用程序重构为使用 Spring Boot CommandLineRunner。我只更改了启动文件以使用spring boot对其进行升级。

问题:如果我的 autosys 作业同时调用此应用程序 5 次并传递不同的参数,这会产生任何问题吗?线程执行或对象或任何其他冲突的任何问题?

我在任何地方都找不到我的答案..尽管据我所知,所有这 5 个调用都应该创建不同的 JVM 并从 CommandLineRunner 执行 spring bean。他们应该被分开对待......

来自 autosys 的调用很简单 “Java -jar javaApp.jar arg1 arg2

需要您的专业建议。 感谢您的快速帮助。

【问题讨论】:

  • 如果你确定你没有做任何会导致多个实例相互影响的事情(改变共享资源?)那么理论上它们不应该相互影响。当然,如果他们使用大量 RAM 或磁盘(用于临时),或者比机器提供的 CPU 更多,它们可能会相互影响,但不会以无法通过修复瓶颈来解决的方式。
  • 你对我来说很有意义。当然,它们都不是资源密集型的。我认为每个命令行运行程序在被调用时都应该在它的 JVM(独立内存)中执行,因此 spring 容器中的对象应该是独立的。我说的对吗?

标签: java spring-boot


【解决方案1】:

如果您在 Spring 应用程序中创建了不同的 CommandLineRunner 类,则 Spring 在主线程中按顺序运行它们。不涉及其他线程。运行程序几乎是应用程序初始化的最后一步。我碰巧知道这一点,因为它最近对我正在做的事情很重要,所以我查看了源代码。

要亲自查看这一切,您所要做的就是在您的一个跑步者的开头放置一个断点,然后查找调用堆栈。你会看到你正上方的跑步者的循环,你会看到堆栈的底部包含你的应用程序的main()。与 Spring 源代码的许多冒险不同,这一次非常简单。我建议你这样做,如果你能看到它是多么简单。

在上述情况下,听起来你在 Spring 中所拥有的与你之前所拥有的并没有真正的区别……当然,除了你对自己的逻辑所做的改变。 Spring 不会在这里增加任何复杂性。

正如@MrR 所说,如果您同时运行应用程序的多个副本,您可能遇到的唯一问题是争用外部资源。但是你也会有那些使用旧代码的。 Spring 在这里也没有引入任何新东西。

【讨论】:

    猜你喜欢
    • 2017-05-26
    • 1970-01-01
    • 1970-01-01
    • 2011-05-20
    • 2017-02-02
    • 1970-01-01
    • 1970-01-01
    • 2017-11-12
    • 1970-01-01
    相关资源
    最近更新 更多