Я хочу создать динамические задания с использованием кварца, весны и спящего режима. Пользователи взаимодействуют с веб-сервиса для создания рабочих мест этого класса:Spring + Hibernate + Quartz: Dynamic Job
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
и я не могу понять, почему! запланировать работу на этом пути в менеджер класса
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.
В моем предложении что-то не так в проводнике планировщика. На самом деле, я не понимаю, как я могу получить контекст приложения.
EDIT1: Контекст приложения выглядит правильно. Проблема не может быть.
EDIT2: Я использую один компонент конфигурации (а не файлы 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;
}
Не уверен, что я поняли. Я обновил свой вопрос с помощью основных методов моего компонента конфигурации. Я предполагаю, что вы хотите добавить @Autowired аннотацию в моем DAO и добавить еще один компонент в моей конфигурации, который вводит entityManagerFactory.createEntityManager(). Я прав? – dylaniato
Да, на вашем уровне DAO вместо того, чтобы вводить EntityManager, вставляйте EntityManagerFactory с помощью аннотации Autowired и внутри ваших методов, получите диспетчер сущности из entityManagerFactory.createEntityManager() – AntJavaDev
Я попробую как можно скорее. Всего пару вопросов. Первое: я использую DAO в моем основном потоке. Такая модификация может повлиять на мой нормальный поток? Второй: все-таки я могу игнорировать управление транзакциями с помощью метода createEntityManager()? – dylaniato