zoukankan      html  css  js  c++  java
  • 实际工程Quartz与Spring设计与实现一体化的热部署


    1.需求说明


    主要负责项目任务调度。使用Quartz。以Spring为辅助。

    如今有这样一个需求:我们不知道管理员想设定过多厂时间运行主任务,须要在配置文件定义。在配置好后须要马上运行。实现热部署。



    2.设计


    在主调度加一个方法,此方法先检測配置文件是否更改。若更改则将调度时间又一次设置,又一次启用调度任务


    3.实现


    在PropertiesUtil定义一一个初始时间,改时间在这个类初始化之前运行。也就是在静态代码块运行,代码例如以下:
    private static long curModifiedTime;
    	static {
    		try {
    			curModifiedTime = new File(filePath).lastModified();
    			System.out.println("当前文件改动时间为 " +curModifiedTime);
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    	
    	}

    此时获取到文件本来的时间

    写一个方法来推断配置文件是否改动:
    public static boolean isModifiedValue()
      {
      	boolean flag = false;
      	long lastModifiedTime = new File(filePath).lastModified();
      	if(lastModifiedTime > curModifiedTime) {
      		curModifiedTime= lastModifiedTime;
      		flag = true;
      	}
      	return flag;
      }

    读取文件最后改动地址。若大于初始时间。则将最后改动时间赋给初始时间
    public boolean reSetTaskSchedulerzIntervalTime(){
    		boolean flag = false;
    		//监听到配置文件改动
    		if(PropertiesUtil.isModifiedValue()) {
    			long time = 0L;
    			try {
    				time = Integer.parseInt(PropertiesUtil.readValue(TaskSchedulerzIntervalTime));
    				simpleTrigger.setRepeatInterval(time);
    				Scheduler scheduler = quartzScheduler.getScheduler();
    				String jobName = simpleTrigger.getName();
    				String group = simpleTrigger.getGroup();
    				try {
    					scheduler.pauseJob(jobName, group);
    					scheduler.unscheduleJob(jobName,group);
    					scheduler.scheduleJob(simpleTrigger);
    					scheduler.resumeJob(jobName, group);
    					flag = true;
    				} catch (SchedulerException e1) {
    					e1.printStackTrace();
    				}
    			} catch (NumberFormatException e) {
    				System.out.println("定时任务非数字!

    "); e.printStackTrace(); } } return flag; }


    当中,quartzScheduler和simpleTrigger是注入进去的,在Spring中整合Quartz时已经定义好,配置文件例如以下
    <bean name="quartzScheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
    		<property name="triggers">
    			<list>
    				<ref bean="simpleTrigger" />
    			</list>
    		</property>
    		<property name="configLocation" value="classpath:quartz.properties" />
    	</bean>
    	<bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean">
    		<property name="jobDetail">
    			<ref bean="jobDetail" />
    		</property>
    		<property name="startDelay">
    			<value>0</value>
    		</property>
    		<property name="repeatInterval" value="${taskSchedulerzIntervalTime}" />
    	</bean>
    
    
    	<bean id="jobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
    		<property name="targetObject" ref="taskScheduler" />
    		<property name="targetMethod" value="run" />
    	</bean>

    之前的调度时间是在里面写死的。如今是通过配置文件来读取。例如以下

    <context:property-placeholder location="classpath:config.properties,classpath:jdbc.properties" />

    測试例如以下



  • 相关阅读:
    剑指 Offer 46. 把数字翻译成字符串
    剑指 Offer 45. 把数组排成最小的数
    1319.连通网络的操作次数-并查集
    数字序列中某一位的数字
    989.数组形式的整数加法
    java多线程
    剑指offer 48 -最长不含重复字符的子字符串 动态规划
    springboot 使用 lombok插件中的@data 注解
    netty 转发服务
    在静态方法中获取properties /yml 配置文件中的信息
  • 原文地址:https://www.cnblogs.com/gcczhongduan/p/5046414.html
Copyright © 2011-2022 走看看