spring boot加载第三方jar包的配置文件的方法

作者:牛奋lch 时间:2023-03-02 22:45:13 

前言

今天收到一封邮件,大概内容如下:spring boot鼓励去配置化,那么怎么将第三方jar包中的xml去配置化了?

其实,这个问题,在前面的文章中也有提到,https://www.jb51.net/article/125700.htm

下面,我们就以Quartz定时任务为例,单独对这个问题来进行说明,如何实现去配置化。

如果不使用spring boot,我们配置一个简单的定时任务时,需要引入以下配置文件:


<!-- 配置需要定时执行的任务类以及方法 -->
<bean id="doJob"
 class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
 <!-- 指定任务类 -->
 <property name="targetObject" ref="schedulerTask" />
 <!-- 指定任务执行的方法 -->
 <property name="targetMethod" value="doTask" />
 <property name="concurrent" value="false"></property>
</bean>

<!-- 配置触发器 -->
<bean id="jobTrigger"
 class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
 <property name="jobDetail" ref="doJob" />
 <!-- 每5秒运行一次 -->
 <property name="cronExpression" value="0/5 * * * * ?" />
</bean>

<!-- 触发定时任务 -->
<bean id="schedulerFactoryBean" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
 <property name="triggers">
  <list>
   <ref bean="jobTrigger" /><!-- 此处可以配置多个触发器 -->
  </list>
 </property>
 <property name="applicationContextSchedulerContextKey" value="applicationContextKey" />
 <property name="waitForJobsToCompleteOnShutdown" value="true"></property>
</bean>

接下来的任务,就是如何将上面的xml配置文件,去配置化。

从上面的配置文件中,可以得出,我们需要配置3个实例,分别是JobDetail,JobTrigger和Scheduler。

1、首先抽取出需要在application.properties配置文件中配置的属性项,从上面的配置文件中,可以得出如下需要配置的属性项,对应的VO如下:


package com.chhliu.springboot.quartz.config;

import org.springframework.boot.context.properties.ConfigurationProperties;

@ConfigurationProperties(prefix="quartz.config")
public class QuartzConfigProperties {
private String targetObject;

private String targetMethod;

private boolean concurrent;

private String cronExpression;

private String applicationContextSchedulerContextKey;

private boolean waitForJobsToCompleteOnShutdown;

……省略getter、setter方法……
}

2、在application.properties配置文件中,加入如下配置


quartz.config.targetObject=taskJob ## 待执行对象的名字
quartz.config.targetMethod=doJob ## 待执行的方法的名字
quartz.config.concurrent=false ## 是否并发,如果上一个定时任务还没有执行完,又被触发了,如果配置为false,则需等待上个任务执行完,才触发
quartz.config.cronExpression=0/5 * * * * ? ## 任务触发表达式
quartz.config.applicationContextSchedulerContextKey=applicationContextKey ## 通过该key可以获取spring上下文
quartz.config.waitForJobsToCompleteOnShutdown=true ## 是否等待任务完全执行完后,再销毁线程池

3、分别实例化JobDetail,JobTrigger和Scheduler 


package com.chhliu.springboot.quartz.entity;

import org.quartz.Trigger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.quartz.CronTriggerFactoryBean;
import org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean;
import org.springframework.scheduling.quartz.SchedulerFactoryBean;

import com.chhliu.springboot.quartz.config.QuartzConfigProperties;

/**
* 描述:将quartz的xml配置文件去配置化
* @author chhliu
* 创建时间:2017年4月11日 下午7:41:21
* @version 1.2.0
*/
@Configuration
public class QuartzConfig {

@Autowired
private QuartzConfigProperties properties; // 注入属性配置文件对应的类实例

/**
 * attention:
 * Details:初始化JobDetail
 * @author chhliu
 * 创建时间:2017年4月11日 下午6:17:06
 * @param task
 * @return
 * MethodInvokingJobDetailFactoryBean
 * @throws ClassNotFoundException
 * @throws IllegalAccessException
 * @throws InstantiationException
 */
@Bean(name = "jobDetail")
public MethodInvokingJobDetailFactoryBean detailFactoryBean() throws ClassNotFoundException, InstantiationException, IllegalAccessException {// ScheduleTask为需要执行的任务
 MethodInvokingJobDetailFactoryBean jobDetail = new MethodInvokingJobDetailFactoryBean();
 /*
  * 是否并发执行
  * 例如每5s执行一次任务,但是当前任务还没有执行完,就已经过了5s了,
  * 如果此处为true,则下一个任务会执行,如果此处为false,则下一个任务会等待上一个任务执行完后,再开始执行
  */
 jobDetail.setConcurrent(properties.isConcurrent());

/*
  * 为需要执行的实体类对应的对象
  */
 String targetObject = properties.getTargetObject();
 jobDetail.setTargetBeanName(targetObject);

/*
  * 通过这几个配置,告诉JobDetailFactoryBean我们需要定时执行targetObject类中的properties.getTargetMethod()方法
  */
 jobDetail.setTargetMethod(properties.getTargetMethod());
 return jobDetail;
}

/**
 * attention:
 * Details:实例化JobTrigger
 * @author chhliu
 * 创建时间:2017年4月11日 下午7:39:14
 * @param jobDetail
 * @return
 * CronTriggerFactoryBean
 */
@Bean(name = "jobTrigger")
public CronTriggerFactoryBean cronJobTrigger(MethodInvokingJobDetailFactoryBean jobDetail) {
 CronTriggerFactoryBean tigger = new CronTriggerFactoryBean();
 tigger.setJobDetail(jobDetail.getObject());
 tigger.setCronExpression(properties.getCronExpression());
 return tigger;

}

/**
 * attention:
 * Details:实例化Scheduler
 * @author chhliu
 * 创建时间:2017年4月11日 下午7:39:35
 * @param cronJobTrigger
 * @return
 * SchedulerFactoryBean
 */
@Bean(name = "scheduler")
public SchedulerFactoryBean schedulerFactory(Trigger cronJobTrigger) {
 SchedulerFactoryBean bean = new SchedulerFactoryBean();
 // 注册触发器
 bean.setTriggers(cronJobTrigger);
 // 通过applicationContextSchedulerContextKey属性配置获取spring上下文
 bean.setApplicationContextSchedulerContextKey(properties.getApplicationContextSchedulerContextKey());
 // 关闭任务的时候,是否等待任务执行完毕
 bean.setWaitForJobsToCompleteOnShutdown(properties.isWaitForJobsToCompleteOnShutdown());
 return bean;
}
}

