谈谈个人网站的建立(三)—— 定时任务

Quartz

先看一下Quartz的架构图:

</div>

一.特点:

  1. 强大的调度功能,例如支持丰富多样的调度方法,可以满足各种常规及特殊需求;
  2. 灵活的应用方式,例如支持任务和调度的多种组合方式,支持调度数据的多种存储方式;
  3. 分布式和集群能力。

二.主要组成部分

  1. JobDetail:需实现该接口定义的人物,其中JobExecutionContext提供了上下文的各种信息。
  2. JobDetail:QUartz的执行任务的类,通过newInstance的反射机制实例化Job。
  3. Trigger: Job的时间触发规则。主要有SimpleTriggerImpl和CronTriggerImpl两个实现类。
  4. Calendar:org.quartz.Calendar和java.util.Calendar不同,它是一些日历特定时间点的集合(可以简单地将org.quartz.Calendar看作java.util.Calendar的集合——java.util.Calendar代表一个日历时间点,无特殊说明后面的Calendar即指org.quartz.Calendar)。
  5. Scheduler:由上图可以看出,Scheduler是Quartz独立运行的容器。其中,Trigger和JobDetail可以注册到Scheduler中。
  6. ThreadPool:Scheduler使用一个线程池作为任务运行的基础设施,任务通过共享线程池中的线程提高运行效率。三、Quartz设计
  7. properties fileundefined官网中表明:quartz中使用了quartz.properties来对quartz进行配置,并保留在其jar包中,如果没有定义则默认使用改文件。

四、使用

  1. hello world!代码在这

本网站中使用quartz来对数据库进行备份,与Spring结合

(1)导入spring的拓展包,其协助spring集成第三方库:邮件服务、定时任务、缓存等。。。

<dependency>
 <groupId>org.springframework</groupId>
 <artifactId>spring-context-support</artifactId>
 <version>4.2.6.RELEASE</version>
</dependency>

(2)导入quartz包

<dependency>
 <groupId>org.quartz-scheduler</groupId>
 <artifactId>quartz</artifactId>
 <version>2.3.0</version>
</dependency>

(3)mysql远程备份

使用命令行工具仅仅需要一行:

mysqldump -u [username] -p[password] -h [hostip] database > file

但是java不能直接执行linux的命令,仍旧需要依赖第三方库ganymed

<dependency>
 <groupId>ch.ethz.ganymed</groupId>
 <artifactId>ganymed-ssh2</artifactId>
 <version>262</version>
</dependency>

完整代码如下:

@Component("mysqlService")//在spring中注册一个mysqlService的Bean
public class MysqlUtil {
 ...
 StringBuffer sb = new StringBuffer();
 sb.append("mysqldump -u " + username + " -p" + password + " -h " + host + " " +
         database + " >" + file);
 String sql = sb.toString();
 Connection connection = new Connection(s_host);
 connection.connect();
 boolean isAuth = connection.authenticateWithPassword(s_username, s_password);//进行远程服务器登陆认证
 if (!isAuth) {
     logger.error("server login error");
 }
 Session session = connection.openSession();
 session.execCommand(sql);//执行linux语句
 InputStream stdout = new StreamGobbler(session.getStdout());
 BufferedReader br = new BufferedReader(new InputStreamReader(stdout));
 ...
}

(4)spring中配置quartz

<bean id="jobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
 <property name="targetObject" ref="mysqlService"/>
 <property name="targetMethod" value="exportDataBase"/>
</bean>
<!--定义触发时间  -->
<bean id="myTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
 <property name="jobDetail" ref="jobDetail"/>
 <!-- cron表达式,每周五2点59分运行-->
 <property name="cronExpression" value="0 59 2 ? * FRI"/>
</bean>
<!-- 总管理类 如果将lazy-init='false'那么容器启动就会执行调度程序 -->
<bean id="scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
 <property name="triggers">
     <list>
         <ref bean="myTrigger"/>
     </list>
 </property>
</bean>

(5)java完整文件在这

Spring的高级特性之定时任务

java ee项目的定时任务中除了运行quartz之外,spring3+还提供了task,可以看做是一个轻量级的Quartz,而且使用起来比Quartz简单的多。

(1)spring配置文件中配置:

<task:annotation-driven/>

