春ブーツBeanに石英データソースの接続

ジェームス・ハッチンソン:

私は春ブーツで豆を使用して、当社のデータベースへの接続を設定しています。このすべては、私たちの通常のアプリケーションで正しく動作します。

@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] ERROR 2019年3月19日10:51:52.333 - データソースを検索oquJNDIConnectionProvider 126エラー:でクラス名を指定する必要がありますjava.naming.factory.initialのjavax.naming.NoInitialContextException:環境内のクラス名を指定する必要があるか、システムプロパティ、またはアプレットパラメータとして、または内環境やシステムプロパティ、またはアプレットパラメータとして、またはアプリケーションリソースファイルでアプリケーションリソースファイル:java.naming.factory.initialの| javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:662)で〜[:?1.8.0_202] | javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:313)で〜[:?1.8.0_202] | javax.naming.InitialContext.getURLOrDefaultInitCtx(InitialContext.java:350)で〜[:?1.8.0_202] | 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)で[石英-2.3.0.jar / :?!] | org.quartz.impl.StdSchedulerFactory.getScheduler(StdSchedulerFactory.java:1559)で[石英-2.3.0.jar / :?!] | com.xxx.d3.moli.schedule.QrtzScheduler.scheduler(QrtzScheduler.java:52)で[クラス/ :?] | com.xxx.d3.moli.schedule.QrtzScheduler $$ $$ EnhancerBySpringCGLIB aa50aa7b.CGLIB $スケジューラ$ -1()で、[クラス/ :?] | com.xxx.d3.moli.schedule.QrtzSchedulerで$$ $$ EnhancerBySpringCGLIB aa50aa7b $$ $$ FastClassBySpringCGLIB 374ea1c1.invoke()[クラス/ :?] | org.springframework.cglib.proxy.MethodProxy.invokeSuperで(MethodProxy.java:228)[春-コア4.3.22.RELEASE.jar /:!4.3。22.RELEASE] | |:org.springframework.context.annotation.ConfigurationClassEnhancer $ BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.java:358)[!4.3.22.RELEASE春-コンテキスト4.3.22.RELEASE.jar /]で 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のドキュメントがすべてダウンしていると思われる):-(

ジェームス・ハッチンソン:

だから私は、これに切り替えます:

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

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

    @Autowired
    private ApplicationContext applicationContext;

    @Autowired
    @Qualifier("MoliDBConfig")
    private DataSource dataSource;

    @Value("${app.repeatInterval}")
    private int repeatInterval;

    @Value("${org.quartz.scheduler.instanceName}")
    private String instanceName;

    @Value("${org.quartz.scheduler.instanceId}")
    private String instanceId;

    @Value("${org.quartz.threadPool.threadCount}")
    private String threadCount;

    @Value("${org.quartz.threadPool.class}")
    private String threadClass;

    @Value("${org.quartz.threadPool.threadPriority}")
    private String threadPriority;

    @Value("${org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread}")
    private String threadsInheritContextClassLoaderOfInitializingThread;

    @Value("${org.quartz.jobStore.class}")
    private String jobStoreClass;

    @Value("${org.quartz.jobStore.driverDelegateClass}")
    private String jobStoreDriverDelegateClass;

    @Value("${org.quartz.jobStore.useProperties}")
    private String jobStoreUseProperties;

    @Value("${org.quartz.jobStore.tablePrefix}")
    private String jobStoreTablePrefix;

    @Value("${org.quartz.jobStore.misfireThreshold}")
    private String jobStoreMisfireThreshold;

    @Value("${org.quartz.jobStore.isClustered}")
    private String jobStoreIsClustered;

    @Value("${org.quartz.jobStore.clusterCheckinInterval}")
    private String jobStoreClusterCheckinInterval;

    @Value("${org.quartz.scheduler.classLoadHelper.class}")
    private String schedulerClassLoadHelperClass;

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

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

        jobFactory.setApplicationContext(applicationContext);
        return jobFactory;
    }

    @Bean
    public SchedulerFactoryBean schedulerFactoryBean() {

        LOGGER.debug("Configuring schedulerFactoryBean");
        SchedulerFactoryBean factory = new SchedulerFactoryBean();

        factory.setOverwriteExistingJobs(true);
        factory.setJobFactory(jobFactory());

        Properties quartzProperties = new Properties();
        quartzProperties.setProperty("org.quartz.scheduler.instanceName",instanceName);
        quartzProperties.setProperty("org.quartz.scheduler.instanceId",instanceId);
        quartzProperties.setProperty("org.quartz.threadPool.threadCount",threadCount);
        quartzProperties.setProperty("org.quartz.threadPool.class",threadClass);
        quartzProperties.setProperty("org.quartz.threadPool.threadPriority",threadPriority);
        quartzProperties.setProperty("org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread",threadsInheritContextClassLoaderOfInitializingThread);
        quartzProperties.setProperty("org.quartz.jobStore.class",jobStoreClass);
        quartzProperties.setProperty("org.quartz.jobStore.driverDelegateClass",jobStoreDriverDelegateClass);
        quartzProperties.setProperty("org.quartz.jobStore.useProperties",jobStoreUseProperties);
        quartzProperties.setProperty("org.quartz.jobStore.tablePrefix",jobStoreTablePrefix);
        quartzProperties.setProperty("org.quartz.jobStore.misfireThreshold",jobStoreMisfireThreshold);
        quartzProperties.setProperty("org.quartz.jobStore.isClustered",jobStoreIsClustered);
        quartzProperties.setProperty("org.quartz.jobStore.clusterCheckinInterval",jobStoreClusterCheckinInterval);
        quartzProperties.setProperty("org.quartz.scheduler.classLoadHelper.class",schedulerClassLoadHelperClass);

        factory.setDataSource(dataSource);

        factory.setQuartzProperties(quartzProperties);
        factory.setTriggers(moliJobTrigger().getObject());

        return factory;
    }

    @Bean(name = "moliJobTrigger")
    public SimpleTriggerFactoryBean moliJobTrigger() {
        long minute = 60000;
        long repeatIntervalInMin = repeatInterval * minute;
        LOGGER.debug("Configuring jobTrigger");

        SimpleTriggerFactoryBean factoryBean = new SimpleTriggerFactoryBean();
        factoryBean.setJobDetail(moliJobDetails().getObject());
        factoryBean.setStartDelay(minute);
        factoryBean.setRepeatInterval(repeatIntervalInMin);
        factoryBean.setRepeatCount(SimpleTrigger.REPEAT_INDEFINITELY);
        factoryBean.setMisfireInstruction(SimpleTrigger.MISFIRE_INSTRUCTION_RESCHEDULE_NEXT_WITH_REMAINING_COUNT);
        return factoryBean;
    }

    @Bean(name = "moliJobDetails")
    public JobDetailFactoryBean moliJobDetails() {

        LOGGER.debug("Configuring jobDetails");
        JobDetailFactoryBean jobDetailFactoryBean = new JobDetailFactoryBean();
        jobDetailFactoryBean.setJobClass(ScheduledAutomaticMonitoringJob.class);
        jobDetailFactoryBean.setDescription("Moli_Quartz_Description");
        jobDetailFactoryBean.setDurability(true);
        jobDetailFactoryBean.setName("Moli_Quartz_Name");

        return jobDetailFactoryBean;
    }
}

