Quartz实现定时功能
---------------------------------博主讲废话
在自己实现爬取某个网站的信息后,发现,如果要自己每次把程序跑一遍不太现实(麻烦),所以有没有什么可以实现
定时的功能,只要程序开着,他就会每天某个时间自动爬取网站信息的。于是乎,百度了一下,发现其实已经有前辈实现了。
Quartz,一款任务调度框架。现在就写下这篇文章,记录一下Quartz简单实现。和结合上次的发送邮件,实现定时发送(虽然
各大邮箱本身都有这样的功能)。
---------------------------------环境配置
架包下载地址:http://www.quartz-scheduler.org/downloads/
引入必要的包:

以下代码所有涉及的包展示:

---------------------------------一个简单的例子
需要定时执行的代码:
import java.text.SimpleDateFormat;
import java.util.Date;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException; public class HelloJob implements Job
{
public void execute(JobExecutionContext context)
throws JobExecutionException { System.out.println("Hello Quartz!"+new Date());
} }
如何实现定时执行的代码:
import static org.quartz.JobBuilder.newJob;
import static org.quartz.SimpleScheduleBuilder.simpleSchedule;
import static org.quartz.TriggerBuilder.newTrigger; import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.Trigger;
import org.quartz.impl.StdSchedulerFactory; public class QuartzTest2 { public static void main(String[] args) {
try {
//创建scheduler
Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler(); //定义一个Trigger
Trigger trigger = newTrigger().withIdentity("trigger1", "group1") //定义name/group
.startNow()//一旦加入scheduler,立即生效
.withSchedule(simpleSchedule() //使用SimpleTrigger
.withIntervalInSeconds(3) //每隔3秒执行一次
.repeatForever()) //一直执行,奔腾到老不停歇
.build(); //定义一个JobDetail
JobDetail job = newJob(HelloJob.class) //定义Job类为HelloQuartz类,这是真正的执行逻辑所在
.withIdentity("job1", "group1") //定义name/group
.usingJobData("name", "quartz") //定义属性
.build(); //加入这个调度
scheduler.scheduleJob(job, trigger); //启动之
scheduler.start(); //运行一段时间后关闭
//Thread.sleep(10000);
//scheduler.shutdown(true);
} catch (Exception e) {
e.printStackTrace();
}
} }
每隔三秒执行一次的效果展示:

--------------------------------定时发送邮件的例子
具体邮件代码如何实现参考:http://www.cnblogs.com/jinxiaohang/p/7467954.html
需要定时执行的代码:
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Properties; import javax.mail.Address;
import javax.mail.Message;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage; import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException; import com.sun.mail.util.MailSSLSocketFactory; public class HelloJob implements Job
{
public void execute(JobExecutionContext context)
throws JobExecutionException { System.out.println("Hello Quartz!"+new Date());
try {
Properties props = new Properties(); // 开启debug调试
props.setProperty("mail.debug", "true");
// 发送服务器需要身份验证
props.setProperty("mail.smtp.auth", "true");
// 设置邮件服务器主机名
props.setProperty("mail.host", "smtp.qq.com");
// 发送邮件协议名称
props.setProperty("mail.transport.protocol", "smtp"); // 开启SSL加密,否则会失败
MailSSLSocketFactory sf = new MailSSLSocketFactory();
sf.setTrustAllHosts(true);
props.put("mail.smtp.ssl.enable", "true");
props.put("mail.smtp.ssl.socketFactory", sf); // 创建session
Session session = Session.getInstance(props); // 创建邮件
Message msg = new MimeMessage(session);
// 设置标题
msg.setSubject("测试邮件");
// 编辑内容
StringBuilder builder = new StringBuilder();
builder.append("这是一封java mail测试邮件\n");
builder.append("这是第二行");
builder.append("\n时间 " + getStringDate());
// 设置内容
msg.setText(builder.toString());
// 发送的邮箱地址
msg.setFrom(new InternetAddress("19******07@qq.com"));
// 通过session得到transport对象
Transport transport = session.getTransport();
// 连接邮件服务器:邮箱类型,帐号,授权码代替密码(更安全)
transport.connect("smtp.qq.com", "191*****07@qq.com", "ufiaq******jia");//隐私信息已替换
// 发送邮件
transport.sendMessage(msg, new Address[] { new InternetAddress("120*******08@qq.com") });//隐私信息已替换
transport.close();
} catch (Exception e) {
System.out.println("邮件发送失败!!");
} } /**
* 获取当前时间
* @return String
*/
public static String getStringDate() {
Date currentTime = new Date();
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String dateString = formatter.format(currentTime);
return dateString;
} }
如何实现定时执行的代码:
import static org.quartz.JobBuilder.newJob;
import static org.quartz.TriggerBuilder.newTrigger; import org.quartz.CronScheduleBuilder;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.Trigger;
import org.quartz.impl.StdSchedulerFactory; public class QuartzTest2 { public static void main(String[] args) {
try {
//创建scheduler
Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler(); //方法二:定义一个Trigger
Trigger trigger = newTrigger().withIdentity("trigger1", "group1") //定义name/group
.startNow()//一旦加入scheduler,立即生效
.withSchedule(CronScheduleBuilder.cronSchedule("0 10 9 ? * *")) //每天9:10执行
.build(); //定义一个JobDetail
JobDetail job = newJob(HelloJob.class) //定义Job类为HelloQuartz类,这是真正的执行逻辑所在
.withIdentity("job1", "group1") //定义name/group
.usingJobData("name", "quartz") //定义属性
.build(); //加入这个调度
scheduler.scheduleJob(job, trigger); //启动之
scheduler.start(); //运行一段时间后关闭
//Thread.sleep(10000);
//scheduler.shutdown(true);
} catch (Exception e) {
e.printStackTrace();
}
} }
效果展示:

---------------------------------感想
已经将爬虫改成网页版的,通过接口(servlet实现)启动爬虫,爬取信息,然后返回信息,每次运行耗费时间多(半分钟才有返回数据)。部署在服务器上的网页版爬虫如何实现启动、和每隔10分钟定爬取信息并持久化数据库,然后通过接口直接读取存储在数据库的最新数据。后者的实现大大提高获取信息的速度吧,需要尽快实现一下。
谢谢各位阅读。
Quartz实现定时功能的更多相关文章
- quartz实现定时功能实例详解(servlet定时器配置方法)
Quartz是一个完全由java编写的开源作业调度框架,下面提供一个小例子供大家参考,还有在servlet配置的方法 Quartz是一个完全由java编写的开源作业调度框架,具体的介绍可到http:/ ...
- spring和Quartz的定时功能
一:前沿 最近在做一个定时的功能,就是在一定时间内查询订单,然后告诉用户未付款,已付款等消息通知,而且要做集群的功能,这个集群的功能是指,我部署两套代码,其中一个定时的功能在运行,另外一个就不要运行. ...
- Spring注解实现定时功能以及Quartz定时器
一:Spring注解实现--------->Spring3.0以后自带的task,可以将它看成一个轻量级的Quartz 1:maven配置: <!-- quartz--> <d ...
- 用abp vNext快速开发Quartz.NET定时任务管理界面
今天这篇文章我将通过实例代码带着大家一步一步通过abp vNext这个asp.net core的快速开发框架来进行Quartz.net定时任务调度的管理界面的开发.大伙最好跟着一起敲一下代码,当然源码 ...
- Hosted Services+Quartz实现定时任务调度
背景 之前.net core使用quartz.net时,总感觉非常变扭,百度和谷歌了N久都没解决以下问题,造成代码丑陋,非常不优雅: 1.项目启动时,要立刻恢复执行quartz.net中的任务 2.q ...
- linux上Kettle定时执行(转换的单步执行,job的单步执行,环境变量,kettle定时功能,效率问题等)转自(http://blog.csdn.net/feng19821209/article/details/5800960)
1,Kettle跨平台使用. 例如:在AIX下(AIX是IBM商用UNIX操作系统,此处在LINUX/UNIX同样适用),运行Kettle的相关步骤如下: 1)进入到Kettle部署的路径 ...
- [Xcode 实际操作]八、网络与多线程-(20)时间控件Timer定时功能
目录:[Swift]Xcode实际操作 本文将演示时间控件Timer定时功能的使用. 在项目导航区,打开视图控制器的代码文件[ViewController.swift] import UIKit cl ...
- STM32——通用定时器基本定时功能
STM32——————通用定时器基本定时功能 1. ...
- Unity 游戏框架搭建 2019 (四十二、四十三) MonoBehaviour 简化 & 定时功能
MonoBehaviour 简化 在前两篇,我们完成了第九个示例.为了完善第九个示例,我们复习了类的继承,又学习了泛型和 params 关键字. 我们已经接触了类的继承了.接触继承之前,把类仅仅当做是 ...
随机推荐
- iOS 计步器的几种实现方式
代码地址如下:http://www.demodashi.com/demo/11658.html 这篇文章介绍两种可以获取计步数据的方法,一种是采用CMPedometer获取手机计步器数据,另一种是采用 ...
- 使用 Google 高级搜索的一些技巧
一,GOOGLE简介 Google(www.google.com)是一个搜索引擎,由两个斯坦福大学博士生Larry Page与Sergey Brin于1998年9月发明,Google Inc. 于 ...
- CentOS7下利用init.d启动脚本实现tomcat开机自启动
在之前的博文中已经对CentOS7下通过tomcat进行WEB系统的发布进行了介绍,今天将利用init.d启动脚本,将服务脚本加入到开机启动服务队列,实现tomcat服务的开机启动. 1. 环境准备 ...
- unity, Invoke延迟执行
参考:http://blog.christianhenschel.com/2013/05/15/how-to-do-delayed-function-calls-in-unity3d-one-line ...
- unity,实现屏幕后处理的两种方法
方法一: Main Camera的Target Texture保持为None.挂一个Blit脚本,在其中的OnRenderImage中调用Graphics.Blit(sourceTexture,des ...
- xilinx平台DDR3设计教程之仿真篇_中文版教程
https://wenku.baidu.com/view/ac32c8bcf705cc1754270923.html https://wenku.baidu.com/view/1d665697f185 ...
- python-class(3)
#!/usr/bin/env python #-*- coding:utf-8 -*- ############################ #File Name: class3.py #Auth ...
- codeblocks设置当前行高亮
默认是不开启当前行高亮的. 如果想打开,选择:Settings>Editor>Editor Settings>Other options> 勾选Highlight line u ...
- linux 命令之 ping
ping命令主要用于检測主机的连通性. 语法: ping [-dfnqrRv] [-c <完毕次数>] [-i <间隔秒数>] [-I <网络接口>] [-l &l ...
- windows 下node版管理
linux 下的node 多版本管理有nvm,windows 下同样有这样的工具gnvm 安装步骤(无node环境): 1.下载并解压缩 gnvm.exe 保存到任意文件夹,并将此文件夹加入到环境变量 ...