(2)最简单的例子,在所需要的函数上添加定时任务即可运行

    @Scheduled(fixedRate = 5000)
    public void reportCurrentTime() {
        System.out.println("每隔5秒运行一次" + sdf.format(new Date()));
    }

(3)运行的时候会报错:

org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [org.springframework.scheduling.TaskScheduler] is defined
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:372)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:332)
	at org.springframework.scheduling.annotation.ScheduledAnnotationBeanPostProcessor.finishRegistration(ScheduledAnnotationBeanPostProcessor.java:192)
	at org.springframework.scheduling.annotation.ScheduledAnnotationBeanPostProcessor.onApplicationEvent(ScheduledAnnotationBeanPostProcessor.java:171)
	at org.springframework.scheduling.annotation.ScheduledAnnotationBeanPostProcessor.onApplicationEvent(ScheduledAnnotationBeanPostProcessor.java:86)
	at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:163)
	at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:136)
	at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:380)

参考:http://blog.csdn.net/oarsman/article/details/52801877

http://stackoverflow.com/questions/31199888/spring-task-scheduler-no-qualifying-bean-of-type-org-springframework-scheduli

Spring的定时任务调度器会尝试获取一个注册过的 task scheduler来做任务调度,它会尝试通过BeanFactory.getBean的方法来获取一个注册过的scheduler bean,获取的步骤如下:

1.尝试从配置中找到一个TaskScheduler Bean

2.寻找ScheduledExecutorService Bean

3.使用默认的scheduler

修改log4j.properties即可:

log4j.logger.org.springframework.scheduling=INFO

其实这个功能不影响定时器的功能。

(4)结果:

每隔5秒运行一次14:44:34
每隔5秒运行一次14:44:39
每隔5秒运行一次14:44:44

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏阿杜的世界

Spring Boot with Redis

Spring Boot是为了简化Spring开发而生,从Spring 3.x开始,Spring社区的发展方向就是弱化xml配置文件而加大注解的戏份。最近召开的S...

722
来自专栏Ryan Miao

SpringCloud学习2-Springboot监控模块(actuator)

前言 学习一项新技术最大的困难是什么? 是资料。让人高兴的是找到了一本系统学习Spring Cloud的教程,《Spring Cloud微服务实战》, 接下来的...

1.1K11
来自专栏积累沉淀

JNDI数据库连接池

JNDI的全称是java命名与目录接口(Java Naming and Directory Interface),是一个应用程序设计的API,为开发人员提供了查...

1795
来自专栏Ryan Miao

在dropwizard中使用feign,使用hystrix

前言 用惯了spring全家桶之后,试试dropwizard的Hello World也别有一帆风味。为了增强对外访问API的能力,需要引入open feign...

34312
来自专栏程序猿DD

Spring Cloud实战小贴士:turbine如何聚合设置了context-path的hystrix数据

之前在spring for all社区看到这样一个问题:当actuator端点设置了context-path之后,turbine如何聚合数据?首先,我们要知道a...

2707
来自专栏高性能服务器开发

(五)如何编写高性能日志

一、服务器端日志与客户端日志的区别 在正式讲解之前,我们先来看一个日志类的实现方法,这个日志类也是代表着大多数客户端日志的主流写法: /** *@desc:...

3248
来自专栏xingoo, 一个梦想做发明家的程序员

Java程序员的日常——经验贴(纯干货)二

继昨天的经验贴,今天的工作又收获不少。 windows下编辑器会给文件添加BOM 在windows的编辑器中,为了区分编码,通常会添加一个BOM标记。比如...

1929
来自专栏张善友的专栏

当调用GetAuthorizationGroups() 的错误-“试图访问卸载的应用程序域“(Exception from HRESULT: 0x80131014)解决方案

针对 Windows® 平台,Microsoft 提供了三个主要目录平台:Active Directory® 域服务、每台 Windows 计算机上的本地安全帐...

1927
来自专栏程序员的SOD蜜

消息服务框架使用案例之--大文件上传(断点续传)功能

消息服务框架使用案例之--大文件上传(断点续传)功能 一、分块上传和断点续传原理 在我们的一个产品应用中,客户需要上传大量的文件到服务器,其中不乏很大的视频文件...

3535
来自专栏SpringBoot 核心技术

第三十九章:基于SpringBoot & Quartz完成定时任务分布式单节点持久化

31710

扫描关注云+社区