QuartzJob 中的 EntityManager 为空
EntityManager null in QuartzJob
我在 QuartzJob 实例上使用 EntityManager 时遇到了这个问题:
java.lang.NullPointerException
at weblogic.persistence.CICScopedEMProvider.getEMForCurrentCIC(CICScopedEMProvider.java:35)
at weblogic.persistence.TransactionalEntityManagerProxyImpl.getPersistenceContext(TransactionalEntityManagerProxyImpl.java:122)
at weblogic.persistence.BasePersistenceContextProxyImpl.invoke(BasePersistenceContextProxyImpl.java:94)
at weblogic.persistence.TransactionalEntityManagerProxyImpl.invoke(TransactionalEntityManagerProxyImpl.java:164)
at weblogic.persistence.BasePersistenceContextProxyImpl.invoke(BasePersistenceContextProxyImpl.java:86)
at com.sun.proxy.$Proxy321.createQuery(Unknown Source)
at com.myproject.repository.impl.PhotoRepositoryImpl.getShotsFromBackupOption(PhotoRepositoryImpl.java:44)
at com.myproject.service.impl.PhotoServiceImpl.getPhoto(PhotoServiceImpl.java:90)
at com.myproject.monitor.BackupJob.execute(BackupJob.java:46)
at org.quartz.core.JobRunShell.run(JobRunShell.java:202)
at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:573)
这是我的工作:
public class BackupJob implements Job{
private Logger logger = LoggerFactory.getLogger(getClass());
@Inject private PhotoService photoService;
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
try {
String jobName = context.getJobDetail().getKey().getName();
Long jobGroup = Long.parseLong(context.getJobDetail().getKey().getGroup());
List<File> fileList = photoService.getPhoto(jobName, jobGroup);
logger.info("Backup with deep {}", context.getJobDetail().getJobDataMap().get("deep"));
} catch (Exception e) {
logger.error("ERROR during backup job", e);
}
}
}
(photoService 已正确注入,我在 photoService 中调用的 photoRepository 方法也是如此)
这是我的存储库:
@Stateless
public class PhotoRepositoryImpl implements PhotoRepository{
@PersistenceContext(unitName=Constant.PU_NAME)
private EntityManager em;
@Override
public List<Photo> getShotsFromBackupOption(String jobName, Long jobGroup) throws SQLException{
Query query = em.createQuery("SELECT p "
+ "FROM Shot s "
+ "JOIN Photo p "
+ "WHERE s.dateShooting < "
+ "(SELECT b.previousThan "
+ "FROM BackupOption b "
+ "WHERE b.jobName = :jobName AND b.syncType.id = :jobGroup)"
+ "ORDER BY p.relativePath DESC");
query.setParameter("jobName", jobName);
query.setParameter("jobGroup", jobGroup);
return (List<Photo>) query.getResultList();
}
}
这是我的工作工厂
public class JobFactoryImpl implements JobFactory {
@Inject
private Instance<Job> jobs;
@Override
public Job newJob(TriggerFiredBundle triggerFiredBundle, Scheduler scheduler) throws SchedulerException {
final JobDetail jobDetail = triggerFiredBundle.getJobDetail();
final Class<? extends Job> jobClass = jobDetail.getJobClass();
for (Job job : jobs) {
if (job.getClass().isAssignableFrom(jobClass)) {
return job;
}
}
throw new RuntimeException("Cannot create a Job of type " + jobClass);
}}
NullPointerException 在 em.createquery(---) 方法上抛出。
当从我的 QuartzJob 中调用方法时,此查询效果很好。
您对此有什么好的解决方法吗?
我通过这种方式解决了获取 EntityManager 的问题:
@PersistenceUnit(unitName= Constant.PU_NAME)
private EntityManagerFactory emf;
private EntityManager em = emf.createEntityManager();
我在 QuartzJob 实例上使用 EntityManager 时遇到了这个问题:
java.lang.NullPointerException at weblogic.persistence.CICScopedEMProvider.getEMForCurrentCIC(CICScopedEMProvider.java:35) at weblogic.persistence.TransactionalEntityManagerProxyImpl.getPersistenceContext(TransactionalEntityManagerProxyImpl.java:122) at weblogic.persistence.BasePersistenceContextProxyImpl.invoke(BasePersistenceContextProxyImpl.java:94) at weblogic.persistence.TransactionalEntityManagerProxyImpl.invoke(TransactionalEntityManagerProxyImpl.java:164) at weblogic.persistence.BasePersistenceContextProxyImpl.invoke(BasePersistenceContextProxyImpl.java:86) at com.sun.proxy.$Proxy321.createQuery(Unknown Source) at com.myproject.repository.impl.PhotoRepositoryImpl.getShotsFromBackupOption(PhotoRepositoryImpl.java:44) at com.myproject.service.impl.PhotoServiceImpl.getPhoto(PhotoServiceImpl.java:90) at com.myproject.monitor.BackupJob.execute(BackupJob.java:46) at org.quartz.core.JobRunShell.run(JobRunShell.java:202) at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:573)
这是我的工作:
public class BackupJob implements Job{
private Logger logger = LoggerFactory.getLogger(getClass());
@Inject private PhotoService photoService;
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
try {
String jobName = context.getJobDetail().getKey().getName();
Long jobGroup = Long.parseLong(context.getJobDetail().getKey().getGroup());
List<File> fileList = photoService.getPhoto(jobName, jobGroup);
logger.info("Backup with deep {}", context.getJobDetail().getJobDataMap().get("deep"));
} catch (Exception e) {
logger.error("ERROR during backup job", e);
}
}
}
(photoService 已正确注入,我在 photoService 中调用的 photoRepository 方法也是如此)
这是我的存储库:
@Stateless
public class PhotoRepositoryImpl implements PhotoRepository{
@PersistenceContext(unitName=Constant.PU_NAME)
private EntityManager em;
@Override
public List<Photo> getShotsFromBackupOption(String jobName, Long jobGroup) throws SQLException{
Query query = em.createQuery("SELECT p "
+ "FROM Shot s "
+ "JOIN Photo p "
+ "WHERE s.dateShooting < "
+ "(SELECT b.previousThan "
+ "FROM BackupOption b "
+ "WHERE b.jobName = :jobName AND b.syncType.id = :jobGroup)"
+ "ORDER BY p.relativePath DESC");
query.setParameter("jobName", jobName);
query.setParameter("jobGroup", jobGroup);
return (List<Photo>) query.getResultList();
}
}
这是我的工作工厂
public class JobFactoryImpl implements JobFactory {
@Inject
private Instance<Job> jobs;
@Override
public Job newJob(TriggerFiredBundle triggerFiredBundle, Scheduler scheduler) throws SchedulerException {
final JobDetail jobDetail = triggerFiredBundle.getJobDetail();
final Class<? extends Job> jobClass = jobDetail.getJobClass();
for (Job job : jobs) {
if (job.getClass().isAssignableFrom(jobClass)) {
return job;
}
}
throw new RuntimeException("Cannot create a Job of type " + jobClass);
}}
NullPointerException 在 em.createquery(---) 方法上抛出。 当从我的 QuartzJob 中调用方法时,此查询效果很好。 您对此有什么好的解决方法吗?
我通过这种方式解决了获取 EntityManager 的问题:
@PersistenceUnit(unitName= Constant.PU_NAME)
private EntityManagerFactory emf;
private EntityManager em = emf.createEntityManager();