Java @Scheduler是否启动新线程?

Java @Scheduler是否启动新线程?,java,spring,jakarta-ee,log4j,Java,Spring,Jakarta Ee,Log4j,我有一个Spring应用程序,它有几个预定的方法 Lo4J似乎停止滚动到新文件,并在应用程序运行一段时间后增长到10GB 所有配置看起来都很好,我只使用notepad++打开日志文件(这意味着编辑器不会锁定日志文件) 因此,我认为应用程序中可能会运行另一个线程。我不记得当前应用程序中的任何多线程实现 那么是否有可能是@Scheduled方法导致了问题?它应该使用由配置的线程池分配的一个线程。每次执行一个计划任务时,都会拾取该线程,一旦任务完成,该线程将被释放回池中。日志记录的数量取决于任务的运行

我有一个Spring应用程序,它有几个
预定的
方法

Lo4J似乎停止滚动到新文件,并在应用程序运行一段时间后增长到10GB

所有配置看起来都很好,我只使用notepad++打开日志文件(这意味着编辑器不会锁定日志文件)

因此,我认为应用程序中可能会运行另一个线程。我不记得当前应用程序中的任何多线程实现


那么是否有可能是
@Scheduled
方法导致了问题?

它应该使用由配置的线程池分配的一个线程。每次执行一个计划任务时,都会拾取该线程,一旦任务完成,该线程将被释放回池中。日志记录的数量取决于任务的运行频率和日志语句的数量。因此,除非有大量的日志记录,否则这可能不是你的问题

您应该在调度程序配置中使用类似的方法来确定池大小。您的池大小还应该由计算机上的可用线程决定。核心数、每个核心的线程数、JVM数等

<task:annotation-driven scheduler="taskScheduler"/>
<task:scheduler id="taskScheduler" pool-size="2"/>

@Scheduled
导致代码在单独的线程中运行,不一定是新的,因为它可能来自线程池

日志文件的非滚动发生是因为当log4j尝试重命名文件以进行滚动时,某个应用程序线程正在该时刻记录到该文件

根据log4j滚动文件实现的代码,当滚动时间到来时(
rollover()
methodcalled),尝试重命名文件

如果文件被锁定,则不会发生滚动,并且log4j继续使用相同的文件,直到下次触发滚动策略并再次尝试重命名为止

因此,
@Scheduled
注释可能是造成这种情况的原因,但它可能不是唯一的原因,例如,如果它是一个web应用程序,则可能会有大量的请求,等等

要降低翻滚失败的可能性,请尝试将
@计划的
线程更改为在与翻滚尝试发生时不同的时刻运行


此外,将日志记录级别降低到
ERROR
将降低翻滚失败的可能性。另请参见。

所有配置看起来都很好…
除非您向我们展示,否则我们不知道这一点-P
@Scheduled
标记一个方法,以便Spring根据您的配置在单独的线程中使用
ExecutorService
执行该方法。我不知道这会对日志记录有什么影响。谢谢。日志配置问题是[,在我修复编码后,它仍然存在问题(在一个大文件中增长),我猜如果有多个线程写入日志而没有进行适当的同步,那么如果两个线程写入同一个日志……我猜这就是为什么会发生这种情况?