2012-03-30 72 views
2

我有一種方法,它實際上是一個調度程序,它每隔一小時運行一個進程並每小時創建一個日誌文件。
我想在應用程序生命週期中調用一次這個方法,所以我從一個靜態塊中調用它。
但我覺得這是行不通的,因爲這個文件有時會在一小時內產生,有時甚至會產生。我聽說靜態塊只能執行一次,這是不是真的?
如果是,我應該怎麼做?方法應該在其生命週期中調用一次,並且只調用一次

+0

您是否在使用應用程序容器?像Weblogic這樣的容器可以讓你定義啓動任務,讓你在沒有類加載器的情況下執行任務(正如jabal所說的)。 – 2012-03-30 11:22:43

回答

2

當類加載器加載類時,靜態初始化塊只執行一次。他們執行的時間與你的應用程序邏輯緊密相關。更精確地說,不同的類加載器可能會加載你的類,因此理論上可以執行多個靜態塊。

爲了進行調度,可以嘗試使用開箱即用的調度程序庫,例如Quartz調度程序。 (http://quartz-scheduler.org)這可能看起來是第一次開銷,但是這些庫提供了最終可能需要的高級功能。只是一個簡單的例子:如果您的程序在一個小時內停止並重新啓動,該怎麼辦?然後這個過程可能會在這個特定的小時內運行兩次。使用石英,你也可以處理這種情況。

+0

謝謝你的Jabal的,但我用的石英schedulr,之後面臨這樣的問題:) – 2012-03-30 11:17:55

+0

也許你應該提出關於石英問題不同的問題呢。可能你沒有正確使用,因爲它是數以百萬計的高質量產品。我很確定社區可以幫助你。 – jabal 2012-03-30 11:27:44

-1

靜態方法並不意味着它只運行一次。靜態意味着它可以訪問外部方法而不需要實例化類的實例。

最好的解決方案關閉我的頭頂。有一個靜態變量,所以它可以與你的靜態方法一起刷新,並且一旦該方法被執行就增加該靜態變量。每次執行此方法時,檢查該變量並立即退出,如果它已經增加。

+0

靜態塊不是一個靜態方法 – jabal 2012-03-30 10:39:28

+0

我相信,我引用'我有一個方法',這是OP在這裏陳述的第一件事。 – Churk 2012-03-30 10:42:06

+0

我同意你的解決方案,但有兩條評論:a)你的第一段看起來不對,問題在於指靜態代碼塊,而不是靜態方法。 b)什麼是*靜態類*? – nwinkler 2012-03-30 10:42:47

1

你也需要一個變量。

class ... 

    private static hasRun = false; 

    public static synchronize boolean runOnce() 
    { 
    if (hasRun) return false; 

    hasRun = true; 
    // do something 
    return true; 
    } 

當沒有使用此類時,可能永遠不會調用靜態塊。

有一個關於卸載類 Unloading classes in java?

卸貨時發生的類不是多裝載有可能比靜態初始化的多個呼叫可能發生的討論。但是,在這種情況下,我的解決方案將失敗,因爲在這種情況下,任何解決方案都必須失敗

我覺得這是非常罕見的,不太可能。但是,當你不控制環境時,也許你必須要處理這個問題

+0

靜態塊不是一個靜態方法 – jabal 2012-03-30 10:39:44

+0

這是正確的,但一個靜態塊是在類被使用時執行。這個問題聽起來並不是要求這個 – 2012-03-30 10:42:59

+0

他說:「所以我把它放在靜態塊中。」 – jabal 2012-03-30 10:44:19

相關問題