java - Spring @Scheduled 注解和 Singleton 类

标签 java spring spring-annotations spring-scheduled

我已经创建了一个具有默认(单例)范围的类的 bean。在类(class)中,我有一个计划每小时运行一次的方法。

public class TaskService implements InitializingBean {

    @Scheduled(cron="0 0 */1 * * ?")
    public void hourlyReportTask()
    {
        ... code here ...
    }

    public void performAllTasks()
    {
        hourlyReportTask();
        ...
        ...
    }

}

我的应用程序配置看起来像这样,

<bean id="reportService" 
            class="com.tasks.TaskService" />

我假设运行计划任务的线程将使用相同的 TaskService bean,因为它是在单例范围中创建的。如果应用程序当前正在运行 hourlyReportTask() 并且 Spring 容器启动后台调度线程以同时运行 hourlyReportTask() 会发生什么。它会等待获取 TaskService 实例的访问权限吗?

最佳答案

您的应用程序和调度服务使用完全相同的实例。由于没有同步,因此调度服务可能会在您的应用程序调用该方法时运行该方法。

与将 TaskService 注入(inject)可由多个线程同时访问的内容中的方式几乎相同,并且这些线程同时调用该方法。

@Scheduled 背后没有黑魔法:它以与手动相同的方式调用您的方法。如果该方法不是线程安全的,则需要使用 Java 中的常规同步机制(例如,将 synchronized 关键字添加到方法声明中)。

关于java - Spring @Scheduled 注解和 Singleton 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22669602/

相关文章:

Java Spring Framework jmx 托管注释@ManagedAttribute 未在 MBeanServerConnection/Jconsole/Visual vm/bean 列表中显示方法

java - Spring - applicationContext getBeansWithAnnotation 方法返回一个空列表

java.lang.NumberFormatException : For input string 异常

java - 返回客户异常对象时更改responseStatusCode

java - Spring-mvc中的JDBC异常处理

spring - 处理将用户名作为 url 一部分的 url 模式

java - spring mvc 模拟存储库

java - 防止 Spring 在一个 Bean 失败时失败

java - 如何在for循环中停止handler.postDelayed?

java - 数据库多重内连接