quartz在springboot下的简单配置(利用spring获取数据源)
2017-12-03 17:07
597 查看
quartz在springboot下的简单配置(利用spring获取数据源)
如题所示,配置方法如下从官网下载quartz的说明文档(就是为了获取那几张表)
搭建springboot工程 此处省略
springboot集成quartz 下有代码
遇到的问题
问题描述:百度了一下午就是没找到关于springboot配置quartz的相关文章,不是老旧的就是quartz单独的数据源,这里的代码有些是从网上扒来的,有些是自己写的
-原先的xml是这样配置的<bean name="quartzScheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <property name="dataSource" ref ="dataSource" /> <property name="applicationContextSchedulerContextKey" value="applicationContextKey"/> <!--<property name="configLocation" value="classpath:quartz.properties"/>--> <property name="jobFactory" ref="myJobFactory"/> </bean> <bean id="myJobFactory" class="com.tmdaq.QuartzService.MyJobFactory"/>
现在要改成这样才行
首先来一波代码片段
这段是我以前的代码 大致的意思是spring自动装配quartz
import org.quartz.spi.TriggerFiredBundle; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.config.AutowireCapableBeanFactory; import org.springframework.scheduling.quartz.AdaptableJobFactory; public class MyJobFactory extends AdaptableJobFactory { @Autowired private AutowireCapableBeanFactory capableBeanFactory; protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception { Object jobInstance = super.createJobInstance(bundle); capableBeanFactor 4000 y.autowireBean(jobInstance); return jobInstance; } }
-这段是我从网上找的 大致意思是springboot声明几个bean
import com.tmdaq.ip.quartz.MyJobFactory; import org.apache.log4j.Logger; import org.springframework.beans.BeansException; import org.springframework.beans.MutablePropertyValues; import org.springframework.beans.factory.annotation.AnnotatedGenericBeanDefinition; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.beans.factory.config.BeanDefinitionHolder; import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; import org.springframework.beans.factory.support.BeanDefinitionReaderUtils; import org.springframework.beans.factory.support.BeanDefinitionRegistry; import org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor; import org.springframework.beans.factory.support.BeanNameGenerator; import org.springframework.context.annotation.*; import org.springframework.scheduling.quartz.SchedulerFactoryBean; @Configuration public class MyBeanDefinitionRegistryPostProcessor implements BeanDefinitionRegistryPostProcessor { private static Logger logger = Logger.getLogger(MyBeanDefinitionRegistryPostProcessor.class); private ScopeMetadataResolver scopeMetadataResolver = new AnnotationScopeMetadataResolver(); private BeanNameGenerator beanNameGenerator = new AnnotationBeanNameGenerator(); @Override public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException { logger.info("Invoke Metho postProcessBeanDefinitionRegistry"); registerBean(registry, "myJobFactory", MyJobFactory.class); registerBean(registry, "quartzScheduler", SchedulerFactoryBean.class); } @Override public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { logger.info("Invoke Metho postProcessBeanFactory"); BeanDefinition myJobFactory = beanFactory.getBeanDefinition("myJobFactory"); BeanDefinition dataSource = beanFactory.getBeanDefinition("druidDataSource"); // 这里可以设置属性,例如 BeanDefinition bd = beanFactory.getBeanDefinition("quartzScheduler"); MutablePropertyValues mpv = bd.getPropertyValues(); mpv.add("jobFactory" ,myJobFactory); mpv.add("dataSource",dataSource); mpv.addPropertyValue("applicationContextSchedulerContextKey", "applicationContextKey"); } private void registerBean(BeanDefinitionRegistry registry, String name, Class<?> beanClass){ AnnotatedGenericBeanDefinition abd = new AnnotatedGenericBeanDefinition(beanClass); ScopeMetadata scopeMetadata = this.scopeMetadataResolver.resolveScopeMetadata(abd); abd.setScope(scopeMetadata.getScopeName()); // 可以自动生成name String beanName = (name != null ? name : this.beanNameGenerator.generateBeanName(abd, registry)); AnnotationConfigUtils.processCommonDefinitionAnnotations(abd); BeanDefinitionHolder definitionHolder = new BeanDefinitionHolder(abd, beanName); BeanDefinitionReaderUtils.registerBeanDefinition(definitionHolder, registry); } }
在配置的过程中,由于springboot不在支持xml方式的bean了 所以只能用编程的方式来声明 声明的过程就是这样的,坑了好就才搞出来
1.通过spring托管quartz的方法:
-2.在spring容器中加载quartz的autowire 这样能减少代码量 让代码更干净
-3.在spring中获取能autowire的类 ,并且注入到 quartzScheduler 中
-4.上一步spring就可以正常使用quartz了 但是还少一步 就是加载数据源 如果不加载数据源 他会读取项目中的quartz.properties 如果没有找到 就在他自己的路径中找(这个我没找到。。。)
-5.加载数据源 通过spring注入数据源 我这边使用的是druid 和第2部方法一样的
-最后一步就是写具体的执行任务了
import org.apache.log4j.Logger; import org.quartz.Job; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; public class buzhidaoxiedianshaJob implements Job { private Logger logger = Logger.getLogger(this.getClass()); @Override public void execute(JobExecutionContext context) throws JobExecutionException { logger.info("hahhahahaha"); } }
-在整个配置中 需要在加载的时候spring的beanName
-这样的话就基本上没啥问题了
最后还想吐槽下几个问题 ,我是在mysql下装的 mysql mysql的校对集 默认的有个utf8-xxxx-ci 这个貌似是不区分大小写的
mysql 删除数据库的时候有可能删除不成功 需要手动删除对应数据库路径下的data/数据库名/文件夹下的所有文件 然后才能删除
quartz-innodb表中的所有建表语句都没有 default charset=utf8
今天的折腾成果 到此结束
相关文章推荐
- Spring+Tomcat的JNDI数据源连接池简单配置
- Spring与Quartz集成配置实现简单定时任务调度
- spring boot 集成quartz 2.0 实现前端动态配置(获取spring上下文)的两种方式,启动数据库中已开启定时任务
- JNDI+Spring获取配置数据源的三种方法
- Spring配置Quartz简单实现
- spring quartz定时器的简单配置和使用
- 配置Spring通过JNDI获取数据源
- spring利用扫描方式对bean的处理(对任何版本如何获取xml配置信息的处理)
- Spring通过JNDI获取在Tomcat容器中配置的C3P0数据源
- Spring配置简单数据源SimpleDriverDataSource
- 利用spring+ibatiS技术,在spring中配置多个数据源,并实现动态切换。
- Spring-boot中利用外部配置文件生成数据源
- Spring中配置数据源以及简单实现
- Spring集成Quartz的简单配置的方法
- Spring整合Quartz实现定时任务的时间更新,暂停和启用(不需要重启项目并且配置多数据源)
- Spring与Quartz集成配置实现简单定时任务调度
- springboot(6)从springboot配置文件获取值
- Spring-boot中利用外部配置文件生成数据源
- 利用spring+ibatiS技术,在spring中配置多个数据源,并实现动态切换。
- Spring--超简单利用quartz实现定时作业