您的位置:首页 > 编程语言 > Java开发

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

今天的折腾成果 到此结束
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: