2121import org .springframework .boot .autoconfigure .quartz .SchedulerFactoryBeanCustomizer ;
2222import org .springframework .boot .autoconfigure .transaction .PlatformTransactionManagerCustomizer ;
2323import org .springframework .boot .context .properties .EnableConfigurationProperties ;
24- import org .springframework .boot .jdbc .DataSourceInitializationMode ;
2524import org .springframework .context .ApplicationContext ;
2625import org .springframework .context .annotation .Bean ;
2726import org .springframework .context .annotation .Configuration ;
3231import org .springframework .transaction .PlatformTransactionManager ;
3332
3433import javax .sql .DataSource ;
34+ import java .lang .reflect .Field ;
35+ import java .util .Arrays ;
3536import java .util .Map ;
3637import java .util .Properties ;
3738
@@ -67,8 +68,6 @@ public ApiBootQuartzAutoConfiguration(ApiBootQuartzProperties properties, Object
6768 this .calendars = calendars ;
6869 this .triggers = triggers ;
6970 this .applicationContext = applicationContext ;
70- // 初始化Quartz Properties
71- initDefaultProperties ();
7271 }
7372
7473 /**
@@ -124,25 +123,6 @@ private Properties asProperties(Map<String, String> source) {
124123 return properties ;
125124 }
126125
127- /**
128- * 初始化默认属性配置
129- * 仅在JDBC方式下进行初始化
130- */
131- private void initDefaultProperties () {
132- // 数据源方式,设置相关属性
133- if (JobStoreType .JDBC .toString ().equals (this .properties .getJobStoreType ().toString ())) {
134- this .properties .getJdbc ().setInitializeSchema (DataSourceInitializationMode .EMBEDDED );
135- this .properties .getProperties ().put ("org.quartz.scheduler.instanceName" , "jobScheduler" );
136- this .properties .getProperties ().put ("org.quartz.scheduler.instanceId" , "AUTO" );
137- this .properties .getProperties ().put ("org.quartz.jobStore.class" , "org.quartz.impl.jdbcjobstore.JobStoreTX" );
138- this .properties .getProperties ().put ("org.quartz.jobStore.driverDelegateClass" , "org.quartz.impl.jdbcjobstore.StdJDBCDelegate" );
139- this .properties .getProperties ().put ("org.quartz.jobStore.tablePrefix" , "QRTZ_" );
140- this .properties .getProperties ().put ("org.quartz.jobStore.isClustered" , "true" );
141- this .properties .getProperties ().put ("org.quartz.jobStore.clusterCheckinInterval" , "20000" );
142- this .properties .getProperties ().put ("org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread" , "true" );
143- }
144- }
145-
146126 private void customize (SchedulerFactoryBean schedulerFactoryBean ) {
147127 this .customizers .orderedStream ().forEach ((customizer ) -> customizer .customize (schedulerFactoryBean ));
148128 }
@@ -153,14 +133,46 @@ protected static class JdbcStoreTypeConfiguration {
153133 protected JdbcStoreTypeConfiguration () {
154134 }
155135
136+ /**
137+ * properties needed to initialize Jdbc mode
138+ *
139+ * @return
140+ */
156141 @ Bean
157142 @ Order (0 )
158- public SchedulerFactoryBeanCustomizer jobDataSourceCustomizer ( ApiBootQuartzProperties properties , DataSource dataSource , @ QuartzDataSource ObjectProvider <DataSource > quartzDataSource , ObjectProvider <PlatformTransactionManager > transactionManager ) {
143+ public SchedulerFactoryBeanCustomizer jobPropertiesCustomizer (ApiBootQuartzProperties properties ) {
144+ return schedulerFactoryBean -> {
145+ // jdbc away
146+ if (properties .getJobStoreType () == JobStoreType .JDBC ) {
147+
148+ ApiBootQuartzProperties .Prop prop = properties .getProp ();
149+ // get prop class declared fields
150+ Field [] fields = prop .getClass ().getDeclaredFields ();
151+ Arrays .stream (fields ).forEach (field -> {
152+ try {
153+ field .setAccessible (true );
154+ String value = String .valueOf (field .get (prop ));
155+ PropKey propKey = field .getDeclaredAnnotation (PropKey .class );
156+
157+ // put prop to quartz properties
158+ properties .getProperties ().put (propKey .value (), value );
159+ } catch (IllegalAccessException e ) {
160+ e .printStackTrace ();
161+ }
162+
163+ });
164+ }
165+ };
166+ }
167+
168+ @ Bean
169+ @ Order (1 )
170+ public SchedulerFactoryBeanCustomizer jobDataSourceCustomizer (ApiBootQuartzProperties properties , DataSource dataSource , @ QuartzDataSource ObjectProvider <DataSource > quartzDataSource , ObjectProvider <PlatformTransactionManager > transactionManager ) {
159171 return (schedulerFactoryBean ) -> {
160172 if (properties .getJobStoreType () == JobStoreType .JDBC ) {
161173 DataSource dataSourceToUse = this .getDataSource (dataSource , quartzDataSource );
162174 schedulerFactoryBean .setDataSource (dataSourceToUse );
163- PlatformTransactionManager txManager = ( PlatformTransactionManager ) transactionManager .getIfUnique ();
175+ PlatformTransactionManager txManager = transactionManager .getIfUnique ();
164176 if (txManager != null ) {
165177 schedulerFactoryBean .setTransactionManager (txManager );
166178 }
@@ -170,13 +182,13 @@ public SchedulerFactoryBeanCustomizer jobDataSourceCustomizer( ApiBootQuartzProp
170182 }
171183
172184 private DataSource getDataSource (DataSource dataSource , ObjectProvider <DataSource > quartzDataSource ) {
173- DataSource dataSourceIfAvailable = ( DataSource ) quartzDataSource .getIfAvailable ();
185+ DataSource dataSourceIfAvailable = quartzDataSource .getIfAvailable ();
174186 return dataSourceIfAvailable != null ? dataSourceIfAvailable : dataSource ;
175187 }
176188
177189 @ Bean
178190 @ ConditionalOnMissingBean
179- public ApiBootQuartzDataSourceInitializer apiBootQuartzDataSourceInitializer (DataSource dataSource , @ QuartzDataSource ObjectProvider <DataSource > quartzDataSource , ResourceLoader resourceLoader , ApiBootQuartzProperties properties ) {
191+ public ApiBootQuartzDataSourceInitializer apiBootQuartzDataSourceInitializer (DataSource dataSource , @ QuartzDataSource ObjectProvider <DataSource > quartzDataSource , ResourceLoader resourceLoader , ApiBootQuartzProperties properties ) {
180192 DataSource dataSourceToUse = this .getDataSource (dataSource , quartzDataSource );
181193 return new ApiBootQuartzDataSourceInitializer (dataSourceToUse , resourceLoader , properties );
182194 }
@@ -188,7 +200,7 @@ public static ApiBootQuartzAutoConfiguration.JdbcStoreTypeConfiguration.DataSour
188200
189201 private static class DataSourceInitializerSchedulerDependencyPostProcessor extends AbstractDependsOnBeanFactoryPostProcessor {
190202 DataSourceInitializerSchedulerDependencyPostProcessor () {
191- super (Scheduler .class , SchedulerFactoryBean .class , new String []{"quartzDataSourceInitializer " });
203+ super (Scheduler .class , SchedulerFactoryBean .class , new String []{"apiBootQuartzDataSourceInitializer " });
192204 }
193205 }
194206 }
0 commit comments