在我们工程中用到定时数据的时候一般都是使用数据库的定时调度功能实现的,最近做“客服现场管理工具”的时候是用了quartz来进行调度,把数据用json储存,这样对数据库就没有太大的压力了。Spring框架很好的整合了quartz,在web环境下使用起来也比较方便。废话少说,上代码(功能简单:每到0分或者30分钟的时候执行)
public class XlzbServiceImpl extends QuartzJobBean {
private XlzbDao xlzbDao;
private String path;
@SuppressWarnings({ "deprecation", "unchecked" })
protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
JSONObject content = null;
List list = xlzbDao.getXlzbDataByTime();
Date date = new Date();
Date date1 = new Date(date.getTime() - 1800000);
DateFormat format = new SimpleDateFormat("yyyy-MM-dd");
String fileName = format.format(date);
File file = new File(path + fileName);
BufferedReader reader = null;
Writer writer = null ;
if(file.exists()) {
try {
reader = new BufferedReader(new FileReader(file));
try {
String str = reader.readLine();
content = JSONObject.fromObject(str);
content.put(date1.getHours() + ":" + date1.getMinutes() + "--" +date.getHours() + ":" + date.getMinutes(), list);
} catch (IOException e) {
e.printStackTrace();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
}
} else {
Map map = new HashMap();
map.put(date1.getHours() + ":" + date1.getMinutes() + "--" +date.getHours() + ":" + date.getMinutes(), list);
content = JSONObject.fromObject(map);
}
try {
writer = new BufferedWriter(new FileWriter(file));
writer.write(content.toString());
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if(writer != null)
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public void setXlzbDao(XlzbDao xlzbDao) {
this.xlzbDao = xlzbDao;
}
public void setPath(String path) {
this.path = path;
}
}
好了,只需要写着一个业务逻辑的类就OK了,接下来就是spring中的配置了。
<bean id="xlzbDaoImpl" class="net.xxt.xcgl.dao.impl.XlzbDaoImpl" >
<property name="sqlMapClient" ref="sqlMapClient"/>
</bean>
<bean id="jobDetailBean" class="org.springframework.scheduling.quartz.JobDetailBean">
<property name="jobClass" value="net.xxt.xcgl.service.impl.XlzbServiceImpl" />
<property name="jobDataAsMap">
<map>
<entry key="xlzbDao" value-ref="xlzbDaoImpl" />
<entry key="path" value="E:/xx/xxt_bgadmin/xcgl/createRestFile/"></entry>
</map>
</property>
</bean>
<bean id="cronTriggerBean" class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail" ref="jobDetailBean" />
<property name="cronExpression" value="0 0,30 * * * ?"></property>
</bean>
<bean id="xlzb" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="cronTriggerBean"/>
</list>
</property>
</bean>
前两个bean都是在声明一个任务,第三个相当于触发器,按时间只要是0分钟或者30分钟就执行(任务的执行条件),而最后一个是把这个这个任务注册。
看到这里是不是感觉非常熟悉啊!~~~跟线程太相似了啊!我们对比一下:
任务--一个runnable
条件--一个thread(带了条件的)
工厂注册--线程池
其实quartz也不难,我们可以自己模拟调度
首先我们写个业务逻辑(简单偷懒点)
public class JobData {
//从数据库中去数据
public List<Map<String,String>> getData() throws Exception {
List<Map<String,String>> connectors = new ArrayList<Map<String,String>>();
Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test1", "root", "admin");
PreparedStatement pstmt = conn.prepareStatement("select * from connector1");
ResultSet rs = pstmt.executeQuery();
while(rs.next()) {
String id = String.valueOf(rs.getInt("id"));
String name = rs.getString("name");
String mobile = rs.getString("mobile");
String birthday = rs.getDate("birthday").toLocaleString();
Map<String,String> map = new HashMap<String,String>();
map.put("id", id);
map.put("name", name);
map.put("mobile", mobile);
map.put("birthday", birthday);
connectors.add(map);
}
return connectors;
}
//简单返回一个字符串
public String say() {
return "It's amazing....";
}
}
然后写runnable来(任务)进行调用
public class DemoJob implements Runnable{
@Override
public void run() {
JobData job = JobFactory.create();
while(true) {
try {
Date date = new Date();
if(date.getSeconds()==30) {
List<Map<String,String>> list = job.getData();
for(Map<String,String> map:list) {
System.out.println("id---->" + map.get("id"));
System.out.println("name---->" + map.get("name"));
System.out.println("mobile---->" + map.get("mobile"));
}
try {
//注意这里必须休眠1秒钟,道理自己想。不过线程的休眠不太准确,我也没找到好的办法
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
public class DemoJob1 implements Runnable {
@Override
public void run() {
JobData job = JobFactory.create();
while(true) {
Date date = new Date();
if(date.getSeconds()==0) {
String str = job.say();
System.out.println(str);
try {
//注意这里必须休眠1秒钟,道理自己想,不过线程的休眠不太准确,我也没找到好的办法
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
最后一步,用线程池把这两个线程加进去,如果是在web开发中,要触发任务的话,就可以自己写个listener,注册在web.xml中去。
public class SysContextListener implements ServletContextListener {
@Override
public void contextDestroyed(ServletContextEvent sce) {
}
@Override
public void contextInitialized(ServletContextEvent sce) {
ExecutorService executor = Executors.newCachedThreadPool();
DemoJob demoJob = new DemoJob();
DemoJob1 demoJob1 = new DemoJob1();
executor.submit(demoJob);
executor.submit(demoJob1);
executor.shutdown();
}
}
在web.xml中加入
<listener> <listener-class>cn.xxt.spring2.SysContextListener</listener-class>
</listener>
OK了,只要启动之后任务就可以按时执行了。
看了下quartz的源代码,他也基本上是这么实现的,当然肯定比上面的例子麻烦点。不过知道了他的思想,那些配置就能更好的理解了。另外java自带的也有这种功能,不过不太完善,在java.util包中有个Timer和TimerTask类,可以好好看看。
分享到:
相关推荐
### 深入解读Quartz的原理 #### 一、Quartz概述 Quartz 是一个功能强大且易于使用的 Java 开源定时任务调度器。它能够触发在指定的时间执行任务(通常称为作业)。Quartz 能够满足从简单的到非常复杂的业务场景...
Quartz原理及实例,spring4.x+Quartz.2.2.1结合的开发,静态和动态实例
1. 数据库锁定:Quartz使用数据库中的记录作为锁来确保同一时间只有一个节点能够获取并执行一个特定的任务。这确保了即使多个节点同时尝试获取同一个任务,也只有一个节点能够成功,其他节点将被阻塞,直到锁被释放...
二、Quartz的使用步骤 1. **初始化Scheduler**:首先,需要创建一个Scheduler实例,通常通过`StdSchedulerFactory.getDefaultScheduler()`方法获取。 2. **定义Job**:创建Job类,实现`Job`接口并重写`execute()`...
本文将深入探讨 Quartz 线程池的工作原理、配置以及如何在实际项目中应用。 ### 一、Quartz 线程池的基本概念 线程池是计算机科学中的一个概念,主要用于管理多个并发运行的线程。在 Quartz 中,线程池负责处理由 ...
quartz使用指南,quartz使用指南,quartz使用指南
以下是对Spring整合Quartz使用实例的详细说明: 1. **Quartz简介** Quartz是一个强大的、完全开源的作业调度框架,它支持复杂的调度策略,如按日期、时间间隔或自定义表达式执行。Quartz可以在Java应用中作为独立...
quartz工作原理
Quartz开发使用说明文档 Quartz是一个功能强大且广泛应用的开源作业调度框架,主要用于实现业务逻辑中的定时任务、批处理、事件触发等场景。Quartz的主要特点是高可用性、可扩展性、灵活配置、支持多种数据库和集群...
这个小结将深入探讨Quartz的核心概念、使用场景以及如何与Spring框架集成。 一、Quartz简介 Quartz是由Caledonia Software公司开发的Java定时任务库,它提供了一种高度可配置的方式来安排和执行工作。Quartz支持...
这个标题“Quartz 定时WebForm和WinForm使用的dll”暗示了我们将在WebForm和WinForm应用中使用Quartz来实现定时功能。在.NET环境中,Quartz通过引入特定的DLL文件来实现其功能。 首先,我们要理解什么是DLL...
- 默认情况下,Quartz使用内存存储作业和触发器信息,但也可以配置使用数据库进行持久化,确保服务器重启后任务不会丢失。 9. **高级特性** - `Stateful Jobs`:有状态的作业,每个实例只执行一次,适合处理不可...
- 深入研究Quartz的源码,有助于理解其内部工作原理,如JobStore的实现(内存、数据库等)、调度算法等,这有助于优化和定制自己的调度需求。 通过上述内容,我们可以构建一个基于Quartz的Web应用定时任务系统,...
Quartz和IIS是两种在IT领域中广泛使用的工具,它们分别用于任务调度和Web服务管理。这篇内容将深入探讨这两个概念以及如何解决IIS闲置时间的问题。 首先,让我们了解Quartz。Quartz是一个开源的Java作业调度框架,...
Quartz本身支持多种持久化策略,包括使用数据库(JDBC)来存储作业和触发器信息,这使得任务调度信息在系统重启后仍能保留。下面将详细介绍如何进行Spring与Quartz的整合,以及使用JDBC存储的相关步骤。 1. **...
如果使用的是Spring Boot,可以在`application.properties`或`application.yml`中配置Quartz,并通过`@EnableScheduling`注解启用定时任务支持。 8. **动态管理定时任务** Spring提供的`SchedulerFactoryBean`...
源码阅读可以加深我们对Quartz工作原理的理解,从而更好地利用它来解决实际问题。 总的来说,Quartz结合cron表达式,提供了一种灵活且强大的方式来实现Java应用的定时任务。通过学习和实践,我们可以创建出符合业务...
7. **src**:源代码目录,包含Quartz.NET的源码,开发者可以查看和学习其内部工作原理。 8. **lib**:库文件夹,可能包含Quartz.NET依赖的外部库。 9. **doc**:文档目录,可能有API参考、用户指南等帮助材料。 *...
Spring对Quartz进行了集成,使其更易于在Spring应用程序中使用。Spring提供了`FactoryBean`类,如`SchedulerFactoryBean`,用于创建和管理Quartz的`Scheduler`实例。这使得我们可以利用Spring的依赖注入(DI)和管理...