外观
spring
1220字约4分钟
2020-09-06
定时
Quartz
- spring-quartz.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<!-- 添加调度的任务bean 配置对应的class-->
<bean id="myScheduleTest" class="com.osy.task.MyScheduleTest" />这个是我们要执行任务的类
<!--配置调度具体执行的方法-->
<bean id="myPrintDetail"
class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject" ref="myScheduleTest" />执行的类名
<property name="targetMethod" value="mySchedule" />执行的方法
<property name="concurrent" value="false" />
</bean>
<!--配置调度执行的触发的时间-->
<bean id="myPrintTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<property name="jobDetail" ref="myPrintDetail" />
<property name="cronExpression">
<!-- 每天早上8点执行任务调度 -->
<value>0/5 * * * * ? </value>
</property>
</bean>
<!-- quartz的调度工厂 调度工厂只能有一个,多个调度任务在list中添加 -->
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<!-- 所有的调度列表-->
<ref local="myPrintTrigger" />
</list>
</property>
</bean>
</beans>- class
public class MyScheduleTest {
public void mySchedule(){
System.out.println("spring-quqrz的使用");
}
}- web.xml
<!-- Spring MVC servlet -->
<servlet>
<servlet-name>SpringMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mvc.xml,classpath:spring-quartz.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
<async-supported>true</async-supported>
</servlet>spring task
- spring-mvc.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:task="http://www.springframework.org/schema/task"
xsi:schemaLocation="http://www.springframework.org/schema/task
http://www.springframework.org/schema/task/spring-task-3.1.xsd ">
<context:component-scan base-package="com.osy"/>
<task:annotation-driven scheduler="scheduler" executor="executor"/>
<task:executor id="executor" pool-size="5" />
<task:scheduler id="scheduler" pool-size="10" />
</beans>- class
@Component
public class FlightTrainTask {
@Scheduled(cron = "0/5 * * * * ? ") // 间隔5秒执行
public void taskCycle() {
System.out.println("使用SpringMVC框架配置定时任务");
}
}Uncode Schedule(分布式定时)
- spring-task
<!-- 分布式任务管理器 -->
<bean id="zkScheduleManager" class="cn.uncode.schedule.ZKScheduleManager"
init-method="init">
<property name="zkConfig">
<map>
<entry key="zkConnectString" value="127.0.0.1:2181" />
<entry key="rootPath" value="/uncode/schedule" />
<entry key="zkSessionTimeout" value="60000" />
<entry key="userName" value="ScheduleAdmin" />
<entry key="password" value="password" />
<entry key="isCheckParentPath" value="true" />
<entry key="ipBlacklist" value="127.0.0.2,127.0.0.3" />
</map>
</property>
</bean>
<!-- Spring bean配置 -->
<bean id="taskObj" class="cn.uncode.schedule.SimpleTask"/>
<!-- Spring task配置 -->
<task:scheduled-tasks scheduler="zkScheduleManager">
<task:scheduled ref="taskObj" method="print" fixed-rate="5000"/>
</task:scheduled-tasks>- 管理后台
<servlet>
<servlet-name>UncodeSchedule</servlet-name>
<servlet-class>cn.uncode.schedule.web.ManagerServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>UncodeSchedule</servlet-name>
<url-pattern>/uncode/schedule</url-pattern>
</servlet-mapping>- Quartz
<bean id="zkScheduleManager" class="cn.uncode.schedule.ZKScheduleManager"
init-method="init">
<property name="zkConfig">
<map>
<entry key="zkConnectString" value="183.131.76.147:2181" />
<entry key="rootPath" value="/uncode/schedule" />
<entry key="zkSessionTimeout" value="60000" />
<entry key="userName" value="ScheduleAdmin" />
<entry key="password" value="password" />
<entry key="autoRegisterTask" value="true" />
<entry key="ipBlacklist" value="127.0.0.2,127.0.0.3" />
</map>
</property>
</bean>
<bean id="taskObj" class="cn.uncode.schedule.SimpleTask"/>
<!-- 定义调用对象和调用对象的方法 -->
<bean id="jobtask" class="cn.uncode.schedule.quartz.MethodInvokingJobDetailFactoryBean">
<!-- 调用的类 -->
<property name="targetObject" ref="taskObj" />
<!-- 调用类中的方法 -->
<property name="targetMethod" value="print" />
</bean>
<!-- 定义触发时间 -->
<bean id="doTime" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<property name="jobDetail">
<ref bean="jobtask"/>
</property>
<!-- cron表达式 -->
<property name="cronExpression">
<value>0/3 * * * * ?</value>
</property>
</bean>
<!-- 总管理类 如果将lazy-init='false'那么容器启动就会执行调度程序 -->
<bean id="startQuertz" lazy-init="false" autowire="no" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="doTime"/>
</list>
</property>
</bean>redis(分布式定时)
- spring.xml
<task:executor id="taskExecutor" pool-size="10" />
<task:annotation-driven></task:annotation-driven>- java
@Component
@Slf4j
public class RedisTaskControl {
//@Resource
private RedisTemplate redisTemplate;
private static final String LOCK = "task-job-lock";
private static final String KEY = "tasklock";
/**
* 判断是否能开始任务
* @return
*/
public boolean isStart() {
boolean result = false;
if (null != redisTemplate.opsForValue().get(KEY) && !redisTemplate.opsForValue().get(KEY).equals(LOCK)) {
result = false;
} else {
redisTemplate.opsForValue().set(KEY, LOCK);
result = true;
}
return result;
}
/**
* 关闭任务锁
*/
public void colse() {
if (null != redisTemplate.opsForValue().get(KEY) && redisTemplate.opsForValue().get(KEY).equals(LOCK)) {
redisTemplate.delete(KEY);
}
}
}@Scheduled(cron = "00 00 01 * * ?")
public void synchronizeMain() {
if (redisTaskControl.isStart()) {
}
}日志lombok
- pom.xml
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
<compilerArgs>
<arg>-verbose</arg>
<arg>-Xlint:unchecked</arg>
<arg>-Xlint:deprecation</arg>
<arg>-extdirs</arg>
<arg>${project.basedir}/src/main/webapp/WEB-INF/lib</arg>
</compilerArgs>
<annotationProcessorPaths>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.8</version>
</path>
</annotationProcessorPaths>
</configuration>
</plugin>- logback.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!-- 项目名称 -->
<property name="projectname" value="taikang" />
<!-- 日志存放路径 -->
<property name="log.path" value="../logs/TaiKang" />
<!-- 日志输出格式 -->
<property name="log.pattern" value="%d{yyy-MM-dd HH:mm:ss.SSS} [%X{X-B3-TraceId:-},%X{X-B3-SpanId:-}] [%thread] %-5level %logger{20} - [%method,%line] - %msg%n" />
<!-- 控制台输出 -->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${log.pattern}</pattern>
</encoder>
</appender>
<!-- INFO系统日志输出 -->
<appender name="file_info" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/${projectname}.log</file>
<!-- 循环政策:基于时间创建日志文件 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 日志文件名格式 -->
<fileNamePattern>${log.path}/${projectname}.log</fileNamePattern>
<!-- 日志最大的历史 60天 -->
<maxHistory>60</maxHistory>
</rollingPolicy>
<encoder>
<pattern>${log.pattern}</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<!-- 过滤的级别 -->
<level>INFO</level>
<!-- 匹配时的操作:接收(记录) -->
<onMatch>ACCEPT</onMatch>
<!-- 不匹配时的操作:拒绝(不记录) -->
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- ERROR系统日志输出 -->
<appender name="file_error" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/${projectname}.log</file>
<!-- 循环政策:基于时间创建日志文件 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 日志文件名格式 -->
<fileNamePattern>${log.path}/${projectname}.log</fileNamePattern>
<!-- 日志最大的历史 60天 -->
<maxHistory>60</maxHistory>
</rollingPolicy>
<encoder>
<pattern>${log.pattern}</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<!-- 过滤的级别 -->
<level>ERROR</level>
<!-- 匹配时的操作:接收(记录) -->
<onMatch>ACCEPT</onMatch>
<!-- 不匹配时的操作:拒绝(不记录) -->
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- 系统模块日志级别控制 -->
<logger name="com.loop" level="info" />
<!-- Spring日志级别控制 -->
<logger name="org.springframework" level="warn" />
<root level="info">
<appender-ref ref="console" />
</root>
<!--系统操作日志-->
<root level="info">
<appender-ref ref="file_info" />
<appender-ref ref="file_error" />
</root>
</configuration>