gpt4 book ai didi

java - Spring + hibernate + quartz : Dynamic Job

转载 作者:行者123 更新时间:2023-12-02 03:02:24 25 4
gpt4 key购买 nike

我想使用 Quartz、Spring 和 Hibernate 动态创建作业。用户与 Web 服务交互以创建此类作业:

public class StartJobSpring extends QuartzJobBean {

private String jobId;
private String jobType;

@Autowired
private NoaJobInstancesDAO njiDAO;

@Transactional
@Override
protected void executeInternal(JobExecutionContext context)
throws JobExecutionException {

JobKey key = context.getJobDetail().getKey();
JobDataMap dataMap = context.getMergedJobDataMap();

// some logic
njiDAO.create(instanceUUID, noaJob.getNoaJob(jobId), jobType);
}
}

NoaJobInstancesDAO 是一个简单的 DAO 类,它利用 Hibernate 的EntityManager:

@Repository
public class NoaJobInstancesDAOHibImpl implements NoaJobInstancesDAO {

@PersistenceContext
private EntityManager entityManager;

@Override
@Transactional
public NoaJobInstanceJPA create(NoaJobInstanceJPA entity) {
entityManager.persist(entity);
return entity;
}

@Override
public void create(String instance_uuid, NoaJobJPA job, String job_type) {
NoaJobInstanceJPA entity = new NoaJobInstanceJPA(instance_uuid, job,
job_type, "CREATED", null, null, "", "N", "N");
this.create(entity);
}
}

问题是当这个作业触发时,会抛出异常:

javax.persistence.TransactionRequiredException: No transactional EntityManager available

我不明白为什么!我在 Manager 类中以这种方式安排工作

JobDetail job = newJob(StartJobSpring.class).withIdentity(//anId)
.setJobData(//aJobMap).build();
getScheduler().getObject().scheduleJob(job, trigger);

调度程序连接到管理器的位置为

@Autowired
private ApplicationContext applicationContext;

@Bean
SchedulerFactoryBean schedulerFactoryBean(DataSource dataSource, JpaTransactionManager transactionManager) {

SchedulerFactoryBean bean = new SchedulerFactoryBean();

AutowiringSpringBeanJobFactory jobFactory = new AutowiringSpringBeanJobFactory();
jobFactory.setApplicationContext(applicationContext);
bean.setJobFactory(jobFactory);

bean.setTransactionManager(transactionManager);

return bean;
}

AutowiringSpringBeanJobFactory 类与 Autowiring 相同.

在我看来,调度程序接线有问题。事实上,我不明白如何检索应用程序上下文。

编辑1:应用程序上下文似乎已正确实例化。问题不可能在那里。

EDIT2: 我使用的是单个配置 bean(不是 xml 文件)。主要方法如下:

@Bean
LocalContainerEntityManagerFactoryBean entityManagerFactory(DataSource dataSource) {
LocalContainerEntityManagerFactoryBean entityManagerFactoryBean = new LocalContainerEntityManagerFactoryBean();
entityManagerFactoryBean.setDataSource(dataSource);
entityManagerFactoryBean.setJpaVendorAdapter(new HibernateJpaVendorAdapter());
entityManagerFactoryBean.setPackagesToScan("package");

Properties jpaProperties = new Properties();
jpaProperties.put("hibernate.dialect", "org.hibernate.dialect.OracleDialect");
jpaProperties.put("hibernate.show_sql", "false");
jpaProperties.put("hibernate.hbm2ddl.auto", "update");

entityManagerFactoryBean.setJpaProperties(jpaProperties);

return entityManagerFactoryBean;
}

@Bean
JpaTransactionManager transactionManager(EntityManagerFactory entityManagerFactory) {
JpaTransactionManager transactionManager = new JpaTransactionManager();
transactionManager.setEntityManagerFactory(entityManagerFactory);
return transactionManager;
}

@Bean
public NoaJobInstancesDAO noaJobInstancesDAO() {
NoaJobInstancesDAOHibImpl noaJobInstancesDAO = new NoaJobInstancesDAOHibImpl();
return noaJobInstancesDAO;
}

最佳答案

您位于 spring 管理的上下文中,并且尝试使用 @PersistentContext(这是一个 javax.persistence 注释)访问 EntityManager。尝试使用@Autowire Autowiring EntityManagerFactory bean,我假设您在spring-context.xml中配置它并使用entityManagerFactory.createEntityManager()为您提供spring管理的实体管理器,该管理器将由spring包装并位于您定义的事务管理器中

关于java - Spring + hibernate + quartz : Dynamic Job,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30729674/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com