标签:java jpa quartz-scheduler guice
我在使用应用程序时遇到了一些麻烦,我使用Guice进行了一些由Quartz处理的后台任务的注入.
正如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();
}
}
注入此初始化程序时,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)
在我的QuartzInitializer中注入PersistFilter也无济于事.
到目前为止我实施的解决方法是在启动Quartz作业之前等待一分钟,但这不是一个长期的解决方案.
以前有人有这个问题吗?
编辑:这似乎与此问题Issue 598: Persist Extension: PersistService.start() cannot be called multiple times有关
解决方法:
我通过覆盖默认的持久性过滤器实现找到了另一种解决方法:
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import com.google.inject.Inject;
import com.google.inject.Singleton;
import com.google.inject.persist.PersistService;
import com.google.inject.persist.UnitOfWork;
/**
* Overrides Guice implementation to handle when the persistence service is
* already started
*
* See https://stackoverflow.com/questions/17402081/how-to-start-jpa-in-a-guice-
* quartz-web-application
*/
@Singleton
public final class PersistFilter implements Filter {
private final UnitOfWork unitOfWork;
private final PersistService persistService;
@Inject
public PersistFilter(UnitOfWork unitOfWork, PersistService persistService) {
this.unitOfWork = unitOfWork;
this.persistService = persistService;
}
public void init(FilterConfig filterConfig) throws ServletException {
try {
persistService.start();
} catch (IllegalStateException e) {
// Ignore exception is the persist service was already started
}
}
public void destroy() {
persistService.stop();
}
public void doFilter(final ServletRequest servletRequest, final ServletResponse servletResponse,
final FilterChain filterChain) throws IOException, ServletException {
unitOfWork.begin();
try {
filterChain.doFilter(servletRequest, servletResponse);
} finally {
unitOfWork.end();
}
}
}
这样,我可以在QuartzInitializer中注入MyInitializer(它调用persistService.start()),同时使用PersistFilter.
标签:java,jpa,quartz-scheduler,guice 来源: https://codeday.me/bug/20190831/1778149.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。