2011-12-19 5 views
1

От такой работы, я делаю:Можно ли запускать задания из задания @OnApplicationStart?

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

И я считаю, что внутренняя работа никогда не выполняется, в результате чего приложение в тупик, потому что блоки на get().

Я запускаю Play 1.2.4 в режиме Dev. Задача представляется в JobsPlugins.executor, которая инициализирована, чтобы иметь 10 потоков - более чем достаточно. Я попытался поставить точку останова в Callable внутри Job.now() - эта точка останова никогда не попадает.

+0

почему у вас есть работа в рамках работы? Почему не просто два задания, аннотированные с помощью @onapplicationstart – Codemwnci

+0

@Codemwnci - Я пытаюсь повторно использовать фрагмент кода, который уже написан как задание и используется в другом месте. В качестве обходного пути я извлек общую логику для обычного метода вместо задания, поэтому я получил эту работу - все же, я хотел бы знать, поддерживается ли вызов задания из другого задания, особенно при запуске, или если нет , почему нет. – ripper234

ответ

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

Смежные вопросы