2011-12-19 52 views
1

從這樣的工作,我做:從@OnApplicationStart作業啓動作業可以嗎?

@OnApplicationStart 
public class Bootstrap extends Job { 
    Foo foo = new Job<Foo>() { 
    ... 
    return new Foo(); 
    }.now().get(); 
} 

而且我發現內部工作永遠不會執行,將應用程序死鎖,因爲它在get()塊。

我在開發模式下運行Play 1.2.4。這項工作被提交到JobsPlugins.executor,它被初始化爲10個線程 - 綽綽有餘。我嘗試在Job.now()內的Callable中放置一個斷點 - 該斷點從未被擊中。

+0

爲什麼你有一個作業中作業的執行順序?爲什麼不用@onapplicationstart註釋兩個作業 – Codemwnci 2011-12-19 11:41:24

+0

@Codemwnci - 我試圖重用一段已經寫成作業並在別處使用的代碼。作爲一種解決方法,我將普通邏輯提取到了常規方法而不是作業,所以我得到了這個工作 - 但是,我想知道是否支持從另一個作業(特別是在啓動時)調用作業,或者如果不支持, 爲什麼不。 – ripper234 2011-12-19 11:56:16

回答

2

是的,它被支持和運作良好。這樣做的原因之一可能是控制作業執行的順序。

我的應用程序,只有BootstrapJob標註有@OnApplicationStart和控制

public void doJob() { 

    if (User.count() == 0) 
     Fixtures.loadModels("user-data.yml"); 

    Logger.info("Starting synchronous jobs."); 
    new StaticDataJob().doJob(); 

    Logger.info("Starting asynchronous jobs."); 
    new TransactionJob().now(); 
    new ReportJob().now(); 

     Logger.info("Boostrap job complete."); 
} 
+0

如果您在調用作業之後添加'.get()',您是否遇到與我遇到的掛鉤相同的掛鉤?我明白我可以打電話給doJob()跳過整個異步問題,只是想知道。 – ripper234 2011-12-19 13:07:25