怎么办渴望单身初始化在吉斯。我在春天做以下列方式:
<!-- Scheduler to run the artifact metadata refresher. -->
<bean id="springTest" class="org.springframework.beans.factory.config.MethodInvokingBean"
scope="singleton">
<property name="targetObject" ref="initializer"/>
<property name="targetMethod" value="createScheduler" />
<property name="arguments">
<list>
.... define arguments
/***final Runnable artifactRefresherTask,
final long fixedInitialDelayInSecs,
final int maxRandomScheduledDelayInSecs,
final long schedulePeriodInSecs,
final long awaitTerminationInSecs
**/
</list>
</property>
</bean>
但在吉斯:
如果我这样做:
@Singleton
@Inject
public void provideArtifactRefresherScheduler(
final Runnable artifactRefresherTask,
final long fixedInitialDelayInSecs,
final int maxRandomScheduledDelayInSecs,
final long schedulePeriodInSecs,
final long awaitTerminationInSecs
) {
new StaggeredScheduler(
test" /* name of the scheduler.*/,
StaggeredScheduler.ScheduleStrategy.FIXED_RATE /* scheduler strategy to be used */,
fixedInitialDelayInSecs,
maxRandomScheduledDelayInSecs,
schedulePeriodInSecs,
artifactRefresherTask,
true,
awaitTerminationInSecs);
}
这是行不通的。在吉斯,我希望我的StaggeredScheduler为服务启动尽快实例化。注:StaggeredScheduler构造函数初始化调度的开始(即代码是不是在我的控制)
请建议。
在你的吉斯模块的configure()
方法,类捆绑为一个渴望单。
protected void configure() {
bind(StaggeredScheduler.class).toProvider(StaggeredSchedulerProvider.class).asEagerSingleton();
}
并实施Provider<StaggeredScheduler>
。例如:
public class StaggeredSchedulerProvider implements Provider<StaggeredScheduler> {
@Inject
public StaggeredSchedulerProvider(final Runnable artifactRefresherTask,
final long fixedInitialDelayInSecs,
final int maxRandomScheduledDelayInSecs,
final long schedulePeriodInSecs,
final long awaitTerminationInSecs) {
this.fixedInitialDelayInSecs = fixedInitialDelayInSecs;
this.maxRandomScheduledDelayInSecs = maxRandomScheduledDelayInSecs;
this.schedulePeriodInSecs = schedulePeriodInSecs;
this.artifactRefresherTask = artifactRefresherTask;
this.awaitTerminationInSecs = awaitTerminationInSecs;
}
public StaggeredScheduler get() {
new StaggeredScheduler(
"test", /* name of the scheduler.*/
StaggeredScheduler.ScheduleStrategy.FIXED_RATE, /* scheduler strategy to be used */
fixedInitialDelayInSecs,
maxRandomScheduledDelayInSecs,
schedulePeriodInSecs,
artifactRefresherTask,
true,
awaitTerminationInSecs);
}
}
更快速和肮脏的黑客是添加到您的吉斯模块:
@BindingAnnotation
@Retention(RUNTIME)
private @interface PrivateBindingAnnotation {}
protected void configure() {
bind(StaggeredScheduler.class).annotatedWith(PrivateBindingAnnotation.class).to(StaggeredScheduler.class).asEagerSingleton();
}
@Provides
@Singleton
public StaggeredScheduler provideArtifactRefresherScheduler(
final Runnable artifactRefresherTask,
final long fixedInitialDelayInSecs,
final int maxRandomScheduledDelayInSecs,
final long schedulePeriodInSecs,
final long awaitTerminationInSecs) {
new StaggeredScheduler(
test" /* name of the scheduler.*/,
StaggeredScheduler.ScheduleStrategy.FIXED_RATE /* scheduler strategy to be used */,
fixedInitialDelayInSecs,
maxRandomScheduledDelayInSecs,
schedulePeriodInSecs,
artifactRefresherTask,
true,
awaitTerminationInSecs);
}
在这两种情况下,你需要确保你实际上是能够注入所需的值到供应方或@Provides
方法。