Подключение источника данных кварца к бину с пружинной загрузкой - PullRequest
3 голосов
/ 19 марта 2019

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

@Bean(name="MoliDBConfig")
@Primary
public DataSource dataSource() throws SQLException {

Я хотел бы подключиться к тому же источнику данных из кварца, но получаю ошибку JNDI.(Кроме того, стоит отметить, что мне удалось подключиться к источнику данных из кварца, вручную предоставив сведения о конфигурации. См. Закомментированный код в quartz.properties ниже.)

2019-03-19T10:51: 52.342 + 00: 00 [APP / PROC / WEB / 0] [OUT] ОШИБКА 2019-03-19 10: 51: 52.333 - oquJNDIConnectionProvider 126 Ошибка при поиске источника данных: необходимо указать имя класса в среде или свойстве системы илив качестве параметра апплета или в файле ресурсов приложения: java.naming.factory.initial javax.naming.NoInitialContextException: необходимо указать имя класса в свойстве среды или системы, либо в качестве параметра апплета, либо в файле ресурсов приложения: java.naming.factory.initial |at javax.naming.spi.NamingManager.getInitialContext (NamingManager.java:662) ~ [?: 1.8.0_202] |at javax.naming.InitialContext.getDefaultInitCtx (InitialContext.java:313) ~ [?: 1.8.0_202] |at javax.naming.InitialContext.getURLOrDefaultInitCtx (InitialContext.java:350) ~ [?: 1.8.0_202] |at javax.naming.InitialContext.lookup (InitialContext.java:417) ~ [?: 1.8.0_202] |в org.quartz.utils.JNDIConnectionProvider.init (JNDIConnectionProvider.java:124) [кварц-2.3.0.jar! / :?] |в org.quartz.utils.JNDIConnectionProvider. (JNDIConnectionProvider.java:102) [кварц-2.3.0.jar! / :?] |в org.quartz.impl.StdSchedulerFactory.instantiate (StdSchedulerFactory.java:995) [quartz-2.3.0.jar! / :?] |в org.quartz.impl.StdSchedulerFactory.getScheduler (StdSchedulerFactory.java:1559) [quartz-2.3.0.jar! / :?] |в com.xxx.d3.moli.schedule.QrtzScheduler.scheduler (QrtzScheduler.java:52) [classes / :?] |в com.xxx.d3.moli.schedule.QrtzScheduler $$ EnhancerBySpringCGLIB $$ aa50aa7b.CGLIB $ планировщик $ 1 () [classes / :?] |в com.xxx.d3.moli.schedule.QrtzScheduler $$ EnhancerBySpringCGLIB $$ aa50aa7b $$ FastClassBySpringCGLIB $$ 374ea1c1.invoke () [классы / :?] |в org.springframework.cglib.proxy.MethodProxy.invokeSuper (MethodProxy.java:228) [spring-core-4.3.22.RELEASE.jar! /: 4.3.22.RELEASE] |в org.springframework.context.annotation.ConfigurationClassEnhancer $ BeanMethodInterceptor.intercept (ConfigurationClassEnhancer.java:358) [spring-context-4.3.22.RELEASE.jar! /: 4.3.22.RELEASE] |в com.xxx.d3.moli.schedule.QrtzScheduler $$ EnhancerBySpringCGLIB $$ aa50aa7b.scheduler () [классы::]

quartz.properties

# Configure Main Scheduler Properties
org.quartz.scheduler.instanceName = MyClusteredScheduler
org.quartz.scheduler.instanceId = AUTO

# thread-pool
org.quartz.threadPool.class=org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount=2
org.quartz.threadPool.threadPriority = 5
org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread=true

# job-store
#org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX
org.quartz.jobStore.class = org.springframework.scheduling.quartz.LocalDataSourceJobStore
#org.quartz.jobStore.dataSource = myDS
org.quartz.jobStore.dataSource = managedTXDS

org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.oracle.OracleDelegate
org.quartz.jobStore.useProperties = false
org.quartz.jobStore.tablePrefix = QRTZ_
org.quartz.jobStore.misfireThreshold = 60000
org.quartz.jobStore.isClustered = true
org.quartz.jobStore.clusterCheckinInterval = 20000


# Configure Datasources
org.quartz.dataSource.managedTXDS.jndiURL=java:comp/env/jdbc/MoliDBConfig

org.quartz.dataSource.myDS.driver = oracle.jdbc.driver.OracleDriver
org.quartz.dataSource.myDS.URL = jdbc:oracle:thin:@ldap://oid.xxx.com:389/odsod012,cn=OracleContext,dc=xxx,dc=com
org.quartz.dataSource.myDS.user = MOLI_QRTZ_SCHED
org.quartz.dataSource.myDS.password = MOLI_QRTZ_SCHED
org.quartz.dataSource.myDS.maxConnections = 5
org.quartz.dataSource.myDS.validationQuery=select 0 from dual


# A different classloader is needed to work with Spring Boot dev mode,
# see https://docs.spring.io/spring-boot/docs/current/reference/html/using-boot-devtools.html#using-boot-devtools-known-restart-limitations
# and https://github.com/quartz-scheduler/quartz/issues/221
org.quartz.scheduler.classLoadHelper.class=org.quartz.simpl.ThreadContextClassLoadHelper

и мой кварцевый конфигфайл

@Configuration
@Profile({"oracle-cloud","mysql-cloud"})
public class QrtzScheduler {

    private static final Logger LOGGER = LogManager.getLogger(QrtzScheduler.class);

    @Autowired
    private ApplicationContext applicationContext;

    @PostConstruct
    public void init() {
        LOGGER.info("Hello world from Quartz...");
    }

    @Bean
    public SpringBeanJobFactory springBeanJobFactory() {
        AutoWiringSpringBeanJobFactory jobFactory = new AutoWiringSpringBeanJobFactory();
        LOGGER.debug("Configuring Job factory");

        jobFactory.setApplicationContext(applicationContext);
        return jobFactory;
    }

    @Bean
    public Scheduler scheduler(Trigger trigger, JobDetail job) throws SchedulerException, IOException {

        StdSchedulerFactory factory = new StdSchedulerFactory();
        factory.initialize(new ClassPathResource("quartz/quartz.properties").getInputStream());

        LOGGER.debug("Getting a handle to the Scheduler");
        Scheduler scheduler = factory.getScheduler();
        scheduler.setJobFactory(springBeanJobFactory());
        if (scheduler.checkExists(job.getKey())){
            scheduler.deleteJob(job.getKey());
        }
        scheduler.scheduleJob(job, trigger);

        LOGGER.debug("Starting Scheduler threads");
        scheduler.start();
        return scheduler;
    }

    @Bean
    public JobDetail jobDetail() {

        return JobBuilder.newJob()
                .ofType(ScheduledJob.class)
                .storeDurably()
                .withIdentity(JobKey.jobKey("Qrtz_Job_Detail"))
                .withDescription("Invoke Sample Job service...")
                .build();
    }

    @Bean
    public Trigger trigger(JobDetail job) {

        int frequencyInMin = 5;
        LOGGER.info("Configuring trigger to fire every {} minutes", frequencyInMin);

        return TriggerBuilder.newTrigger().forJob(job)
                .withIdentity(TriggerKey.triggerKey("Qrtz_Trigger"))
                .withDescription("Sample trigger")
                .withSchedule(simpleSchedule().withIntervalInMinutes(frequencyInMin).repeatForever())
                .build();
    }
}

Что не так с моим подходом?(Документация на quartz-scheduler.org, похоже, не работает): - (

...