`
fengfeng925
  • 浏览: 104611 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

企业定时任务调度器Quartz,定时查询数据库

阅读更多
    看到楼下各位兄弟的批评指正后,确实对我很有启发,任务如果都以配置的形式出现,在项目中是很利于维护的,所以,稍作修改,呵呵。

首先要做QuartzJob定时任务类了,这个类要实现的是Job接口,然后重写execute方法,方法中就是执行你具体要做的事情了。不过首先需要一个配置文件,里面定义了一些参数,是Quartz的一些配置。配置文件如下
#============================================================================
# Configure Main Scheduler Properties  
#============================================================================
org.quartz.scheduler.instanceName = QuartzScheduler
org.quartz.scheduler.instanceId = AUTO

#============================================================================
# Configure ThreadPool  
#============================================================================
org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount = 3
org.quartz.threadPool.threadPriority = 5

#===============================================================
#Configure JobStore
#===============================================================
org.quartz.jobStore.misfireThreshold = 60000
org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore

#============================================================================
# Configure Plugins 
#============================================================================
#org.quartz.plugin.triggHistory.class = org.quartz.plugins.history.LoggingJobHistoryPlugin
org.quartz.plugin.jobInitializer.class = org.quartz.plugins.xml.JobInitializationPlugin
org.quartz.plugin.jobInitializer.fileName = conf/quartz_jobs.xml
org.quartz.plugin.jobInitializer.overWriteExistingJobs = true
org.quartz.plugin.jobInitializer.failOnFileNotFound = true
org.quartz.plugin.jobInitializer.scanInterval = 60


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

package com.bj58.job.servlet;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

import com.bj58.job.utils.ConnectionFactory_DB_dest;
import com.bj58.job.utils.ConnectionFactory_DB_src;

/**
 * 定时任务类
 * @author zhangwan@58.com
 * Jun 8, 2010
 *
 */
public class QuartzJob implements Job {
	private static final Log log = LogFactory.getLog(Job.class);
	private static final String findSql_src = "select PortalId from t_portalinfo";
	private static final String findSql_dest = "select userId from t_user";
	private static final String insertSql_dest = "insert into t_user(userId) values (?)";
	
	/**
	 * 执行任务方法
	 */
	@Override
	public void execute(JobExecutionContext context) throws JobExecutionException {
		Connection conn_db_src = ConnectionFactory_DB_src.getConnection();
		Connection conn_db_dest = ConnectionFactory_DB_dest.getConnection();
		PreparedStatement pstmt_src = null;
		PreparedStatement pstmt_dest = null;
		ResultSet rs_src = null;
		ResultSet rs_dest = null;
		try {
			pstmt_src = conn_db_src.prepareStatement(findSql_src);
			rs_src = pstmt_src.executeQuery();

			pstmt_dest = conn_db_dest.prepareStatement(findSql_dest);
			rs_dest = pstmt_dest.executeQuery();
			pstmt_dest = conn_db_dest.prepareStatement(insertSql_dest);
			
			while(rs_dest.next()) { //第二次或第n次入库,第一次入库的话rs_dest没有结果,所以此段操作都不执行
				String userId = rs_dest.getString(1);
				while (rs_src.next()) {
					String protalId = rs_src.getString(1);
					if(userId.equals(protalId)) { //如果两个结果相同,则不进行入库
						break;
					} else {
						pstmt_dest.setString(1, protalId);
						pstmt_dest.execute();
					}
				}
			}
			
			while (rs_src.next()) { //如果是第一次入库
				String protalId = rs_src.getString(1);
				pstmt_dest.setString(1, protalId);
				pstmt_dest.execute();
				
			}
			log.info("存储数据...");
		} catch (SQLException e) {
			log.info("存储数据出现异常...");
			e.printStackTrace();
		} finally {
			ConnectionFactory_DB_dest.free(rs_dest, pstmt_dest, conn_db_dest);
			ConnectionFactory_DB_src.free(rs_src, pstmt_src, conn_db_src);
			log.info("数据库连接已经关闭...");
		}

	}
}


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

然后需要这么个配置文件quartz_jobs.xml,内容如下
<?xml version="1.0" encoding="UTF-8"?>
<quartz>
	<job>
		<job-detail>
			<name>PortalInfoJob</name>
			<group>PortalInfo</group>
			<job-class>com.bj58.portalcrm.web.job.PortalInfoJob</job-class>
		</job-detail>
		<trigger>
			<cron>
				<name>PORTALINFO</name>
				<job-name>PortalInfoJob</job-name>
				<job-group>PortalInfo</job-group>
				<cron-expression>0 0 1 * * ?</cron-expression>
			</cron>
		</trigger>
	</job>
</quartz>


ok,最后就是web.xml文件配置一下,Quartz提供了个初始化的Servlet,呵呵,内容如下
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4" 
	xmlns="http://java.sun.com/xml/ns/j2ee" 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
	http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
	
    <welcome-file-list>
      	<welcome-file>index.jsp</welcome-file>
    </welcome-file-list>
  
    <!-- Quartz配置计划 -->
    <servlet>   
         <servlet-name>QuartzInitializer</servlet-name>   
         <servlet-class>org.quartz.ee.servlet.QuartzInitializerServlet</servlet-class>   
         <load-on-startup>1</load-on-startup>   
         <init-param>   
             <param-name>config-file</param-name>   
             <param-value>/quartz.properties</param-value>   
         </init-param>   
         <init-param>   
             <param-name>shutdown-on-unload</param-name>   
             <param-value>true</param-value>   
         </init-param>   
	</servlet>
</web-app>

这样就搞定了,
分享到:
评论
16 楼 cutesource 2010-07-20  
<p>quartz在原理是就是通过对线程的调度来实现按时间执行任务,具体可以参见我以前做过的解析,希望对用quartz的朋友们有所启发:</p>
<h1 class="title_txt"><span style="font-size: small;"><a href="http://blog.csdn.net/cutesource/archive/2009/12/08/4965520.aspx">Quartz
源码分析(一)------ 以线程等待的方式实现按时间调度</a></span></h1>
<h1 class="title_txt"><br></h1>
15 楼 fengfeng925 2010-07-20  
snovian 写道
不说了,配置全部存数据库,做了个Web界面给用户修改。

很高级,对与我的项目来说没必要。
14 楼 snovian 2010-07-19  
不说了,配置全部存数据库,做了个Web界面给用户修改。
13 楼 Foxswily 2010-07-19  
fengfeng925 写道
Foxswily 写道
这么用quartz太暴殄天物了,
·使用了JobInitializationPlugin还要手动创建Job,quartz_jobs.xml还有何用?scanInterval = 5  更是白消耗了

·quartz自带QuartzInitializerListener/QuartzInitializerServlet 何必自己写Servlet启动

别的就不说了...

不手动创建job,如何做数据分析。配置文件可以做数据分析吗?quartz_jobs.xml里面应该只是配置好多个job吧。其他的说的有理


quartz_jobs.xml已经创建+配置job了,代码创建实在没什么必要,分析更是该分离到listener里实现。说起来Quartz对配置这块有点疏忽,问题多多、功能不全...
12 楼 fengfeng925 2010-07-16  
Foxswily 写道
这么用quartz太暴殄天物了,
·使用了JobInitializationPlugin还要手动创建Job,quartz_jobs.xml还有何用?scanInterval = 5  更是白消耗了

·quartz自带QuartzInitializerListener/QuartzInitializerServlet 何必自己写Servlet启动

别的就不说了...

不手动创建job,如何做数据分析。配置文件可以做数据分析吗?quartz_jobs.xml里面应该只是配置好多个job吧。其他的说的有理
11 楼 fengfeng925 2010-07-13  
lalaeye 写道
你是适合做练习的,不是做项目的。
鉴定完毕,做项目不会像你这样弄的,呵呵,我一个配置文件搞定所有东西,哪有你那么多东西呢。

那你分享一下你的配置文件吧,我想看看你的配置文件是怎么做数据分析的。
10 楼 dilantaya 2010-07-13  
Foxswily 写道
这么用quartz太暴殄天物了,
·使用了JobInitializationPlugin还要手动创建Job,quartz_jobs.xml还有何用?scanInterval = 5  更是白消耗了

·quartz自带QuartzInitializerListener/QuartzInitializerServlet 何必自己写Servlet启动

别的就不说了...


貌似web.xml配置下就可以聊
9 楼 Foxswily 2010-07-08  
这么用quartz太暴殄天物了,
·使用了JobInitializationPlugin还要手动创建Job,quartz_jobs.xml还有何用?scanInterval = 5  更是白消耗了

·quartz自带QuartzInitializerListener/QuartzInitializerServlet 何必自己写Servlet启动

别的就不说了...
8 楼 vivia 2010-07-07  
lalaeye 写道
你是适合做练习的,不是做项目的。
鉴定完毕,做项目不会像你这样弄的,呵呵,我一个配置文件搞定所有东西,哪有你那么多东西呢。

LZ贴出代码只是为了分享,而不是为了别的什么。
如果你有更优雅的解决方案为什么不贴出来呢?
7 楼 lalaeye 2010-07-07  
你是适合做练习的,不是做项目的。
鉴定完毕,做项目不会像你这样弄的,呵呵,我一个配置文件搞定所有东西,哪有你那么多东西呢。
6 楼 qiren83 2010-06-24  
灵异的情况下是很常发生的
5 楼 fengfeng925 2010-06-08  
wese345 写道
chris_zley 写道
据说晚上11:00-1:00之间最好不要执行任务,否则可能不执行或者重复执行。。

据说会发生灵异现象

哦,这个。。。
4 楼 wese345 2010-06-08  
chris_zley 写道
据说晚上11:00-1:00之间最好不要执行任务,否则可能不执行或者重复执行。。

据说会发生灵异现象
3 楼 cjmcn-sh 2010-06-08  
chris_zley 写道
据说晚上11:00-1:00之间最好不要执行任务,否则可能不执行或者重复执行。。


没有这个据说吧,我们的服务就是每天晚上11点30分开始做的,2年多了,还没有重复的情况发生。
2 楼 fengfeng925 2010-06-08  
chris_zley 写道
据说晚上11:00-1:00之间最好不要执行任务,否则可能不执行或者重复执行。。

据说?那凌晨2点呢?
重复执行,有没有证明呢?
1 楼 chris_zley 2010-06-08  
据说晚上11:00-1:00之间最好不要执行任务,否则可能不执行或者重复执行。。

相关推荐

    Spingboot+Quartz基于数据库的作业任务调度

    Spingboot+Quartz实现定时任务作业调度,并基于数据库对任务作业进行配置,可以实现灵活地更新和删除定时任务。

    (动态多)定时任务源码自动运行调度后台执行

    5、C#定时调度任务服务(Quartz.net做为任务调度核心,利用Log4Net做为日志输出,C#完成WINDOWS服务在后台定时执行任务) 6、android 后台定时执行任务 示例源码 7、C# Quatrz定时任务job实现 8、Quartz.NET定时任务...

    基于Java的一个简单的定时任务调度管理系统.zip

    基于Java的一个简单的定时任务调度管理系统.zip 分享一个简单的定时任务调度管理系统 项目基于springboot quartz mybatis开发 1.可以支持定时任务的管理调度,实现定时任务的动态设置和统一管理; 2.目前比较简单的...

    分布式任务调度框架 集合

    目前主流的分布式任务调度框架 个人建议用Quartz 文档全资料多 不过看自己项目需求把 TBSchedule和uncode-schedule基于zookeeper 不用数据库 总之每个框架有各自的优缺点,需求自己略做验证。 附件中有项目的下载...

    数据库配置定时调度

    quartz定时调度,数据库配置执行时间,可用,挺好的,够了

    基于SpringBoot+Quartz的轻量级分布式定时任务调度系统源码+项目说明+sql数据库.zip

    基于SpringBoot+Quartz的轻量级分布式定时任务调度系统源码+项目说明+sql数据库.zip 主要技术选型 1、后端: - SpringBoot 2.6.11 - Quartz 2.3.2 - Mybatis-Plus 3.5.3.2 - Httpclient 4.5.13 2、前端: - Layui ...

    基于Spring Boot + Quartz 的分布式任务调度系统.zip

    集成了分布式任务调度框架 Quartz ,任务存储于数据库。 使用SpringMVC作为路由控制, 集成 Swagger2 提供实时 RESTful API文档。 数据持久层集成 Mybatis 框架。 使用自定义注解 @TargetDataSource 实现了多数据源...

    Quartz调度框架预研.docx

    Quartz有3个核心要素:调度器(Scheduler)、任务(Job)、触发器(Trigger)。Quartz完全使用Java开发,可以集成到各种规模的应用程序中。它能够承载成千上万的任务调度,并且支持集群。它支持将数据存储到数据库中以实现...

    Quartz任务调度框架简介

    Quartz Job Scheduling Framework[翻译]第一章. 企业应用中的作业调度 2007年11月18日 星期日 下午 12:22第一章. 企业应用中的作业调度 ·什么是作业调度 ·作业调度为什么说是重要的 ·企业应用中的作业调度 ·...

    定时任务2.0.zip

    java用quartz实现的批处理定时任务调度平台(前端源码+后台jar包+数据库+使用手册),下载即用,定时任务欢乐用,本来想免费的,后面想想,收1个积分不过分吧

    spring的quartz定时任务相关(持久化任务)

    用spring定时器实现任务的定时调度,还可将任务状态相关持久化到数据库,方便管理,超级好用

    详解免费开源的DotNet任务调度组件Quartz.NET(.NET组件介绍之五)

    很多的软件项目中都会使用到定时任务、定时轮询数据库同步,定时邮件通知等功能。.NET Framework具有“内置”定时器功能,通过System.Timers.Timer类。在使用Timer类需要面对的问题:计时器没有持久化机制;计时器...

    Spring 3整合Quartz 1.8实现定时任务三:动态暂停 恢复 修改和删除任务

    Spring 3整合Quartz 1.8实现定时任务三:动态暂停 恢复 修改和删除任务 任务保存到数据库,系统启动时读取数据库,页面显示加载,并管理 注:spring3+quartz2动态任务调度,任务保存在内存中,页面显示动态管理版...

    quartznet任务调度和消息调度

    quartznet任务调度和消息调度 定时或定期执行任务的一套框架。 1)分任务,调度器,触发器。 2)任务,触发器是多对多关系。 3)可以保存任务到数据库。

    quartz-console:基于quartz集群模式的任务管理DEMO

    直接查询或修改quartz的数据表可能会影响quartz原有的调度模式。这个DEMO使用一个间接的task数据表,所有任务的修改都在这个数据表进行,而TaskScannerJob这个任务会定时扫描task表,将更新的任务实例化成具体的JOB...

    attemper:Distributed,multi-tenancy,job-flow scheduling application(分布式多租户的支持流程编排的任务调度平台) QQ群

    基于quartz实现分布式任务调度(定时、API);引入camunda作为任务执行框架,支持工作流式任务编排、并发批量调度和参数传递。 简介 分布式、多租户的支持流程编排的任务调度应用 同时支持Redis分布式锁和Quartz...

    matlab最简单的代码-TimeSystem:定时执行系统

    非常容易控制的任务调度系统 特性 兼容性好,需要定时的任务只依赖于控制台命令,能在命令行中执行的程序都可以执行。意味着可以定时执行包括exe在内的,python,nodejs,甚至matlab等程序 扩展性强,目前可以直接...

    quartz作业调度

    一个纯 Java 实现的作业调度工具,相当于数据库中的 Job、Windows 的计划任务、Unix/Linux 下的 Cron,但 Quartz 可以把排程控制的更精细。版本1.5.2,内附中文帮助文档

    基于.NetCore + Quartz.Net + Vue 开箱即用的定时任务UI

    基于.NetCore + Quartz.Net + Vue 开箱即用的定时任务UI。几乎没有上手难度,不依赖数据库,只需在界面做简单配置

    quartz-2.2.3.jar

    quartz:是一个任务调度框架,通过触发器设置作业的定时运行规则,来执行定时任务。相当于数据库中的 Job、Windows 的计划任务、Unix/Linux 下的 Cron,但 Quartz 可以把排程控制的更精细。把一系列任务自动安置到一...

Global site tag (gtag.js) - Google Analytics