application.yml

org:
  quartz:
    scheduler:
      instanceName: MyClusteredScheduler
      instanceId: AUTO
      classLoadHelper:
        class: org.quartz.simpl.ThreadContextClassLoadHelper
    threadPool:
      class: org.quartz.simpl.SimpleThreadPool
      threadCount: 10
      threadPriority: 5
      threadsInheritContextClassLoaderOfInitializingThread: true
    jobStore:
      class: org.springframework.scheduling.quartz.LocalDataSourceJobStore
      dataSource: app.dataSource
      driverDelegateClass: org.quartz.impl.jdbcjobstore.oracle.OracleDelegate
      useProperties: false
      tablePrefix: COT_QRTZ_
      misfireThreshold: 60000
      isClustered: true
      clusterCheckinInterval: 20000

また、このクラスは、必要に応じて:

import org.quartz.spi.TriggerFiredBundle;
import org.springframework.beans.factory.config.AutowireCapableBeanFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.scheduling.quartz.SpringBeanJobFactory;

/**
 * Adds auto-wiring support to quartz jobs.
 */
public final class AutoWiringSpringBeanJobFactory extends SpringBeanJobFactory implements ApplicationContextAware {

    private AutowireCapableBeanFactory beanFactory;

    public void setApplicationContext(ApplicationContext applicationContext) {

        beanFactory = applicationContext.getAutowireCapableBeanFactory();
    }

    @Override
    protected Object createJobInstance(final TriggerFiredBundle bundle) throws Exception {

        final Object job = super.createJobInstance(bundle);
        beanFactory.autowireBean(job);
        return job;
    }

}

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=192540&siteId=1