我在應用程序中遇到了一些麻煩,我使用Guice進行Quartz處理的一些後臺任務的注入。如何在Guice + Quartz Web應用程序中啓動JPA?
正如documentation所述,我使用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)
所有的任務的下一個電話是全成。我的賭注是,堅持服務尚未開始,所以我試圖注入一個初始化:
public class MyInitializer {
@Inject MyInitializer(PersistService service) {
service.start();
}
}
當注射這種初始化,石英工作正在向右走,但PersistFilter
電話service.start()
第二次,我的網站應用程序中斷:
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)
注入在我QuartzInitializer
也沒有幫助的PersistFilter
。
到目前爲止,我實現的解決方法是在開始Quartz作業之前等待一分鐘,但這不是一個長期的解決方案。
以前有人有過這個問題嗎?
編輯:這似乎堅持過濾器實現對與此有關的問題Issue 598: Persist Extension: PersistService.start() cannot be called multiple times
鑑於thiat這是從吉斯類,你可能應該提供屬性名稱相同的代碼的90%逐字複製,這是受到來自ASL 2.0,你會繼承這些限制當你修改一個ASL 2.0的工作時......另外,你正在重新實現,而不是重寫,因爲你沒有從他們的類繼承。 – Gus