`

framework Schedule Quartz

阅读更多

quartz

http://www.opensymphony.com/quartz/

不带依赖 jar 的基于 Quartz 的示例 Java 代码

http://download.boulder.ibm.com/ibmdl/pub/software/dw/java/j-quartz-noJars.zip

带有依赖 jar 的基于 Quartz 的示例 Java 代码

http://download.boulder.ibm.com/ibmdl/pub/software/dw/java/j-quartz-withJars.zip

 

Quartz从入门到进阶

http://kebo.iteye.com/blog/255046

http://onjava.com/pub/a/onjava/2005/09/28/what-is-quartz.html

In This Article:

  1. Job Scheduling Made Easy
  2. The History Behind Quartz
  3. Getting Your Hands on Quartz
  4. Inside the Quartz Architecture
  5. Jobs, Jobs, and More Jobs
  6. Job Management and Storage
  7. Available JobStores
  8. Jobs and Triggers
  9. Scheduling a Job
  10. Calling Your Jobs with the Scheduler
  11. Programmatic vs. Declarative Scheduling
  12. Stateful and Stateless Jobs
  13. Other Features of the Quartz Framework
  14. What's down the Road?
  15. Finding Out More About Quartz

1.        Quartz让任务调度简单
2.        Quartz的发展史
3.        上手Quartz
4.        Quartz内部架构
5.        作业
6.        作业管理和存储
7.        有效作业存储
8.        作业和触发器
9.        调度一个作业
10.        用调度器(Scheduler)调用你的作业
11.        编程调度同声明性调度
12.        有状态和无状态作业
13.        Quartz框架的其他特征
14.        Quartz下一步计划
15.        了解更多Quartz特征

Quartz 1.6.1发布:开源的作业调度框架

http://www.iteye.com/news/3778

Quartz 1.6.1发布。Quartz是一个开源的作业调度框架,它完全由Java写成,并设计用于J2SE和J2EE应用中。它提供了巨大的灵活性而不牺牲简单 性。你能够用它来为执行一个作业而创建简单的或复杂的调度。它有很多特征,如:数据库支持,集群,插件,EJB作业预构建,JavaMail及其它,支持 cron-like表达式等等。 Quartz基于Apache 2.0 license .

1.6.x 版本修改了很多bug,提升了性能和增加了一些新功能,比如:新的优先调度支持;JMS集成(支持消息发送任务);Utility 类增加多个监听器:BroadcastSchedulerLister,FilterAndBroadcastJobListener等。

 

 

* Quartz主页: http://www.opensymphony.com/quartz
* 更新细节Release notes and changes: http://wiki.opensymphony.com/display/QRTZ1/Quartz+1.6.1
* 下载Download: http://www.opensymphony.com/quartz/download.action

 

1.6.1RC版本已经下载超过2万次,并在繁重任务集群环境中良好运行几个月。感谢社区中所有代码贡献者和测试者。

 

 

Quartz定时使用JCo同步SAP系统数据

http://www.iteye.com/topic/456909

开源任务调度框架Quartz的一份文档

http://www.iteye.com/topic/210482

用 Quartz 进行作业调度

http://www.iteye.com/topic/168164

http://www.ibm.com/developerworks/cn/java/j-quartz/#main

Quartz任务监控管理 (1)

http://www.iteye.com/topic/441951

对quartz的总结

http://www.iteye.com/topic/117244



用 Quartz 进行作业调度

http://www.ibm.com/developerworks/cn/java/j-quartz/#main

     现代的 Web 应用程序框架在范围和复杂性方面都有所发展,应用程序的每个底层组件也必须相应地发展。作业调度是现代系统中对 Java 应用程序的一般要求,而且也是对 Java 开发人员一贯的要求。虽然目前的调度技术比起原始的数据库触发器标志和独立的调度器线程来说,已经发展了许多,但是作业调度仍然不是个小问题。对这个问题最合适的解决方案就是来自 OpenSymphony 的 Quartz API。

     Quartz 是个开源的作业调度框架,为在 Java 应用程序中进行作业调度提供了简单却强大的机制。Quartz 允许开发人员根据时间间隔(或天)来调度作业。它实现了作业和触发器的多对多关系,还能把多个作业与不同的触发器关联。整合了 Quartz 的应用程序可以重用来自不同事件的作业,还可以为一个事件组合多个作业。虽然可以通过属性文件(在属性文件中可以指定 JDBC 事务的数据源、全局作业和/或触发器侦听器、插件、线程池,以及更多)配置 Quartz,但它根本没有与应用程序服务器的上下文或引用集成在一起。结果就是作业不能访问 Web 服务器的内部函数;例如,在使用 WebSphere 应用服务器时,由 Quartz 调度的作业并不能影响服务器的动态缓存和数据源。

 本文使用一系列代码示例介绍 Quartz API,演示它的机制,例如作业、触发器、作业仓库和属性。

入门

要开始使用 Quartz,需要用 Quartz API 对项目进行配置。步骤如下:

  1. 下载 Quartz API
  2. 解压缩并把 quartz-x.x.x.jar 放在项目文件夹内,或者把文件放在项目的类路径中。
  3. 把 core 和/或 optional 文件夹中的 jar 文件放在项目的文件夹或项目的类路径中。
  4. 如果使用 JDBCJobStore ,把所有的 JDBC jar 文件放在项目的文件夹或项目的类路径中。

为了方便读者,我已经把所有必要的文件,包括 DB2 JDBC 文件,编译到一个 zip 文件中。请下载代码。

现在来看一下 Quartz API 的主要组件。

 


 

作业和触发器

Quartz 调度包的两个基本单元是作业和触发器。作业 是能够调度的可执行任务,触发器 提供了对作业的调度。虽然这两个实体很容易合在一起,但在 Quartz 中将它们分离开来是有原因的,而且也很有益处。

通过把要执行的工作与它的调度分开,Quartz 允许在不丢失作业本身或作业的上下文的情况下,修改调度触发器。而且,任何单个的作业都可以有多个触发器与其关联。

 

示例 1:作业

    通过实现 org.quartz.job 接口,可以使 Java 类变成可执行的。清单 1 提供了 Quartz 作业的一个示例。这个类用一条非常简单的输出语句覆盖了 execute(JobExecutionContext context) 方法。这个方法可以包含我们想要执行的任何代码.


清单 1. SimpleQuartzJob.java

				
package com.ibm.developerworks.quartz;
import java.util.Date;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
public class SimpleQuartzJob implements Job {
    public SimpleQuartzJob() {
    }
    public void execute(JobExecutionContext context) throws JobExecutionException {
        System.out.println("In SimpleQuartzJob - executing its JOB at " 
                + new Date() + " by " + context.getTrigger().getName());
    }
}
            

 

    请注意,execute 方法接受一个 JobExecutionContext 对象作为参数。这个对象提供了作业实例的运行时上下文。特别地,它提供了对调度器和触发器的访问,这两者协作来启动作业以及作业的 JobDetail 对象的执行。Quartz 通过把作业的状态放在 JobDetail 对象中并让 JobDetail 构造函数启动一个作业的实例,分离了作业的执行和作业周围的状态。JobDetail 对象储存作业的侦听器、群组、数据映射、描述以及作业的其他属性。

 

示例 2:简单触发器

触发器可以实现对任务执行的调度。Quartz 提供了几种不同的触发器,复杂程度各不相同。清单 2 中的 SimpleTrigger 展示了触发器的基础:


清单 2. SimpleTriggerRunner.java

				
    public void task() throws SchedulerException
    {
        // Initiate a Schedule Factory
        SchedulerFactory schedulerFactory = new StdSchedulerFactory();
        // Retrieve a scheduler from schedule factory
        Scheduler scheduler = schedulerFactory.getScheduler();
        
        // current time
        long ctime = System.currentTimeMillis(); 
        
        // Initiate JobDetail with job name, job group, and executable job class
        JobDetail jobDetail = 
        	new JobDetail("jobDetail-s1", "jobDetailGroup-s1", SimpleQuartzJob.class);
     
       // Initiate SimpleTrigger with its name and group name
        SimpleTrigger simpleTrigger =new SimpleTrigger("simpleTrigger", "triggerGroup-s1");
        
        // set its start up time
        simpleTrigger.setStartTime(new Date(ctime));
        // set the interval, how often the job should run (10 seconds here) 
        simpleTrigger.setRepeatInterval(10000);
        // set the number of execution of this job, set to 10 times. 
        // It will run 10 time and exhaust.
       
        simpleTrigger.setRepeatCount(100);
        // set the ending time of this job. 
        // We set it for 60 seconds from its startup time here
        // Even if we set its repeat count to 10, 
        // this will stop its process after 6 repeats as it gets it endtime by then.
        //simpleTrigger.setEndTime(new Date(ctime + 60000L));
        // set priority of trigger. If not set, the default is 5
        //simpleTrigger.setPriority(10);
        // schedule a job with JobDetail and Trigger
        scheduler.scheduleJob(jobDetail, simpleTrigger);
        
        // start the scheduler
        scheduler.start();
    }
            

 

清单 2 开始时实例化一个 SchedulerFactory ,获得此调度器。就像前面讨论过的,创建 JobDetail 对象时,它的构造函数要接受一个 Job 作为参数。顾名思义,SimpleTrigger 实例相当原始。在创建对象之后,设置几个基本属性以立即调度任务,然后每 10 秒重复一次,直到作业被执行 100 次。

还有其他许多方式可以操纵 SimpleTrigger 。除了指定重复次数和重复间隔,还可以指定作业在特定日历时间执行,只需给定执行的最长时间或者优先级(稍后讨论)。执行的最长时间可以覆盖指定的重复次数,从而确保作业的运行不会超过最长时间。

示例 3: Cron 触发器

CronTrigger 支持比 SimpleTrigger 更具体的调度,而且也不是很复杂。基于 cron 表达式,CronTrigger 支持类似日历的重复间隔,而不是单一的时间间隔 —— 这相对 SimpleTrigger 而言是一大改进。

Cron 表达式包括以下 7 个字段:

  • 小时
  • 月内日期
  • 周内日期
  • 年(可选字段)

特殊字符

Cron 触发器利用一系列特殊字符,如下所示:

  • 反斜线(/)字符表示增量值。例如,在秒字段中“5/15”代表从第 5 秒开始,每 15 秒一次。

  • 问号(?)字符和字母 L 字符只有在月内日期和周内日期字段中可用。问号表示这个字段不包含具体值。所以,如果指定月内日期,可以在周内日期字段中插入“?”,表示周内日期值无关紧要。字母 L 字符是 last 的缩写。放在月内日期字段中,表示安排在当月最后一天执行。在周内日期字段中,如果“L”单独存在,就等于“7”,否则代表当月内周内日期的最后一个实例。所以“0L”表示安排在当月的最后一个星期日执行。

  • 在月内日期字段中的字母(W)字符把执行安排在最靠近指定值的工作日。把“1W”放在月内日期字段中,表示把执行安排在当月的第一个工作日内。

  • 井号(#)字符为给定月份指定具体的工作日实例。把“MON#2”放在周内日期字段中,表示把任务安排在当月的第二个星期一。

  • 星号(*)字符是通配字符,表示该字段可以接受任何可能的值。

所有这些定义看起来可能有些吓人,但是只要几分钟练习之后,cron 表达式就会显得十分简单。

清单 3 显示了 CronTrigger 的一个示例。请注意 SchedulerFactorySchedulerJobDetail 的实例化,与 SimpleTrigger 示例中的实例化是相同的。在这个示例中,只是修改了触发器。这里指定的 cron 表达式(“0/5 * * * * ?”)安排任务每 5 秒执行一次。


清单 3. CronTriggerRunner.java

				
    public void task() throws SchedulerException
    {
        // Initiate a Schedule Factory
        SchedulerFactory schedulerFactory = new StdSchedulerFactory();
        // Retrieve a scheduler from schedule factory
        Scheduler scheduler = schedulerFactory.getScheduler();
        
        // current time
        long ctime = System.currentTimeMillis(); 
        
        // Initiate JobDetail with job name, job group, and executable job class
        JobDetail jobDetail = 
        	new JobDetail("jobDetail2", "jobDetailGroup2", SimpleQuartzJob.class);
        // Initiate CronTrigger with its name and group name
        CronTrigger cronTrigger = new CronTrigger("cronTrigger", "triggerGroup2");
        try {
            // setup CronExpression
            CronExpression cexp = new CronExpression("0/5 * * * * ?");
            // Assign the CronExpression to CronTrigger
            cronTrigger.setCronExpression(cexp);
        } catch (Exception e) {
            e.printStackTrace();
        }
        // schedule a job with JobDetail and Trigger
        scheduler.scheduleJob(jobDetail, cronTrigger);
        
        // start the scheduler
        scheduler.start();
    }
            

 

高级 Quartz

如上所示,只用作业和触发器,就能访问大量的功能。但是,Quartz 是个丰富而灵活的调度包,对于愿意研究它的人来说,它还提供了更多功能。下一节讨论 Quartz 的一些高级特性。

 

作业仓库

     Quartz 提供了两种不同的方式用来把与作业和触发器有关的数据保存在内存或数据库中。第一种方式是 RAMJobStore 类的实例,这是默认设置。这个作业仓库最易使用,而且提供了最佳性能,因为所有数据都保存在内存中。这个方法的主要不足是缺乏数据的持久性。因为数据保存在 RAM 中,所以应用程序或系统崩溃时,所有信息都会丢失。

为了修正这个问题,Quartz 提供了 JDBCJobStore 。顾名思义,作业仓库通过 JDBC 把所有数据放在数据库中。数据持久性的代价就是性能降低和复杂性的提高。

设置 JDBCJobStore

     在前面的示例中,已经看到了 RAMJobStore 实例的工作情况。因为它是默认的作业仓库,所以显然不需要额外设置就能使用它。但是,使用 JDBCJobStore 需要一些初始化。

在应用程序中设置使用 JDBCJobStore 需要两步:首先必须创建作业仓库使用的数据库表。 JDBCJobStore 与所有主流数据库都兼容,而且 Quartz 提供了一系列创建表的 SQL 脚本,能够简化设置过程。可以在 Quartz 发行包的 “docs/dbTables”目录中找到创建表的 SQL 脚本。第二,必须定义一些属性,如表 1 所示:


表 1. JDBCJobStore 属性

属性名称 值
org.quartz.jobStore.class org.quartz.impl.jdbcjobstore.JobStoreTX (or JobStoreCMT)
org.quartz.jobStore.tablePrefix QRTZ_ (optional, customizable)
org.quartz.jobStore.driverDelegateClass org.quartz.impl.jdbcjobstore.StdJDBCDelegate
org.quartz.jobStore.dataSource qzDS (customizable)
org.quartz.dataSource.qzDS.driver com.ibm.db2.jcc.DB2Driver (could be any other database driver)
org.quartz.dataSource.qzDS.url jdbc:db2://localhost:50000/QZ_SMPL (customizable)
org.quartz.dataSource.qzDS.user db2inst1 (place userid for your own db)
org.quartz.dataSource.qzDS.password pass4dbadmin (place your own password for user)
org.quartz.dataSource.qzDS.maxConnections 30

清单 4 展示了 JDBCJobStore 提供的数据持久性。就像在前面的示例中一样,先从初始化 SchedulerFactoryScheduler 开始。然后,不再需要初始化作业和触发器,而是要获取触发器群组名称列表,之后对于每个群组名称,获取触发器名称列表。请注意,每个现有的作业都应当用 Scheduler.reschedule() 方法重新调度。仅仅重新初始化在先前的应用程序运行时终止的作业,不会正确地装载触发器的属性。


清单 4. JDBCJobStoreRunner.java

				
    public void task() throws SchedulerException
    {
        // Initiate a Schedule Factory
        SchedulerFactory schedulerFactory = new StdSchedulerFactory();
        // Retrieve a scheduler from schedule factory
        Scheduler scheduler = schedulerFactory.getScheduler();
        
        String[] triggerGroups;
        String[] triggers;
        triggerGroups = scheduler.getTriggerGroupNames();
        for (int i = 0; i < triggerGroups.length; i++) {
           triggers = scheduler.getTriggerNames(triggerGroups[i]);
           for (int j = 0; j < triggers.length; j++) {
              Trigger tg = scheduler.getTrigger(triggers[j], triggerGroups[i]);
              
              if (tg instanceof SimpleTrigger && tg.getName().equals("simpleTrigger")) {
                  ((SimpleTrigger)tg).setRepeatCount(100);
                  // reschedule the job
                  scheduler.rescheduleJob(triggers[j], triggerGroups[i], tg);
                  // unschedule the job
                  //scheduler.unscheduleJob(triggersInGroup[j], triggerGroups[i]);
              }
           }
        }        
        // start the scheduler
        scheduler.start();
    }      
            

 

运行 JDBCJobStore

在第一次运行示例时,触发器在数据库中初始化。图 1 显示了数据库在触发器初始化之后但尚未击发之前的情况。所以,基于 清单 4 中的 setRepeatCount() 方法,将 REPEAT_COUNT 设为 100,而 TIMES_TRIGGERED 是 0。在应用程序运行一段时间之后,应用程序停止。


图 1. 使用 JDBCJobStore 时数据库中的数据(运行前)
在用 JDBCJobStore 运行前

图 2 显示了数据库在应用程序停止后的情况。在这个图中,TIMES_TRIGGERED 被设为 19,表示作业运行的次数。


图 2. 同一数据在 19 次迭代之后
19 次迭代之后

当再次启动应用程序时,REPEAT_COUNT 被更新。这在图 3 中很明显。在图 3 中可以看到 REPEAT_COUNT 被更新为 81,所以新的 REPEAT_COUNT 等于前面的 REPEAT_COUNT 值减去前面的 TIMES_TRIGGERED 值。而且,在图 3 中还看到新的 TIMES_TRIGGERED 值是 7,表示作业从应用程序重新启动以来,又触发了 7 次。


图 3. 第 2 次运行 7 次迭代之后的数据
第 2 次运行 7 次迭代之后

当再次停止应用程序之后,REPEAT_COUNT 值再次更新。如图 4 所示,应用程序已经停止,还没有重新启动。同样,REPEAT_COUNT 值更新成前一个 REPEAT_COUNT 值减去前一个 TIMES_TRIGGERED 值。


图 4. 再次运行触发器之前的初始数据
再次运行触发器之前的初始数据




回页首

 

使用属性

正如在使用 JDBCJobStore 时看到的,可以用许多属性来调整 Quartz 的行为。应当在 quartz.properties 文件中指定这些属性。清单 5 显示了用于 JDBCJobStore 示例的属性:


清单 5. quartz.properties

				
org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount = 10
org.quartz.threadPool.threadPriority = 5
org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread = true
# Using RAMJobStore
## if using RAMJobStore, please be sure that you comment out the following
## - org.quartz.jobStore.tablePrefix, 
## - org.quartz.jobStore.driverDelegateClass, 
## - org.quartz.jobStore.dataSource
#org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore
# Using JobStoreTX
## Be sure to run the appropriate script(under docs/dbTables) first to create tables
org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX
# Configuring JDBCJobStore with the Table Prefix
org.quartz.jobStore.tablePrefix = QRTZ_
# Using DriverDelegate
org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate
# Using datasource
org.quartz.jobStore.dataSource = qzDS
# Define the datasource to use
org.quartz.dataSource.qzDS.driver = com.ibm.db2.jcc.DB2Driver
org.quartz.dataSource.qzDS.URL = jdbc:db2://localhost:50000/dbname
org.quartz.dataSource.qzDS.user = dbuserid
org.quartz.dataSource.qzDS.password = password
org.quartz.dataSource.qzDS.maxConnections = 30    
	        

 

结束语

Quartz 作业调度框架所提供的 API 在两方面都表现极佳:既全面强大,又易于使用。Quartz 可以用于简单的作业触发,也可以用于复杂的 JDBC 持久的作业存储和执行。OpenSymphony 在开放源码世界中成功地填补了一个空白,过去繁琐的作业调度现在对开发人员来说不过是小菜一碟。

 


连接SAP配置(LIB包在SAP LIB中)
1)    SUN JDK1.5(API 运行)


WINDOWS
      把librfc32.dll,sapjcorfc.dll放入WINDOWS SYSTEM32目录下
      项目中引用sapjco.jar。
LINUX
把librfccm.so,libsapjcorfc.so 放入任意目录并且在.brash.rc文件中引入环境变量。项目中引用sapjco.jar。

2)    IBM WEBSPHERE JDK1.5(WEB 运行)

LINUX
把librfccm.so,libsapjcorfc.so 放入IBM/WebSphere/AppServer/bin中并在.brash.rc文件中引入该目录环境变量。在IBM/WebSphere/AppServer/lib/中加入sapjco.jar。
           
        测试环境是否成功:bash-2.05b# /export/home/oracle/midtier/jdk/jre/bin/java -jar
                            sapjco.jar -stdout

 

 

Quartz定时使用JCo同步SAP系统数据

http://www.iteye.com/topic/456909

一、   项目需求

业务系统需要调用 SAP 系统的财务相关功能,调用时需要提供其所需的专有参数,如公司、科目,而这些参数都将作为可选项存在,有的可能存在上千项,如某公司下有上千个费用科目,如果每次调用时都实时链接 SAP 获取这些可选项数据,将给业务系统的性能造成影响,因此需要在业务系统上保存这些数据。

二、    项目分析

提供 SAP 系统财务相关功能所需的参数多为短时间内变化量不大的数据,如:公司、科目,在时效性上没有要求,新添加了一个科目,第二天在业务系统上才有 更新可以被用户接受,因此,可以先将所需数据一次性全部保存到业务系统,然后定时同步有变化的数据。而业务系统读取这些数据时,只需要再编写 js 脚本对外提供以指定格式显示的函数即可。

三、   系统设计

数据由 SAP 系统所有,因此应该由 SAP 提供函数,定时执行,提供有变化的数据,提交到业务系统,业务系统根据 SAP 提供的数据,更新自己已经保存的数据。因此首先想到使用 WebService 方式,由业务系统提供服务,接受 XML 格式的数据,更新自己的数据。但是经测试, SAP 系统支持的 WSDL 文件规范比较低,在 SAP 系统中添加 WebService 时,业务系统提供的 WSDL 文件并不能为 SAP 系统所识别。所以,采用业务系统定时使用 Jco 链接 SAP ,执行 RFC 函数,获得有变化的数据( RFC 函数获取有变化的数据,拼成可保存为 XML 文件的字符串),更新自己的数据的方式。这里使用 Spring Quartz 来作为任务调度器,定义同步数据为一个 Job ,定义每隔一定时间为一个 Trigger (定时触发)。

四、   程序编写

1.     启动程序

com/sap/jco/SpringSchedule.java

在此文件中加载 Spring 配置文件,启动应用

2.     bean.xml

定义了 Quartz 任务调度器的实现类 schedule ,定义此调度器的触发器为 simpleTrigger ,在此 bean 中设置了触发器的启动时间和执行间隔,当然,也可以使用 org.springframework.scheduling.quartz.CronTriggerBean ,其可以设置具体在什么时间执行(视项目情况选取合适的 Trigger ),定义此调度器的 Job methodInvokingJobDetail ,在这个 Job 中使用继承了 TimerTask syncTask 中的 start 方法。

3.     真正的 Job

com/sap/jco/SyncTask.java

start() 中执行 writeService.write(readService.read());

4.     链接 SAP

com/sap/jco/util/JCOUtils.java

根据 sapBean 中配置的参数执行链接,并提供创建指定名称函数、执行指定函数对象的方法

注意:将库文件 libsapjco3.so 放在 $JAVA_HOME/jre/lib/i386 目录下

5.     获取数据

com/sap/jco/dao/impl/ReadManagerImpl.java

根据 sapbean.xml 中装配的 sapBean 链接 SAP 系统,创建函数,执行,从返回结果中获取指定名称的信息,并以名称值为 key 存储到 HashMap

6.     更新数据

com/sap/jco/dao/impl/WriteManagerImpl.java

HashMap 中根据 key 得到对应的信息,将此信息保存为 XML 文件,分别从保存原有信息和新信息的 XML 文件中得到 beanList ,然后与原有的数据做对比,如果新信息操作标示为“ D ”,则在原有信息中按照主键查找,如果存在,从原有数据中删除;如果新信息操作标示为“ U ”,则在原有信息中按照主键查找,如果存在,从原有数据中先删除记录,再添加新纪录;如果信息操作标示为“ I ”,则直接插入。操作完成后将已经有变化的信息重新写入文件。

7.      js 脚本获取数据

参见 js/funcForSAPData.js

五、   系统测试

经测试,可以达到预期效果。

六、   优缺点分析

优点:

同步数据

采用与业务系统松耦合的设计,独立于业务系统运行。

显示数据

使用 js 脚本从 xml 文件中获取数据格式化显示,在业务系统需要调用数据的位置添加 js 函数即可。

缺点:

同步数据

获取到更新的数据进行同步时,在原有数据中按照主键查找时如果不做优化,当数据量比较大时可能会影响性能。

显示数据

如果业务系统中调用数据的逻辑比较复杂,可能会导致 js 脚本量大量增加,为可读性和可维护性带来困难。


http://open-open.com/14.htm

 Quartz 

Quartz 是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它可以与J2EE与J2SE应用程序相结合也可以单独使用。Quartz可以用来创建简单或为运行十个,百个, 甚至是好几万个Jobs这样复杂的日程序表。Jobs可以做成标准的Java组件或 EJBs。Quartz 的最新版本为Quartz 1.5.0
Quartz 是一个强大的企业级 Schedule 工具,也是目前最好的开源 Schedule 工具。
Spring中也集成了quartz的应用.

 jcrontab 

它是由Java语言编写的日程处理程序,它目的是提供强大的定时处理功能,让我们的应用程序可以按照提供的时间表来执行不同的应用。Jcrontab的特点
1、在指定的时间表中可执行Classes/Threads/main/EJB/Methods/NativePrograms等应用。
2、提供完全按照Unix的UNIX-POSIX crontab的格式来规定时间。
3、可存储或读取由文件,数据字典,或通过数据源链接的数据库的信息。
4、可将执行结果通过电子邮件来查看
5、 非常容易的可以和Web应用服务器结合,Tomcat, Resin, Jetty and Jboss这些服务器已经通过测试和应用,这一切只需要在web.xml中添加load-on-startup直接指定Jcrontab下的 loadCrontabServlet,就可以了。
6、它的设计和部署是高性能并可扩展的。

更多jcrontab信息

 Gos4j 

Gos4j是一个多任务处理顺序软件。支持未知环境的实时处理。可以根据最终目标选择被处理的优先级。

更多Gos4j信息

 Oddjob 

Oddjob是一个采用Java 语言开发的作业调度工具,通过图形化界面或者是XML文件进行任务的设定,支持按顺序执行、并行执行以及根据预设条件执行任务,可运行于桌面或者是服务器,可以通过JMX方式对其进行管理和设定。同时还提供了基于浏览器的状态监控页面。

更多Oddjob信息

 Fulcrum Scheduler 

Fulcrum Scheduler基于Turbine的TurbineScheduler。它利用一个XML配置文件导入所有调度程度。

更多Fulcrum Scheduler信息

 Essiembre J2EE Scheduler 

J2EE Scheduler是一个为J2EE应用程序提供一个简单的任务调度机制,这个library是基于标准Java API中的Timer 和 TimerTask类。任务的执行与执行的频率是通过XML文件进行配置的。一个典型的应用就是定时性地刷新内存中的数据以确保数据是最新的。

更多Essiembre J2EE Scheduler信息

 Job Scheduler 

Job Scheduler是一个以demon方式运行的批处理程序,并且能够使用图形用户界面进行控制。Job Scheduler使用XML来配置任务处理的频率与时间。它提供一个可以用来控制Job事件与日记的API(可以用 Java,Javascript,Perl,VBScript等语言来调用这个API)。

更多Job Scheduler信息

 JDRing 

JDRing是一个轻量级的Java scheduling包。它既简单又小,但仍然支持在指定的时间间隔内实现提醒功能。当处理复杂schedules时JDRing也采用类似于cron的控制方式。

更多JDRing信息

 JobServer 

JobServer 是一个基于Web的Java作业调度引擎和工作流服务器。它有许多调度规则并支持程序授权用户进行企业级的作业配置,运行,监控。JobServer的特 性:不需要编程就能够设定和调度作业。易于使用完全基于Web的GUI。具备构造和处理上万个作业的能力。能对作业按组划分进行创建和管理。作业依赖调 度。支持多种数据库包括:Oracle,PostgreSQL和MYSQL。高级搜索功能-能快速查找到自己要的作业。支持SSL等。

更多JobServer信息

 jBatchEngine 

jBatchEngine 是一个采用Java开发的批任务spooler。jBatchEngine与其它以时间为驱动的Job调度引擎不同之处在于它是以事件以驱动,可用于启动 任何批处理程序。jBatchEngine可以安装成一个Windows Service或一个Unix Daemon。

更多jBatchEngine信息

 cron4j 

cron4j是一个轻量级的java任务调度工具,可以采用Unix Crontab语法来设置任务调度时间。
cron4j.JPG

更多cron4j信息

 

end

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics