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

news/2024/5/8 16:01:54/文章来源:https://blog.csdn.net/weixin_30268921/article/details/98171896

欢迎访问我的网站http://www.wenzhihuai.com/ 。谢谢啊,如果可以,希望能在GitHub上给个star,GitHub地址https://github.com/Zephery/newblog 。

Quartz

先看一下Quartz的架构图:

11627468_1438829844Zbz8.png

一.特点:

  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设计

  1. properties file
    官网中表明:quartz中使用了quartz.properties来对quartz进行配置,并保留在其jar包中,如果没有定义则默认使用改文件。
    2.Trigger的实现类
    (1)SimpleTrigger
    指某一个时间开始,或者从现在开始以一定的间隔执行任务。
    其属性有
private Date startTime;
private Date endTime;
private Date nextFireTime;
private Date previousFireTime;
private int repeatCount;  //重复次数
private long repeatInterval;//重复间隔
private int timesTriggered;
private boolean complete;

(2)CronTrigger
类似于linux cron中的语法,能够设置任何时间,重复次数等运行。
详情请使用cron表达式来查询。

  1. Job并发

  2. JobListener
    先看一下JobListener的源码:

public interface JobListener {String getName();//某个joblistener的名字void jobToBeExecuted(JobExecutionContext var1);//即将运行void jobExecutionVetoed(JobExecutionContext var1);//运行后void jobWasExecuted(JobExecutionContext var1, JobExecutionException var2);//取消
}

无非就是对某个任务的运行前、运行后、以及取消的侦听。次数使用观察者模式,对人物进行广播侦听。

四、使用

  1. hello world!代码在这
    (1)定义一个job
public class HelloJob implements Job {public void execute(JobExecutionContext context) throws JobExecutionException {System.out.println("Hello World! - " + new Date());}
}

(2)运行(来自官网修改的例子,官网那个例子需要等90秒)。。。坑