4、编写需要执行的方法 


package com.chhliu.springboot.quartz.job;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;

@Service("taskJob")
public class TaskJob {
private static final Logger LOGGER = LoggerFactory.getLogger(TaskJob.class);
public void doJob(){
 LOGGER.info("hello spring boot, i'm the king of the world!!!");
}
}

5、测试


package com.chhliu.springboot.quartz;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.properties.EnableConfigurationProperties;

import com.chhliu.springboot.quartz.config.QuartzConfigProperties;

@SpringBootApplication
@EnableConfigurationProperties({QuartzConfigProperties.class} ) // 开启配置属性支持
public class SpringbootQuartzApplication {

public static void main(String[] args) {
 SpringApplication.run(SpringbootQuartzApplication.class, args);
}
}

6、测试结果如下 


2017-04-11 19:09:35.017 INFO 7500 --- [eduler_Worker-1] c.chhliu.springboot.quartz.job.TaskJob : hello spring boot, i'm the king of the world!!!
2017-04-11 19:09:40.004 INFO 7500 --- [eduler_Worker-2] c.chhliu.springboot.quartz.job.TaskJob : hello spring boot, i'm the king of the world!!!
2017-04-11 19:09:45.004 INFO 7500 --- [eduler_Worker-3] c.chhliu.springboot.quartz.job.TaskJob : hello spring boot, i'm the king of the world!!!
2017-04-11 19:09:50.004 INFO 7500 --- [eduler_Worker-4] c.chhliu.springboot.quartz.job.TaskJob : hello spring boot, i'm the king of the world!!!
2017-04-11 19:09:55.001 INFO 7500 --- [eduler_Worker-5] c.chhliu.springboot.quartz.job.TaskJob : hello spring boot, i'm the king of the world!!!
2017-04-11 19:10:00.002 INFO 7500 --- [eduler_Worker-6] c.chhliu.springboot.quartz.job.TaskJob : hello spring boot, i'm the king of the world!!!
2017-04-11 19:10:05.001 INFO 7500 --- [eduler_Worker-7] c.chhliu.springboot.quartz.job.TaskJob : hello spring boot, i'm the king of the world!!!

从上面的测试结果可以看出,任务被触发了,也得到了正确的结果。

上面的这个示例,只是一个简单的例子,但是生产上复杂的需求,原理也是类似的。

来源:http://blog.csdn.net/liuchuanhong1/article/details/70105193

标签:spring,boot,jar包
0
投稿

猜你喜欢

  • c#实现md5加密示例

    2023-04-19 16:37:11
  • java基础之接口组成更新的实现

    2022-10-03 08:10:27
  • Android 用Time和Calendar获取系统当前时间源码分享(年月日时分秒周几)

    2022-10-17 16:45:51
  • Android使用Websocket实现聊天室

    2023-07-07 13:01:59
  • Java实现配置加载机制

    2023-11-26 09:03:38
  • IDEA不识别Java文件:文件变橙色&显示后缀名.java的解决

    2022-05-27 06:43:36
  • Android PopWindow 设置背景亮度的实例

    2021-12-20 23:48:10
  • 使用maven的profile构建不同环境配置的方法

    2023-08-30 23:43:45
  • Java反射及性能详细

    2023-08-20 20:49:42
  • Android TextView控件文字添加下划线的实现方法

    2022-03-11 06:01:43
  • Java之SpringBean生命周期问题理解

    2022-11-16 14:47:35
  • Java利用POI读取、写入Excel的方法指南

    2023-11-23 15:39:23
  • [Alibaba-ARouter]浅谈简单好用的Android页面路由框架

    2023-06-28 06:37:22
  • java实现解析二进制文件的方法(字符串、图片)

    2023-04-18 19:07:51
  • Android View如何测量

    2023-12-06 14:53:53
  • 基于Java8实现提高Excel读写效率

    2023-11-25 10:01:37
  • Spring框架学习之Cache抽象详解

    2023-07-20 17:37:47
  • 详解Android 获取手机中微信聊天记录方法

    2021-10-25 02:32:38
  • Android App开发中HTTP扩展包OkHttp的入门使用指南

    2023-10-01 11:11:28
  • Windows下Java环境变量配置详解

    2022-02-04 05:56:02
  • asp之家 软件编程 m.aspxhome.com