2013-01-17 17 views
0

请考虑Tapestry项目中的AppModule挂毯:使用@Startup和@Order注释的启动顺序

我想订购必须在系统启动时调用的动作序列。

考虑,我有两个简单的动作:

1)动作,必须先走:

@Startup 
public static void initMyApplication(Logger logger, LiquibaseService liquibaseService) { 
    logger.info("Updating database by liquibase service..."); 
    liquibaseService.update(); 
    logger.info("update-db done."); 
} 

2),第二个:

@Startup 
@Order("after:LiquibaseService") 
public static void doSomeChecks(HibernateSessionManager hsm) { 
    ... 
} 

我无法理解(甚至在阅读文档后):如何使用@Order注释来指定这些操作的顺序?

更具体地说:我需要指出什么@Order("after:<HERE>)

看来,这就像建筑:

@Order("after:LiquibaseService")

@Order("after:initMyApplication")

不起作用。其实我的startup行动是以任意顺序调用的。

回答

1

我不认为@Order可以与@Startup一起使用,但您可以使用contributeRegistryStartup。因为它预计OrderedConfiguration您可以订购您的贡献。

public class MyModule1 
{ 
    public static void contributeRegistryStartup(OrderedConfiguration<Runnable> configuration) 
    { 
    configuration.add("MyFirstContribution", new Runnable() { ... }); 
    } 
} 

public class MyModule2 
{ 
    public static void contributeRegistryStartup(OrderedConfiguration<Runnable> configuration) 
    { 
    configuration.add("MySecondContribution", new Runnable() { ... }, "after:MyFirstContribution"); 
    } 
} 
+0

是的我知道'contributeRegistryStartup'方法。但我不明白,我怎么能注入那些匿名的'Runnable'对象所需的服务实例,就像我对我的方法'initMyApplication'(我的意思是服务'LiquibaseService'的实例,虽然它只是一个例子)。如果你可以给我这样的例子,它会+1和检查:) – Andremoniy

+0

我已经回答了这个[这里](http://stackoverflow.com/a/14380863/570692) – Tawus

+0

是的,它实际上工作,我检查它。谢谢,这是一个有趣的决定。 – Andremoniy