Кварцевая работа, не участвующая в управляемой весной транзакции (Кварц + весенняя загрузка партии) - PullRequest
0 голосов
/ 02 декабря 2018

У меня есть несколько весенних пакетных заданий, которые отлично работают, если выполнение задания запускается в Spring Batch.Эти задания будут использовать JpaItemWriter для чтения и записи в базу данных, в которой требуется транзакция.

Моя проблема в том, что у меня кварцевый планировщик, который настроен на периодическое выполнение этих заданий, я получаю сообщение об ошибке «javax.persistence.TransactionRequiredException: транзакция не выполняется».Я знаю, что в настоящее время кварц создает экземпляр боба задания вместо самого Spring, что заставляет бин не знать о текущей транзакции, управляемой spring, исправьте меня, если я ошибаюсь.

Однако я пробовал много способов,но никто из них не работает.Ниже приведены мои текущие настройки:

quartz.properties

org.quartz.scheduler.instanceName=sample_instance
org.quartz.scheduler.instanceId=AUTO
org.quartz.threadPool.threadCount=5

org.quartz.jobStore.class=org.quartz.impl.jdbcjobstore.JobStoreCMT
org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.MSSQLDelegate
org.quartz.jobStore.useProperties=true
org.quartz.jobStore.misfireThreshold=60000
org.quartz.jobStore.tablePrefix=QRTZ_

org.quartz.jobStore.isClustered=true
org.quartz.jobStore.clusterCheckinInterval=20000

SchedulerConfig.java

@EnableScheduling
@Configuration
public class SchedulerConfig {

@Inject
private DataSource dataSource;

@Inject
private JobsListenerService jobsListenerService;

@Bean
public JobFactory jobFactory(ApplicationContext applicationContext) {
    AutowiringSpringBeanJobFactory jobFactory = new AutowiringSpringBeanJobFactory();
    jobFactory.setApplicationContext(applicationContext);
    return jobFactory;
}


@Bean
public SchedulerFactoryBean schedulerFactoryBean(JobFactory jobFactory)
        throws IOException {
    SchedulerFactoryBean factory = new SchedulerFactoryBean();
    factory.setJobFactory(jobFactory);
    factory.setDataSource(dataSource);
    factory.setQuartzProperties(quartzProperties());
    factory.setGlobalJobListeners(jobsListenerService);
    return factory;
}

@Bean
public Properties quartzProperties() throws IOException {
    PropertiesFactoryBean propertiesFactoryBean = new PropertiesFactoryBean();
    propertiesFactoryBean.setLocation(new ClassPathResource("/quartz.properties"));
    propertiesFactoryBean.afterPropertiesSet();
    return propertiesFactoryBean.getObject();
}
}

Работа:

@Component
@DisallowConcurrentExecution
public class TestJob implements Job {

    private static final String PARAMETERS = "param1=abc";

    @Inject
    private JobRegistry jobRegistry;

    @Inject
    private JobLauncher jobLauncher;

    @Inject
    private JobRepository jobRepository;

    @Inject
    private JobExplorer jobExplorer;

    private JobParametersConverter jobParametersConverter = new DefaultJobParametersConverter();

    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
        try {
            org.springframework.batch.core.Job job = jobRegistry.getJob("Job1");
            JobParameters jobParameters = JobParametersUtil.createJobParametersWithIncrementerIfAvailable(PARAMETERS, job);
            jobLauncher.run(job, jobParameters).getId();
        } catch (NoSuchJobException | JobParametersNotFoundException | JobParametersInvalidException | JobExecutionAlreadyRunningException | JobRestartException | JobInstanceAlreadyCompleteException e) {
            e.printStackTrace();
        }
    }
}

У меня уже естьнастроил кварц для использования JobStoreCMT.Должен ли я явно объявить TransactionManager и передать его в SchedulerFactoryBean?Помощь очень ценится.

1 Ответ

0 голосов
/ 02 декабря 2018

Чтобы сэкономить время других парней по всему миру, если вы столкнулись с похожей или такой же проблемой, как у меня, вот что работает для меня.

Я явно предоставил диспетчер транзакций для SchedulerFactoryBean.

    @Bean
    public PlatformTransactionManager transactionManager(EntityManagerFactory emf) {
        JpaTransactionManager transactionManager = new JpaTransactionManager();
        transactionManager.setEntityManagerFactory(emf);
        return transactionManager;
    }

    @Bean
    public SchedulerFactoryBean schedulerFactoryBean(JobFactory jobFactory, PlatformTransactionManager transactionManager)
            throws IOException {
        SchedulerFactoryBean factory = new SchedulerFactoryBean();
        factory.setJobFactory(jobFactory);
        factory.setDataSource(dataSource);
        factory.setTransactionManager(transactionManager);
        factory.setQuartzProperties(quartzProperties());
        factory.setGlobalJobListeners(jobsListenerService);
        return factory;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...