企业定时任务调度器Quartz,定时查询数据库(这里还需要继续做研究)

简介:    看到楼下各位兄弟的批评指正后,确实对我很有启发,任务如果都以配置的形式出现,在项目中是很利于维护的,所以,稍作修改,呵呵。  首先要做QuartzJob定时任务类了,这个类要实现的是Job接口,然后重写execute方法,方法中就是执行你具体要做的事情了。不过首先需要一个配置文件,里面定义了一些参数,是Quartz的一些配置。配置文件如下  Java代码  
+关注继续查看
   看到楼下各位兄弟的批评指正后,确实对我很有启发,任务如果都以配置的形式出现,在项目中是很利于维护的,所以,稍作修改,呵呵。 

首先要做QuartzJob定时任务类了,这个类要实现的是Job接口,然后重写execute方法,方法中就是执行你具体要做的事情了。不过首先需要一个配置文件,里面定义了一些参数,是Quartz的一些配置。配置文件如下 
Java代码  收藏代码
  1. #============================================================================  
  2. # Configure Main Scheduler Properties    
  3. #============================================================================  
  4. org.quartz.scheduler.instanceName = QuartzScheduler  
  5. org.quartz.scheduler.instanceId = AUTO  
  6.   
  7. #============================================================================  
  8. # Configure ThreadPool    
  9. #============================================================================  
  10. org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool  
  11. org.quartz.threadPool.threadCount = 3  
  12. org.quartz.threadPool.threadPriority = 5  
  13.   
  14. #===============================================================  
  15. #Configure JobStore  
  16. #===============================================================  
  17. org.quartz.jobStore.misfireThreshold = 60000  
  18. org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore  
  19.   
  20. #============================================================================  
  21. # Configure Plugins   
  22. #============================================================================  
  23. #org.quartz.plugin.triggHistory.class = org.quartz.plugins.history.LoggingJobHistoryPlugin  
  24. org.quartz.plugin.jobInitializer.class = org.quartz.plugins.xml.JobInitializationPlugin  
  25. org.quartz.plugin.jobInitializer.fileName = conf/quartz_jobs.xml  
  26. org.quartz.plugin.jobInitializer.overWriteExistingJobs = true  
  27. org.quartz.plugin.jobInitializer.failOnFileNotFound = true  
  28. org.quartz.plugin.jobInitializer.scanInterval = 60  


即使做成配置,这个类也必须要有,一定会有个Job类,专门做数据分析,有的朋友说配置文件搞定所有,不现实, 
好了,这就是配置文件,接下来我们就要做这个计划类了,这个类执行的是去源数据库中查询数据,并插入目标数据库中,并且不允许有重复。代码如下 

Java代码  收藏代码
  1. package com.bj58.job.servlet;  
  2.   
  3. import java.sql.Connection;  
  4. import java.sql.PreparedStatement;  
  5. import java.sql.ResultSet;  
  6. import java.sql.SQLException;  
  7.   
  8. import org.apache.commons.logging.Log;  
  9. import org.apache.commons.logging.LogFactory;  
  10. import org.quartz.Job;  
  11. import org.quartz.JobExecutionContext;  
  12. import org.quartz.JobExecutionException;  
  13.   
  14. import com.bj58.job.utils.ConnectionFactory_DB_dest;  
  15. import com.bj58.job.utils.ConnectionFactory_DB_src;  
  16.   
  17. /** 
  18.  * 定时任务类 
  19.  * @author zhangwan@58.com 
  20.  * Jun 8, 2010 
  21.  * 
  22.  */  
  23. public class QuartzJob implements Job {  
  24.     private static final Log log = LogFactory.getLog(Job.class);  
  25.     private static final String findSql_src = "select PortalId from t_portalinfo";  
  26.     private static final String findSql_dest = "select userId from t_user";  
  27.     private static final String insertSql_dest = "insert into t_user(userId) values (?)";  
  28.       
  29.     /** 
  30.      * 执行任务方法 
  31.      */  
  32.     @Override  
  33.     public void execute(JobExecutionContext context) throws JobExecutionException {  
  34.         Connection conn_db_src = ConnectionFactory_DB_src.getConnection();  
  35.         Connection conn_db_dest = ConnectionFactory_DB_dest.getConnection();  
  36.         PreparedStatement pstmt_src = null;  
  37.         PreparedStatement pstmt_dest = null;  
  38.         ResultSet rs_src = null;  
  39.         ResultSet rs_dest = null;  
  40.         try {  
  41.             pstmt_src = conn_db_src.prepareStatement(findSql_src);  
  42.             rs_src = pstmt_src.executeQuery();  
  43.   
  44.             pstmt_dest = conn_db_dest.prepareStatement(findSql_dest);  
  45.             rs_dest = pstmt_dest.executeQuery();  
  46.             pstmt_dest = conn_db_dest.prepareStatement(insertSql_dest);  
  47.               
  48.             while(rs_dest.next()) { //第二次或第n次入库,第一次入库的话rs_dest没有结果,所以此段操作都不执行  
  49.                 String userId = rs_dest.getString(1);  
  50.                 while (rs_src.next()) {  
  51.                     String protalId = rs_src.getString(1);  
  52.                     if(userId.equals(protalId)) { //如果两个结果相同,则不进行入库  
  53.                         break;  
  54.                     } else {  
  55.                         pstmt_dest.setString(1, protalId);  
  56.                         pstmt_dest.execute();  
  57.                     }  
  58.                 }  
  59.             }  
  60.               
  61.             while (rs_src.next()) { //如果是第一次入库  
  62.                 String protalId = rs_src.getString(1);  
  63.                 pstmt_dest.setString(1, protalId);  
  64.                 pstmt_dest.execute();  
  65.                   
  66.             }  
  67.             log.info("存储数据...");  
  68.         } catch (SQLException e) {  
  69.             log.info("存储数据出现异常...");  
  70.             e.printStackTrace();  
  71.         } finally {  
  72.             ConnectionFactory_DB_dest.free(rs_dest, pstmt_dest, conn_db_dest);  
  73.             ConnectionFactory_DB_src.free(rs_src, pstmt_src, conn_db_src);  
  74.             log.info("数据库连接已经关闭...");  
  75.         }  
  76.   
  77.     }  
  78. }  