public class SimpleExample {public static void main(String[] args) throws Exception {SchedulerFactory sf = new StdSchedulerFactory();Scheduler sched = sf.getScheduler();JobDetail job = JobBuilder.newJob(HelloJob.class).withIdentity("job1", "group1").build();Trigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger1", "group1").startAt(DateTime.now().plusMillis(4).toDate())//固定一个时间,现在设置为程序启动后4秒.build();sched.start();sched.scheduleJob(job, trigger);//启动后要sleep一下,不然立即关闭Thread.sleep(6);sched.shutdown(true);}
}

(3)运行结果:

Hello World! - Mon Sep 11 15:55:53 CST 2017
  1. 自定义监听器
    (1)自定义listener
public class MyJobListener implements JobListener {@Override//相当于为我们的监听器命名public String getName() {return "myJobListener";}@Overridepublic void jobToBeExecuted(JobExecutionContext context) {System.out.println(getName() + "触发对" + context.getJobDetail().getJobClass() + "的开始执行的监听工作,这里可以完成任务前的一些资源准备工作或日志记录");}@Override//“否决JobDetail”是在Triiger被其相应的监听器监听时才具备的能力public void jobExecutionVetoed(JobExecutionContext context) {System.out.println("被否决执行了,可以做些日志记录。");}@Overridepublic void jobWasExecuted(JobExecutionContext context,JobExecutionException jobException) {System.out.println(getName() + "触发对" + context.getJobDetail().getJobClass() + "结束执行的监听工作,这里可以进行资源销毁工作");}}

(2)跟上例一样,只需在Scheduler上增加监听器即可。

JobListener myJobListener = new MyJobListener();
KeyMatcher<JobKey> keyMatcher = KeyMatcher.keyEquals(job.getKey());
sched.getListenerManager().addJobListener(myJobListener, keyMatcher);

(3)结果:

myJobListener触发对class com.quartz.hello.HelloJob的开始执行的监听工作,这里可以完成任务前的一些资源准备工作或日志记录
Hello World! - Mon Sep 11 16:57:56 CST 2017
myJobListener触发对class com.quartz.hello.HelloJob结束执行的监听工作,这里可以进行资源销毁工作或做一些新闻扒取结果的统计工作
  1. 本网站中使用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/>
  1. 最简单的例子,在所需要的函数上添加定时任务即可运行
    @Scheduled(fixedRate = 5000)public void reportCurrentTime() {System.out.println("每隔5秒运行一次" + sdf.format(new Date()));}
  1. 运行的时候会报错:
org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [org.springframework.scheduling.TaskScheduler] is definedat 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)

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

参考:

(1) http://blog.csdn.net/oarsman/article/details/52801877

(2) http://stackoverflow.com/questions/31199888/spring-task-scheduler-no-qualifying-bean-of-type-org-springframework-scheduli
(3)http://blog.csdn.net/qwe6112071/article/details/50991531

希望能在GitHub上给个star,https://github.com/Zephery/newblog,谢谢么么哒(づ ̄ 3 ̄)づ

转载于:https://www.cnblogs.com/w1570631036/p/7505873.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_851009.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

同步、异步方式对SEO搜索引擎优化的影响

本人昨天去面试了&#xff0c;面试官问了这样一个问题“你知道SEO不&#xff1f;同步、异步对SEO有什么影响&#xff1f;”&#xff0c;我当时就懵了&#xff0c;这几个名词SEO、同步、异步我都知道&#xff0c;但是。SEO和同步异步有什么关系呢&#xff1f;面试官人很nice&…

记录使用scrapy爬取新闻网站最新新闻存入MySQL数据库,每天定时爬取自动更新

爬取每天更新的新闻&#xff0c;使用scrapy框架&#xff0c;Python2.7&#xff0c;存入MySQL数据库&#xff0c;将每次的爬虫日志和爬取过程中的bug信息存为log文件下。定义bat批处理文件&#xff0c;添加到计划任务程序中&#xff0c;自动爬取。 额… 1.在items文件中&#x…

6个线上视频音频转换网站

1.Zamzar Zamzar是一项免费的线上转换格式网站&#xff0c;把歌曲、图档、影像和文件转变成不同的格式。其服务特点是高品质的文件格式转换。基本的免费服务&#xff0c;可以让您转换的文件大小为100MB 。如果想拥有更多功能的服务&#xff0c;你可以注册成为基础会员&#xff…

四年大学下那些让我欲罢不能的网站

在本科学习期间&#xff0c;通过Google/百度搜索接触了各种各样的学习网站&#xff0c;收益匪浅&#xff0c;现在来分享一下吧 分为三种类型&#xff0c;“课程网站”&#xff0c;“编程网站”&#xff0c;“社区网站”&#xff0c;贵精不贵多&#xff0c;每种分享几个 课程网站…

Github Pages + jekyll 全面介绍极简搭建个人网站和博客

本文将会全面介绍一下如何使用Github Pages jekyll搭建个人站点&#xff0c;所谓极简的意思就是不用使用git和本地构建jekll服务&#xff0c;直接在Github网站上编辑设置即可&#xff0c;但会涉及到jekll的一些配置和编程控制。可以参看我的网站模板&#xff1a;https://scott…

css可以对网页干什么,css对网页的优势-专业SEO技术教程(33)

css对网页的优势-专业SEO技术教程(33)采用css布局相对于传统的table网页布局的显著优势1.表现和内容相分离将设计部分剥离出来的放在一个独立样式文件中&#xff0c;HTML文件中只存放文本信息。这样的页面对搜索引擎更加友好。2.提高页面浏览速度对于同一个页面视觉效果&#x…

【转载】IIS网站如何同时解析带www和不带www的域名

针对公网上线的网站系统&#xff0c;很多网站的域名会同时含有带www和不带www的域名解析记录&#xff0c;如果需要同时解析带www和不带www的域名信息&#xff0c;则需要在相应的域名解析平台(如阿里云域名解析平台、腾讯云域名解析平台)设置不带www的主域名以及带www的域名解析…

搜索引擎优化:常用的SEO六个指标

在做网站推广过程中&#xff0c;搜索引擎优化是一个重要点&#xff0c;绝大部分行业来自自然搜索的流量都是非常大的&#xff0c;正因为如此&#xff0c;一般企业隔一段时间就对网站自然搜索的情况作一个KPI考核&#xff0c;而这些重点指标不外乎&#xff1a;网页的收录数量、网…

阿里云上发布自己的网站的方法

在阿里云上发布自己的网站的方法&#xff1a; 一、在阿里云上发布自己的网站的方法&#xff1a; 进入我的电脑&#xff0c;在头部输入ftp&#xff1a;//60.205.48.122&#xff08;IP地址为自己注册的阿里云账号上的IP地址&#xff09; 进入以后登录自己的账号 用户名&#x…

java使用HttpURLConnection检索网站时403错误处理方式

java使用HttpURLConnection检索网站时403错误处理方式: 我们通过代码方式访问网站时会报错&#xff1a; 此种情况分2中类型&#xff0c; 1.需要登录才可以访问&#xff1b; 2.需要设置User-Agent来欺骗服务器。 connection.setRequestProperty("User-Agent", &qu…

解决某些网站,图片不能下载

如下图&#xff0c;右键图片&#xff0c;没有保存图片的选项 按下F12 拷贝src中的地址&#xff0c;输入到浏览器&#xff0c;这时候就可以保存图片了

给duckling网站加上cnzz网站统计信息

第一&#xff0c;注册cnzz帐号&#xff0c;网址http://www.cnzz.com/ 第二&#xff0c;登录帐号&#xff0c;获取代码&#xff1b; 第三&#xff0c;根据自己的需要&#xff0c;将代码加入网站的公共页面&#xff0c;比如说head、foot、version页面都可以。 第四&#xff0c…

网站压力测试工具Jmeter安装与使用

系统是Windows XP 配置此工具前&#xff0c;需要先在机器上安装jdk 如下是在jdk1.7的基础上配置的&#xff1b; 安装步骤如下&#xff1a; 第一步&#xff1a;解压apache-jmeter-2.8.zip文件至c盘&#xff0c;本文解压至C:\jmeter2.8目录下。 第二步&#xff1a;桌面上选择“我…

十大抢手的网站压力测试工具

原文链接&#xff1a;http://blog.163.com/weiwenjuan_bj/blog/static/1403503362010621111052355/ 两天&#xff0c;jnj在本站发布了《如何在低速率网络中测试 Web 应用》&#xff0c;那是测试网络不好的情况。而下面是十个免费的可以用来进行Web的负载/压力测试的工具&#x…

使用WinSCP 上传 jeecms 到linux centos中 显示乱码问题,网站无法使用的解决方法

第一、设置WinSCP上传时的编码为utf-8如下&#xff1a; 第二、将linux的默认字符集设置为zh_CN.UTF-8 vi /etc/sysconfig/i18n 内容如下&#xff1a; LANG"zh_CN.UTF-8" SUPPORTED"zh_CN.UTF-8:zh_CN:zh" SYSFONT"latarcyrheb-sun16" [rootcan…

如何使用firefox浏览器查看记住的网站密码

工具——》选项——》安全 如下图&#xff1a; 点击就出现浏览器记住的登录网站、帐号、密码了&#xff0c;密码是明码。

如何使用遨游浏览器查看记住的网站密码

点击“显示密码”即可&#xff0c;密码是明码&#xff01;

tomcat部署多个项目,通过不同域名解析访问不同的网站

win7、tomcat8、jdk1.7 第一&#xff1a;通过配置hosts文件模拟&#xff0c;hosts文件所在路径&#xff1a;C:\Windows\System32\drivers\etc 修改如下&#xff1a; #测试tomcat配置多个项目&#xff0c;用二级域名访问 127.0.0.1 www.ibelieve.com 127.0.0.1 bbs.ib…

.NET中实现网站的国际化

本文适当的修改了原文&#xff0c;&#xff0c;特此说明 原文地址&#xff1a;http://dotnet.9sssd.com/aspnet/art/949 网站在开发的过程中需要实现多语言版本&#xff0c;我们暂且认为有英语和汉语两个版本。网站结构包括&#xff0c;UI过程&#xff0c;rest服务&#xff0…

人生苦短,我用Python(二)— 爬取会议网站 EasyChair Smart CFP

寒假留校帮学长写了个爬虫&#xff0c;抓取会议网站上一些CFP信息。想着把一些知识点、坑点记下来&#xff0c;一来做个小总结给工作收收尾&#xff0c;二是以后再遇到好从容应对。 这是我写的第二个比较完善的爬虫了&#xff0c;比第一个要简单许多&#xff0c;完全过程化的代…