我在使用应用程序时遇到了一些问题,我使用 Guice 进行注入,其中一些后台任务由 Quartz 处理。
如文档所述,我正在使用 PersistFilter 来处理我的事务并启动我的 JPAService。问题是我的作业第一次执行时,JPAService 还没有启动,我unitOfWork.begin()
抛出了一个异常:
2013-07-01 11:45:05,527 [DefaultQuartzScheduler_Worker-1] ERROR com.foo.core.synchronization.impl.Result.notifyListener(Result.java:65) - Error while notifying synchronization listener
java.lang.NullPointerException
at com.google.inject.persist.jpa.JpaPersistService.begin(JpaPersistService.java:70)
at com.foo.convert.DiscoveryService.parsedElement(DiscoveryService.java:148)
at com.foo.convert.DiscoveryService.parsedElement(DiscoveryService.java:67)
at com.foo.core.synchronization.impl.Result.notifyListener(Result.java:62)
at com.foo.core.synchronization.impl.Synchronizer.synchronize(Synchronizer.java:68)
at com.foo.convert.DiscoveryService.execute(DiscoveryService.java:128)
at org.quartz.core.JobRunShell.run(JobRunShell.java:213)
at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:557)
对该任务的所有下一次调用均成功。我敢打赌,persist 服务还没有启动,所以我尝试注入一个初始化程序:
public class MyInitializer {
@Inject MyInitializer(PersistService service) {
service.start();
}
}
注入此初始化程序时,Quartz 作业立即运行,但第二次PersistFilter
调用service.start()
并且我的 Web 应用程序中断:
SEVERE: Exception starting filter Guice Filter
java.lang.IllegalStateException: Persistence service was already initialized.
at com.google.inject.internal.util.$Preconditions.checkState(Preconditions.java:142)
at com.google.inject.persist.jpa.JpaPersistService.start(JpaPersistService.java:88)
at com.google.inject.persist.PersistFilter.init(PersistFilter.java:77)
at com.google.inject.servlet.FilterDefinition.init(FilterDefinition.java:114)
at com.google.inject.servlet.ManagedFilterPipeline.initPipeline(ManagedFilterPipeline.java:98)
at com.google.inject.servlet.GuiceFilter.init(GuiceFilter.java:172)
注入PersistFilter
我的QuartzInitializer
也无济于事。
到目前为止,我实施的解决方法是在开始 Quartz 作业之前等待一分钟,但这不是一个长期的解决方案。
以前有人遇到过这个问题吗?
编辑:这似乎与这个问题有关问题 598:持久扩展:PersistService.start() 不能被多次调用