论文部分内容阅读
摘要:Java语言凭借跨平台、面相对象、功能强大等优点,已经成为现在最流行的语言之一。在J2EE web项目中,有一种常见的应用被称作作业调度的应用。文中对作业调度的应用背景进行了归纳总结,并结合实例对作业调度的实现步骤进行了介绍,有助于读者从整体上快速掌握作业调度的概念和实现。同时只要对实例进行简单的修改就可以进行实际应用,具有较强的适用价值。
关键词:作业调度;Quartz;Java邮件服务
中图分类号:TP311文献标识码:A文章编号:1009-3044(2007)17-31348-01
Instance Analysis Of Java Schedule Job
ZHENG Xue-song1,TAN Hong-yang2
(Beijing Forestry University,Beijing 100083,China)
Abstract:By the advantage of cross-platform, object oriented and powerful functionality, Java has being one of the most popular language. There is an usual application called schedule job in the J2EE projects. The background of this application has been summarized and there is a description of a schedule job demo, which are helpful for readers in recognizing and implementing java schedule job. And that demo is so practical that it can be used just with little change.
Key words:Schedule Jos; Quartz;Java Mail
1 应用背景
作业调度是J2EE web项目中常见的应用。它可以按照开发者指定的时间间隔执行的操作,并完成一些无需用户输入的任务。作业调度主要用于以下两大需求:
1.1 减轻系统负荷
有些网站具有很大的访问量,为了缓解网络压力和保障系统效率,一些对及时性要求较小的任务就可以放到流量较小的时间执行。如很多人才招聘网站将给注册成功的用户发送邮件和清理垃圾信息的工作放到凌晨执行。
1.2 定时自动执行
有些任务是需要在固定的时间执行的,使用作业调度可以避免人工的干预,从而按时自动执行。比如企业的财务系统可能在每月固定的日期生成上个月各部门的财务月报;很多论坛会每隔半个小时生成精华文章的RSS文件,每天凌晨统计论坛用户的积分排名,每隔30分钟执行锁定用户解锁任务等。
2 本文的目的
本文将结合一个定时发送email的作业调度实例,向读者完整的讲解整个作业调度的实现过程。不仅可以使读者较快的掌握作业调度的使用方法,也可以对本文的实例进行修改而进行实际应用。
3 实现的技术基础
Java的作业调度的功能主要是依靠Quartz进行实现的。本文将以定时向收件人发送邮件通知为需求背景,结合Quartz和Java Mail技术进行技术实现,通过实例来说明Java作业调度和发送邮件的一种实现方式。
3.1 Quartz技术
Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它完全由Java写成,可以与J2EE与J2SE应用程序相结合也可以单独使用。其目前最新版本为Quartz 1.6.0。(http://www.opensymphony.com/quartz)
Quartz自2001年首次发布版本开始,被广泛的应用为作业调度的解决方案。它具有使用简单,灵活性高的优点。它所提供的强大功能使你可以应付绝大多数的调度需求。比如既可以设置作业在固定的时间点执行,也可以间隔一定的时间执行。而各种时间形式,都可以在触发器中非常简单的进行设置,从而体现了其简单性的优点。
3.2 Java Mail技术
Java Mail API是Sun开发的最新标准扩展API之一,它给Java应用程序开发者提供了独立于平台和协议的邮件/通讯解决方案。
4 配置及代码实现
4.1 配置包文件
编写程序前,首先要配置好三个必要的包文件。虽然JavaMail是Sun的API之一,但它目前还没有被加在标准的java开发工具包中(Java Development Kit),这就意味着你在使用前必须另外下载JavaMail文件(可以登录sun公司网站下载)。把javamai的mail.jar和jaf的activation.jar和quartz-1.6.0的库一起加入到环境变变量中。
4.2 配置初始类文件initialServlet
在应用系统启动的时候,定时任务的调用程序(initialServlet类)也同时启动。以上工作需要通过在服务器的web.xml文件中对加载的类文件的配置进行实现:
<servlet>
<servlet-name>initialServlet</servlet-name>
<servlet-class>test.InitialServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
4.3 在InitialServlet类中调用MyTimer的schedule方法
InitialServlet类继承自HttpServlet类,其init()方法将会自动执行。此处在init方法中终获取任务调度(MyTimer类)的实例并执行其中的schedule()方法:
public void init() throws ServletException {
MyTimer.getInstance().schedule() ;
}
4.4 MyTimer类schedule()方法的主要代码
SchedulerFactory sf = new StdSchedulerFactory() ;
Scheduler scheduler = sf.getScheduler() ;
java.util.Calendar cal = java.util.Calendar.getInstance() ;
cal.setTimeInMillis( System.currentTimeMillis() ) ;
//根据毫秒为单位的当前时间,设置当前时间值
cal.set( java.util.Calendar.HOUR_OF_DAY , 2) ;
//将时间值中的小时设置为2点
java.util.Date startDate = cal.getTime() ;
//返回时间值作为开始时间
cal.set(java.util.Calendar.YEAR , 2099 ) ;
java.util.Date endDate = cal.getTime() ;
//结束时间为2099年
JobDetail reminderJob = new JobDetail( "reminder" , Scheduler.DEFAULT_GROUP , ReminderJob.class ) ;
SimpleTrigger reminderTrigger = new SimpleTrigger( "remandertrigger" , Scheduler.DEFAULT_GROUP , startDate , endDate , SimpleTrigger.REPEAT_INDEFINITELY , IBNETTimer.repeatInterval ) ;
//设置作业发生的时间:当天2点开始至2099年2点结束;发生时间间隔:1天
scheduler.scheduleJob( reminderJob , reminderTrigger ) ;
scheduler.start();
以上代码主要实现了以下功能:
(1)首先设置了任务执行的开始、结束时间以及时间间隔,将其作为任务触发器reminderTrigger的参数。(Quartz中的触发器用来告诉调度程序作业什么时候触发. 触发器有SimpleTrigger和CronTrigger两种类型,本文选择的是SimpleTrigger。)
(2)设置需要被执行的作业实现类(ReminderJob.class)作为参数传递给JobDetail的构造函数。
(3)使用Scheduler的scheduleJob方法按照reminderTrigger设置的时间和频率来执行reminderJob类的功能。
至此已设定完触发器,可以开始调度发送邮件的工作了。
4.5 发送邮件的ReminderJob类
ReminderJob作为执行作业的java类,它需实现org.quartz.job接口,并通过重写job接口的execute()方法实现被调度的作业体。一旦Quartz确定作业运作的时候,它将调用execute()方法体。以下代码均由excecute方法调用执行。
4.5.1 设置邮件基本信息
Session mailSession = Session.getDefaultInstance(props);
mailSession.setDebug(false);
Message message = new MimeMessage(mailSession);
message.setFrom(new InternetAddress(“**@**.com”));//发信email
message.addRecipient(Message.RecipientType.TO,
new InternetAddress(“***@***.com”));//收信email
message.setSubject(subject);//设置邮件主题
message.setText(content);//设置邮件正文
message.saveChanges();
以上通过获得基本邮件会话(Session)对象创建了要发送邮件的消息(Message)对象。消息对象模型化实现了email消息的所有细节。此处使用了基本的邮件的发送、接收地址,以及邮件的标题、正文等设置。
4.5.2 设置登陆邮件服务器信息
Transport transport = mailSession.getTransport("smtp");
//使用MailSession类的getTransport("smtp")方法返回Transport对象。
Transport.connect(host, user, password);
Transport.sendMessage(message, message.getAllRecipients());
transport.close();
此处代码为Transport对象设置了发送邮件的邮件服务器主机地址(host)以及用户名(user)和密码(password)并连接邮箱。然后按照message中设置的邮件标题、正文等信息的发送给收件人。至此被调度的作业执行完毕。
以上就是结合Quartz和Java Mail实现的每天发送邮件的一种作业调度的典型应用。对于很多系统来讲都是非常实用的参照。比如可以按照自己需要设置其他的作业执行时间;按照实际的业务将收件人和邮件内容设置为其他固定值或者数据库中的存在值。只要进行简单的修改就可以实际应用。而且Quartz和Java Mail的API所包括的类数量远大于本文实例涉及的部分,他们也会支持更加复杂的应用。
参考文献:
[1]陈雄华.在Spring中使用Quartz进行任务调度.ITPUB网站,2007年4月25日.
[2]刘晓华.等.精通Java核心技术[M].电子工业出版社,2003年8月.
[3]John Hunt,Chris Loftus.精通J2EE—Java企业级应用[M].清华大学出版社,2004年7月.
关键词:作业调度;Quartz;Java邮件服务
中图分类号:TP311文献标识码:A文章编号:1009-3044(2007)17-31348-01
Instance Analysis Of Java Schedule Job
ZHENG Xue-song1,TAN Hong-yang2
(Beijing Forestry University,Beijing 100083,China)
Abstract:By the advantage of cross-platform, object oriented and powerful functionality, Java has being one of the most popular language. There is an usual application called schedule job in the J2EE projects. The background of this application has been summarized and there is a description of a schedule job demo, which are helpful for readers in recognizing and implementing java schedule job. And that demo is so practical that it can be used just with little change.
Key words:Schedule Jos; Quartz;Java Mail
1 应用背景
作业调度是J2EE web项目中常见的应用。它可以按照开发者指定的时间间隔执行的操作,并完成一些无需用户输入的任务。作业调度主要用于以下两大需求:
1.1 减轻系统负荷
有些网站具有很大的访问量,为了缓解网络压力和保障系统效率,一些对及时性要求较小的任务就可以放到流量较小的时间执行。如很多人才招聘网站将给注册成功的用户发送邮件和清理垃圾信息的工作放到凌晨执行。
1.2 定时自动执行
有些任务是需要在固定的时间执行的,使用作业调度可以避免人工的干预,从而按时自动执行。比如企业的财务系统可能在每月固定的日期生成上个月各部门的财务月报;很多论坛会每隔半个小时生成精华文章的RSS文件,每天凌晨统计论坛用户的积分排名,每隔30分钟执行锁定用户解锁任务等。
2 本文的目的
本文将结合一个定时发送email的作业调度实例,向读者完整的讲解整个作业调度的实现过程。不仅可以使读者较快的掌握作业调度的使用方法,也可以对本文的实例进行修改而进行实际应用。
3 实现的技术基础
Java的作业调度的功能主要是依靠Quartz进行实现的。本文将以定时向收件人发送邮件通知为需求背景,结合Quartz和Java Mail技术进行技术实现,通过实例来说明Java作业调度和发送邮件的一种实现方式。
3.1 Quartz技术
Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它完全由Java写成,可以与J2EE与J2SE应用程序相结合也可以单独使用。其目前最新版本为Quartz 1.6.0。(http://www.opensymphony.com/quartz)
Quartz自2001年首次发布版本开始,被广泛的应用为作业调度的解决方案。它具有使用简单,灵活性高的优点。它所提供的强大功能使你可以应付绝大多数的调度需求。比如既可以设置作业在固定的时间点执行,也可以间隔一定的时间执行。而各种时间形式,都可以在触发器中非常简单的进行设置,从而体现了其简单性的优点。
3.2 Java Mail技术
Java Mail API是Sun开发的最新标准扩展API之一,它给Java应用程序开发者提供了独立于平台和协议的邮件/通讯解决方案。
4 配置及代码实现
4.1 配置包文件
编写程序前,首先要配置好三个必要的包文件。虽然JavaMail是Sun的API之一,但它目前还没有被加在标准的java开发工具包中(Java Development Kit),这就意味着你在使用前必须另外下载JavaMail文件(可以登录sun公司网站下载)。把javamai的mail.jar和jaf的activation.jar和quartz-1.6.0的库一起加入到环境变变量中。
4.2 配置初始类文件initialServlet
在应用系统启动的时候,定时任务的调用程序(initialServlet类)也同时启动。以上工作需要通过在服务器的web.xml文件中对加载的类文件的配置进行实现:
<servlet>
<servlet-name>initialServlet</servlet-name>
<servlet-class>test.InitialServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
4.3 在InitialServlet类中调用MyTimer的schedule方法
InitialServlet类继承自HttpServlet类,其init()方法将会自动执行。此处在init方法中终获取任务调度(MyTimer类)的实例并执行其中的schedule()方法:
public void init() throws ServletException {
MyTimer.getInstance().schedule() ;
}
4.4 MyTimer类schedule()方法的主要代码
SchedulerFactory sf = new StdSchedulerFactory() ;
Scheduler scheduler = sf.getScheduler() ;
java.util.Calendar cal = java.util.Calendar.getInstance() ;
cal.setTimeInMillis( System.currentTimeMillis() ) ;
//根据毫秒为单位的当前时间,设置当前时间值
cal.set( java.util.Calendar.HOUR_OF_DAY , 2) ;
//将时间值中的小时设置为2点
java.util.Date startDate = cal.getTime() ;
//返回时间值作为开始时间
cal.set(java.util.Calendar.YEAR , 2099 ) ;
java.util.Date endDate = cal.getTime() ;
//结束时间为2099年
JobDetail reminderJob = new JobDetail( "reminder" , Scheduler.DEFAULT_GROUP , ReminderJob.class ) ;
SimpleTrigger reminderTrigger = new SimpleTrigger( "remandertrigger" , Scheduler.DEFAULT_GROUP , startDate , endDate , SimpleTrigger.REPEAT_INDEFINITELY , IBNETTimer.repeatInterval ) ;
//设置作业发生的时间:当天2点开始至2099年2点结束;发生时间间隔:1天
scheduler.scheduleJob( reminderJob , reminderTrigger ) ;
scheduler.start();
以上代码主要实现了以下功能:
(1)首先设置了任务执行的开始、结束时间以及时间间隔,将其作为任务触发器reminderTrigger的参数。(Quartz中的触发器用来告诉调度程序作业什么时候触发. 触发器有SimpleTrigger和CronTrigger两种类型,本文选择的是SimpleTrigger。)
(2)设置需要被执行的作业实现类(ReminderJob.class)作为参数传递给JobDetail的构造函数。
(3)使用Scheduler的scheduleJob方法按照reminderTrigger设置的时间和频率来执行reminderJob类的功能。
至此已设定完触发器,可以开始调度发送邮件的工作了。
4.5 发送邮件的ReminderJob类
ReminderJob作为执行作业的java类,它需实现org.quartz.job接口,并通过重写job接口的execute()方法实现被调度的作业体。一旦Quartz确定作业运作的时候,它将调用execute()方法体。以下代码均由excecute方法调用执行。
4.5.1 设置邮件基本信息
Session mailSession = Session.getDefaultInstance(props);
mailSession.setDebug(false);
Message message = new MimeMessage(mailSession);
message.setFrom(new InternetAddress(“**@**.com”));//发信email
message.addRecipient(Message.RecipientType.TO,
new InternetAddress(“***@***.com”));//收信email
message.setSubject(subject);//设置邮件主题
message.setText(content);//设置邮件正文
message.saveChanges();
以上通过获得基本邮件会话(Session)对象创建了要发送邮件的消息(Message)对象。消息对象模型化实现了email消息的所有细节。此处使用了基本的邮件的发送、接收地址,以及邮件的标题、正文等设置。
4.5.2 设置登陆邮件服务器信息
Transport transport = mailSession.getTransport("smtp");
//使用MailSession类的getTransport("smtp")方法返回Transport对象。
Transport.connect(host, user, password);
Transport.sendMessage(message, message.getAllRecipients());
transport.close();
此处代码为Transport对象设置了发送邮件的邮件服务器主机地址(host)以及用户名(user)和密码(password)并连接邮箱。然后按照message中设置的邮件标题、正文等信息的发送给收件人。至此被调度的作业执行完毕。
以上就是结合Quartz和Java Mail实现的每天发送邮件的一种作业调度的典型应用。对于很多系统来讲都是非常实用的参照。比如可以按照自己需要设置其他的作业执行时间;按照实际的业务将收件人和邮件内容设置为其他固定值或者数据库中的存在值。只要进行简单的修改就可以实际应用。而且Quartz和Java Mail的API所包括的类数量远大于本文实例涉及的部分,他们也会支持更加复杂的应用。
参考文献:
[1]陈雄华.在Spring中使用Quartz进行任务调度.ITPUB网站,2007年4月25日.
[2]刘晓华.等.精通Java核心技术[M].电子工业出版社,2003年8月.
[3]John Hunt,Chris Loftus.精通J2EE—Java企业级应用[M].清华大学出版社,2004年7月.