`
fengfeng925
  • 浏览: 107124 次
  • 性别: 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之间最好不要执行任务,否则可能不执行或者重复执行。。

相关推荐

    ASP.NET使用Quartz.NET实现定时任务调度

    结合使用Quartz.NET和TopShelf,我们可以构建一个在Windows服务中运行的定时任务调度系统。 Quartz.NET的特性包括: 1. **灵活的调度**:Quartz.NET支持多种调度模式,如简单触发器、cron触发器,可以按照精确时间...

    Quartz.net作业调度自定义定时执行任务多任务执行c#

    在"Quartz.net作业调度自定义定时执行任务多任务执行c#"这个主题中,我们将深入探讨如何使用Quartz.NET来实现自定义的定时任务,以及如何处理多任务执行。 首先,我们需要理解Quartz.NET的基本概念。在Quartz.NET中...

    Spring+Quartz 从数据库中获取定时任务和定时时间,动态实现对定时任务的增删改查

    首先,Quartz是一个开源的作业调度框架,它允许开发者创建、安排和执行定时任务。Quartz支持从数据库存储作业和触发器,这样可以方便地进行任务的持久化和集群环境下的任务同步。 1. **Spring与Quartz的集成**:...

    SpringBoot 整合Quartz(集群)实现定时任务调度

    SpringBoot整合Quartz实现定时任务调度是企业级应用中常见的需求,主要用于自动化执行某些周期性的任务,例如数据备份、报表生成、系统维护等。Quartz是一个功能强大的开源作业调度框架,能够灵活地定义任务和调度...

    Spring整合任务调度框架Quartz

    Spring 整合任务调度框架 Quartz 在软件开发中,任务调度框架是非常重要的一部分,它可以帮助开发者更好地管理和执行各种任务。在 Java 领域中,Quartz 是一个非常流行的任务调度框架,而 Spring 是一个非常流行的 ...

    定时任务quartz实现分组串行并行动态配置

    Quartz是一款广泛使用的开源作业调度框架,它允许开发者在Java应用程序中定义和执行定时任务。在实际应用中,我们可能需要根据业务需求动态地配置定时任务的执行方式,例如,某些任务可能需要串行执行,而其他任务则...

    Quartz定时任务常用的11张数据库脚本表结构

    了解这些表的结构和作用,可以帮助我们更好地理解和管理Quartz定时任务,包括创建、查询、更新和删除任务。在实际应用中,可以结合Quartz API进行相应的数据库操作,实现灵活的任务调度和管理。希望这些信息能对您在...

    Springboot整合Quartz实现定时任务数据库动态配置

    Spring Boot作为一个轻量级的Java框架,提供了与各种定时任务库集成的能力,其中Quartz是一个广泛应用的开源作业调度框架。本篇文章将详细探讨如何在Spring Boot项目中整合Quartz,并通过MySQL数据库实现定时任务的...

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

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

    furion内置的定时任务使用学习,动态添加定时任务代码

    该类可能包括了对数据库表的操作,例如添加、更新和查询定时任务的相关记录。 `Program.cs` 是ASP.NET Core应用的入口点,通常在这里启用Furion框架并配置定时任务服务。通过调用`UseFurion()`扩展方法,我们可以...

    Quartz--JAVA定时任务\Java应用:Java调度任务和Spring Quartz (1)

    Quartz还支持集群和持久化,这意味着多个Quartz实例可以在分布式环境中协作调度任务,而且任务的状态和计划可以存储在数据库中,保证了高可用性和容错性。通过Spring与Quartz的整合,可以轻松地在Spring应用中管理...

    数据库管理quartz定时任务

    【数据库管理Quartz定时任务】 在企业级应用中,经常需要执行一些按计划进行的任务,例如数据备份、报表生成、清理过期数据等。Quartz是一个开源的作业调度框架,它允许开发人员定义和调度任务,以便在指定的时间点...

    Quartz任务调度器

    Quartz任务调度器是一款强大的开源任务调度框架,广泛应用于Java应用程序中,用于自动化定时任务的执行。它提供了灵活的任务调度机制,使得开发者可以方便地定义、安排和执行各种任务。在与Spring框架整合后,Quartz...

    定时任务quartz及教程

    Quartz是Java领域中广泛应用的一款开源的作业调度框架,它允许开发者在应用程序中安排复杂的定时任务。本教程将深入探讨Quartz的核心概念、配置、API使用以及如何在实际项目中集成和管理定时任务。 一、Quartz核心...

    Java使用quartz实现任务调度定时任务

    在Java世界里,Quartz是一个强大的、完全开源的作业调度框架,广泛用于构建复杂的时间触发任务。本篇文章将深入探讨如何使用Quartz在Java应用程序中实现任务调度。 Quartz库提供了一个灵活的API,可以创建、调度和...

    任务调度开源框架Quartz

    总之,Quartz作为一款强大的任务调度框架,无论是在小型项目还是大型企业级应用中,都能够提供可靠的定时任务管理解决方案。结合提供的文档,你将能够全面掌握Quartz的使用技巧,从而提升你的系统设计和开发能力。

    quartz 动态执行定时任务

    在许多现代应用程序中,特别是在企业级应用中,往往需要实现对某些任务的周期性调度执行,例如定期备份数据库、定时发送邮件通知等。Quartz 是一个开源的作业调度框架,能够帮助开发者轻松地在 Java 应用程序中实现...

    定时器 任务调度器 定时器 任务调度器

    任务调度器通常用于更复杂的场景,例如在服务器上定期运行脚本、执行数据库备份、监控系统性能等。Windows操作系统上的任务计划程序就是一种常见的任务调度器实例。 Quartz是Java平台上广泛使用的一个开源任务调度...

    ssm集成quartz完成定时任务

    总的来说,"ssm集成quartz完成定时任务"是一个将企业级任务调度能力与Java Web开发相结合的实例,通过这个项目,开发者可以学习如何在SSM环境中有效地管理和执行定时任务,提升系统的自动化水平。

Global site tag (gtag.js) - Google Analytics