Я установил соединение с нашей базой данных, используя бин при весенней загрузке.В нашем обычном приложении все работает правильно.
@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, похоже, не работает): - (