簡體   English   中英

Spring @Scheduled批注和Singleton類

[英]Spring @Scheduled annotation and Singleton class

我創建了一個具有默認(Singleton)范圍的類的bean。 在課堂上,我有一個計划每小時運行一次的方法。

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,因為它是在singleton范圍內創建的。 如果應用程序當前正在運行hourlyReportTask(),並且Spring容器啟動了一個后台調度線程以同時運行hourlyReportTask(),將會發生什么。 它會等待來訪問TaskService實例嗎?

Spring Singleton,並不代表您對Design Patterns Singleton的期望。 在Spring中,Singleton意味着一個bean僅創建了一個實例(並不意味着不能創建另一個實例),並且在Spring需要該類型時將使用該實例。

在您的情況下,您的hourlyReportTask()方法將執行兩次。

應用程序和計划服務都使用完全相同的實例。 沒有同步,因此調度服務可以在您的應用程序調用它時運行該方法。

與將TaskService注入可以同時被多個線程訪問的東西幾乎相同的方式,這些線程同時調用該方法。

@Scheduled后面沒有任何黑魔法:它以與手動方式相同的方式調用您的方法。 如果該方法不是線程安全的,則需要回退Java中的常規同步機制(例如,通過將synchronized關鍵字添加到方法聲明中)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM