zoukankan      html  css  js  c++  java
  • 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测试邮件
    ");
                builder.append("这是第二行");
                builder.append("
    时间 " + 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分钟定爬取信息并持久化数据库,然后通过接口直接读取存储在数据库的最新数据。后者的实现大大提高获取信息的速度吧,需要尽快实现一下。

    谢谢各位阅读。

  • 相关阅读:
    查询详细信息和删除记录
    软件开发过程中常用到的一些工具
    无服务器端的UDP群聊功能剖析(WCF版)
    vim插件使用
    C#中ConnectionStrings和AppSettings的区别
    《Effective C++》简明笔记上
    设计模式的一些所想所得
    对RESTful Web API的理解与设计思路
    js加载脚
    OSGi.NET 学习笔记 [模块可扩展支持][概念][实例]
  • 原文地址:https://www.cnblogs.com/jinxiaohang/p/7573255.html
Copyright © 2011-2022 走看看