这里一次性查出了源数据库中所有字段,因为源数据库表中的数据最多不会超过10000条,我在做测试的时候,在本机上发现一次查询10W条也不会出现结果集溢出情况,所以这里就忽略这个问题了。 

然后需要这么个配置文件quartz_jobs.xml,内容如下 
Java代码  收藏代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <quartz>  
  3.     <job>  
  4.         <job-detail>  
  5.             <name>PortalInfoJob</name>  
  6.             <group>PortalInfo</group>  
  7.             <job-class>com.bj58.portalcrm.web.job.PortalInfoJob</job-class>  
  8.         </job-detail>  
  9.         <trigger>  
  10.             <cron>  
  11.                 <name>PORTALINFO</name>  
  12.                 <job-name>PortalInfoJob</job-name>  
  13.                 <job-group>PortalInfo</job-group>  
  14.                 <cron-expression>0 0 1 * * ?</cron-expression>  
  15.             </cron>  
  16.         </trigger>  
  17.     </job>  
  18. </quartz>  


ok,最后就是web.xml文件配置一下,Quartz提供了个初始化的Servlet,呵呵,内容如下 
Java代码  收藏代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <web-app version="2.4"   
  3.     xmlns="http://java.sun.com/xml/ns/j2ee"   
  4.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   
  5.     xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee   
  6.     http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">  
  7.       
  8.     <welcome-file-list>  
  9.         <welcome-file>index.jsp</welcome-file>  
  10.     </welcome-file-list>  
  11.     
  12.     <!-- Quartz配置计划 -->  
  13.     <servlet>     
  14.          <servlet-name>QuartzInitializer</servlet-name>     
  15.          <servlet-class>org.quartz.ee.servlet.QuartzInitializerServlet</servlet-class>     
  16.          <load-on-startup>1</load-on-startup>     
  17.          <init-param>     
  18.              <param-name>config-file</param-name>     
  19.              <param-value>/quartz.properties</param-value>     
  20.          </init-param>     
  21.          <init-param>     
  22.              <param-name>shutdown-on-unload</param-name>     
  23.              <param-value>true</param-value>     
  24.          </init-param>     
  25.     </servlet>  
  26. </web-app>  

这样就搞定了,
目录
相关文章
|
24天前
|
消息中间件 算法 Java
定时任务实现方案总结
定时任务实现方案总结
22 0
定时任务实现方案总结
|
4月前
|
负载均衡 Java 数据挖掘
定时任务实现的几种方式
定时任务实现的几种方式
157 1
|
10月前
|
小程序 调度 数据库
jeecg-boot集成xxl-job调度平台,每秒/每分钟/手动都能执行成功,但是设置固定时间不触发?
jeecg-boot集成xxl-job调度平台,每秒/每分钟/手动都能执行成功,但是设置固定时间不触发?
401 0
jeecg-boot集成xxl-job调度平台,每秒/每分钟/手动都能执行成功,但是设置固定时间不触发?
|
存储 负载均衡 监控
分布式定时任务,你了解多少?基于Quartz实现分布式定时任务解决方案!
定时任务系统在应用平台中的重要性不言而喻,特别是互联网电商、金融等行业更是离不开定时任务。在任务数量不多、执行频率不高时,单台服务器完全能够满足。但是随着业务逐渐增加,定时任务系统必须具备高可用和水平扩展的能力,单台服务器已经不能满足需求。因此需要把定时任务系统部署到集群中,实现分布式定时任务系统集群。
2957 1
分布式定时任务,你了解多少?基于Quartz实现分布式定时任务解决方案!
Quartz3定时任务学习之异步调度器
Quartz3定时任务学习之异步调度器 Quartz3与Quartz2的主要区别有两点: 1,Quartz3将它的资源类库拆的更细了,比如,想使用Quartz3开发,最少要引用Quartz,Quartz.Jobs,Quartz.Plugins这三个类库。 2,Quartz3整体上使用的是异步创建实例,所以我们使用时就必须要async,await的语法。 下面我们用Quartz3来做一个任务调度。
Quartz3定时任务学习之异步调度器
quartz获取定时任务下次执行的时间
quartz很多人都会用,但需要配置cronExpression. 这个cronExpression很多技术人员都要配置,但很多情况,我们要知道这个cronExpression下次执行的时间是啥,让非技术人员很直观的看到下一个定时任务的执行时间。
2916 0
|
负载均衡 Java Shell
定时组件quartz系列<三>quartz调度机制调研及源码分析
quartz2.2.1集群调度机制调研及源码分析引言quartz集群架构调度器实例化调度过程触发器的获取触发trigger:Job执行过程:总结:附:   引言 quratz是目前最为成熟,使用最广泛的java任务调度框架,功能强大配置灵活.
1399 0
|
XML Java 调度
springmvc中实现quartz定时任务(每分钟的第3秒执行任务调度方法)
1:实现触发器,最大的问题是jar包的处理(*.jar定时jar和sourcecodesource code): 此处,最关键的jar为第二个,名字最长。 maven依赖: &lt;dependency&gt; &lt;groupId&gt;org.apache.servicemix.bundles&lt;/groupId&gt; &lt;artifactId&g
4217 0
相关产品
云迁移中心
推荐文章
更多