您的位置:首页>项目管理>质量管理>

在RAD中开发、配置并测试基于Session Bean的Scheduler任务

[ 来源:developerworks | 更新日期:2007-7-15 20:25:37 | 评论 0 条 | 我要投稿 ]

本文介绍了WebSphere Application Server提供的应用编程扩展之一:Schedule的相关概念,以向控制台输出"Hello World"信息作为一个任务并以此为例说明了在Rational Application Developer中如何开发、创建、配置并最终测试这一Schedule任务。
1. 前言
字串4

本文介绍了WebSphere Application Server提供的应用编程扩展之一:Schedule的相关概念,以向控制台输出"Hello World"信息作为一个任务并以此为例说明了在Rational Application Developer中如何开发、创建、配置并最终测试这一Schedule任务。

字串6

2. Scheduler简介 字串3

Scheduler是WebSphere Application Server提供的应用编程扩展之一。 Scheudler服务提供了WebSphere Application Server 中配置、管理与开发基于时间的工作任务的功能。在Scheduler服务管理之下, 特定的操作或任务可在将来的某一时间运行一次,也可以按指定的时间间隔反复运行。WebSphere Application Server中的Scheduler服务为管理和调度任务提供了高的可靠性和运行性能,同时提供了对任务的持久存储管理与事务管理。 字串4

使用Scheduler服务管理任务具有以下优点:

字串2

简化系统管理步骤,降低系统管理成本
将特定的任务交由Scheduler服务调度、管理并执行,可极大的简化管理步骤,降低管理成本。同时,Scheduler服务在WebSphere Application Server中的管理也与其它资源的管理具有很好的一致性,对Scheduler服务的创建、更新、调度、验证以及监控等任务均可在WebSphere Application Server管理控制台中完成。
可扩展
Scheduler服务可在集群环境下工作,使用负载均衡可达到更佳性能并提供更高的可靠性。
多样的日期算法
Scheduler服务根据为每一任务指定的日历来决定该任务何时开始执行、每隔多长时间运行一次以及重复执行多少次。UserCanlendar接口实现类即包括定义的日期算法已确定任务被执行的时间。如果WebSphere Application Server 提供的缺省UserCanlendar实现无法满足需要,开发人员可开发特定的日历并将其指定给任务。
一般而言,具备以下特性的任务可考虑将其托管给Scheduler服务进行管理与调度: 字串2

在系统负载较低时(如夜间)定期执行的备份、清除等任务
与用户没有交互的后台任务
需要运行较长时间的任务
需定时执行或反复执行的任务
2.1. 调度程序 字串3

调度程序是WebSphere Application Server中使用管理控制台进行配置的,为Scheduler服务提供任务的持久存储、事务管理以及安全管理的应用程序。可在单个服务器、集群、节点或单元中创建多个调度程序。每个配置后的调度程序是一个独立任务调度引擎,它拥有唯一的 Java 命名与目录接口(JNDI)名称、持久存储设备和守护程序。

字串4

必须先使用管理控制台、配置服务或脚本编制配置调度程序,应用程序才能使用 Scheduler服务。概念上,调度程序类似于数据源,我们必须为它指定包括绑定实例的 JNDI 名称在内的各种配置属性。一旦定义了调度程序,使用调度程序 API 或 WASScheduler MBean 的应用程序就可以查找调度程序对象并调用各种方法来管理任务。

字串6

调度程序的运行依赖于一个数据库,以用于存储它的持久信息。数据库及其位置应当由应用程序开发者和服务器管理员决定。 调度程序使用这个数据库来存储然后运行这些任务。同时,当我们在每个调度程序配置中指定唯一的表前缀值时,多个调度程序可以共享一个数据库。这种共享可以降低调度程序数据库的管理成本。

字串9

2.2. Scheduler 任务实现 字串6

Scheduler服务可调度由以下两种方式实现的任务: 字串6

调用会话Bean的任务
发送java消息的服务
在本文中,我们将使用在控制台中打印输出"Hello World"作为任务并以此为例说明在Rational Application Developer中如何开发、部署和测试调用会话Bean的任务。

字串6

2.3. Scheduler服务相关接口说明

字串4

2.3.1. Scheduler接口 字串4

在调度程序配置的 JNDI 名称空间中存在一个 com.ibm.websphere.scheduler.Scheduler Java 对象。您可以通过查找 JNDI 名称获取调度程序的引用。获得对Scheduler对象的引用后即可以对任务执行创建、暂挂、取消等操作。

字串9

2.3.2. TaskInfo接口

字串7

TaskInfo 对象包含可用于创建任务的信息。这类信息包括任务的名称,标识,开始运行时间,重复运行的时间间隔,重复运的次数以及为任务指定的UserCalendar对象。 字串4

该类有多种实现方法,每种方法对应于一种可以运行的任务。可用的 TaskInfo 实现有: 字串2

BeanTaskInfo :调用无状态会话 bean。

字串3

MessageTaskInfo : 将 JMS 消息发送到队列或将消息发布到主题。 字串5

创建 TaskInfo 对象后,可以通过调用 Scheduler.create() 方法将该对象提交到调度程序以创建任务。 字串5

2.3.3. TaskHandler接口

字串2

任务处理程序是一个用户定义的无状态会话 bean,它由使用 BeanTaskInfo 对象创建的任务调用。任务处理程序 bean 使用以下主接口和远程接口: 字串2

字串6

com.ibm.websphere.scheduler.TaskHandlerHome
com.ibm.websphere.scheduler.TaskHandler
字串1


bean 本身需要实现远程接口中定义的 process() 方法。如果使用 BeanTaskInfo 对象创建任务,每当运行任务时,将调用 TaskHandler 会话 bean 中的 process() 方法。因此,任务所包含的业务逻辑应在此方法种实现。 字串4

2.3.4. UserCanlendar接口

字串9

用户日历是一个用户定义的无状态会话 bean,当任务需要计算与日期相关的值时会调用它。实现一个用户日历必须实现UserCanlendar接口。用户日历 bean 使用以下 home 接口和远程接口:

字串4

字串2

com.ibm.websphere.scheduler.UserCalendarHome
com.ibm.websphere.scheduler.UserCalendar

字串5


bean 本身需要实施远程接口中的 applyDelta() 和 validate() 方法。 字串8

用户日历用于计算时间间隔,如任务运行之间的时间。在其被创建后使用 setUserCalendar() 方法在 TaskInfo 接口进行设置,并在需要计算变化量时由调度程序运行时代码调用。 字串2

TaskInfo 接口提供以下方法指定了使用用户日历进行计算的变化量字符串: 字串7

字串8

setStartTimeInterval
setStartByInterval
setRepeatInterval
字串9


如果未使用 TaskInfo.setUserCalendar() 方法指定用户日历,系统将使用一个缺省用户日历。缺省日历允许简单变化量规范,如秒、分、时、天和月。WebSphere Application Server提供两种类型的缺省用户日历:

字串1

CRON: 该种类型的日历根据一个以空格或Tab键分隔的字符串表达式计算时间。

字串6

SIMPLE:该种类型的日历简单的根据java.util.Canlendar对象计算时间。 字串6

由于SIMPLE类型的日历计算方法较为简单也较容易理解,在此我们只距离说明CRON类型的日历。CRON日历根据以下格式的字符串结算时间: 字串4

秒 分 小时 日 月 星期 字串5

在表示某一具体时间项目时, "*"号表示任意值;用","号分隔特定的有效值;"-"号表示特定范围;"/"表示增量;"?"表示不确定值。 例如: 字串9

0 23 10 19 FEB ?

字串8

表示二月19日10点23分零秒;

字串3

0 * 12/6 ? JAN-JUN SAT,SUN

字串2

表示一月至六月,每月的周六与周日两天,每天中的12点、18点和24点,每小时中的任意一分钟。

字串9

当使用CRON类型的缺省用户日历时,可使用以上格式的字符串计算任务开始时间及时间间隔。

字串9

请注意,由于Scheduler在调度任务时并不会精确到秒,因此推荐将表示秒的一项始终设为0。

字串5

3. 开发基于会话Bean的schedule任务 字串6

为运行本文中的例子,您必须安装以下软件产品: 字串8

Rational Application Developer 6.0

字串5

DB2 Universal v8.0 或以上版本

字串8

Rational Application Developer 6.0

字串7

提供了开发、测试scheduler的运行时环境,而DB2将作为存贮调度程序持久信息的数据库。 字串2

首先打开Rational Application Developer,选择某一目录作为RAD的工作空间目录,如下图所示:

字串2


图 3 1 选择RAD工作空间 字串4


选择进入J2EE视图,创建一个EJB项目用以开发由会话Bean实现的任务,如下图所示:

字串8


图 3 2 新建EJB项目 字串6


右键单击"EJB项目",选择"新建"->"EJB项目",输入"ScheduleEJB"作为EJB项目名称,输入"ScheduleEAR"作为EAR项目名称,接受其它缺省选项,点击"完成"。创建EJB以及EAR项目后,项目资源管理器如下图所示:

字串2


图 3 3 项目资源管理器 字串9


单击创建的EJB项目"ScheduleEJB",展开"部署描述符:ScheduleEJB"->"会话Bean", 右键单击"会话Bean",选择"新建"->"会话Bean",如下图所示:

字串1


图 3 4 新建会话Bean

字串3


输入"Schedule"作为会话Bean名称,输入"ibm.sample.schedule"作为包名,点击"下一步" 字串1


图 3 5 输入会话Bean名称 字串2


该 会话Bean必须实现com.ibm.websphere.scheduler.TaskHandler 远程接口中的 process() 方法并在改方法中包含的业务逻辑。 当运行任务时,process() 方法将被调用。

字串8

注意此处不能接受RAD在创建EJB时指定的缺省值,应在"远程home接口"输入"com.ibm.websphere.scheduler.TaskHandlerHome";在"远程接口"中输入"com.ibm.websphere.scheduler.TaskHandler", 点击"完成"

字串3


图 3 6 输入远程接口及远程home接口

字串4


成功创建会话Bean后,项目"ScheduleEJB"项目在项目资源管理器中应如下图所示: 字串8


图 3 7 创建Scheduler会话Bean后的EJB项目 字串7


如前所述,当任务运行时,process()方法将被调用,应此我们应为ScheduleBean实现该方法并添加业务逻辑。 字串6

这里的业务逻辑很简单:在控制台上输出"hello world!"并同时输出系统当前时间。 字串8

打开ScheduleBean.java文件, 添加以下代码:

字串3

字串4

public void process(TaskStatus arg){
System.out.println("hello world!");
Date now=new Date();
System.out.println("say hello at : "+now.toString());
}
字串3


至此,我们已创建了一个向控制台输出信息的任务。

字串1

4. 创建与配置Scheduler服务

字串1

缺省情况下,当我们创建企业应用项目以及EJB项目后,RAD将自动生成一个WebSphere Application Server v6.0服务器。您可以在"服务器"视图中看到该服务器。接下来,我们将启动该服务器并完成创建和配置Scheduler服务的工作。

字串6

在"服务器"视图中选中该服务器,点击"启动"按钮, 待服务器成功启动后,右键单击服务器,点击"运行管理控制台",如下图所示:

字串9


图 4 1运行管理控制台

字串8


进入管理控制台后,在左侧导航栏中选择"资源"->"Scheduler",在右侧页面中将列出当前已配置的Scheduler服务的状态,如下图所示:

字串3


图 4 2浏览当前Scheduler服务

字串7


如前文所述,Scheduler调度程序需要使用数据库提供调度任务的持久存储服务,因此在创建Scheduler服务之前,请确保启动数据库(如采用本例中使用的DB2数据库,可在命令行中输入"db2start"命令启动数据库)并正确配置连接至此数据库的数据源。关于如何配置WebSphere Application Server数据源,请参考在WebSphere Application Server在线帮助中的主题"创建和配置 JDBC 提供者和数据源"。

字串9

如果当前没有可用的Scheduler服务,可用的Scheduler列表为空。 点击"新建"按钮,出现新建Scheduler服务页面。在"名称"域中输入欲创建的Scheduler服务的名称"HelloWorldSchedule";在JNDI名称域中输入该Scheduler的JNDI名称"sample/HelloWorldSchedule",在后面测试Scheduler的示例代码中应用程序将使用此JNDI名称查询该Scheduler服务;在"数据源JNDI名称"及"数据源别名"下拉列表中选择已正确配置的数据源的JNDI名称与别名;在"表前缀"域中输入DB2中的表前缀名称;选择"DefaultWorkManager"作为工作管理器,接受其它缺省值,点击"应用"。

字串2


图 4 3创建Scheduler服务

字串6


新创建的Scheduler服务将出现在可用的Scheduler服务列表中。如下图所示:

字串4


图 4 4新建Scheduler服务列表

字串2


选中"HelloWorldSchedule",点击"创建表",存储Scheduler的相关表将在数据库中被创建。创建完成后,点击"验证表",系统将验证相关数据表是否创建成功,并返回验证结果,如下图所示:

字串7


图 4 5创建、验证表 字串6


至此,我们已在管理控制台中创建并配置了一个名为"HelloWorldSchedule"的Scheduler服务。该配置工作将在重启服务器后生效,服务器重新启动后,控制台输出信息如下: 字串9


图 4 6启动Scheduler服务

字串2

5. 测试任务 字串8

在本节中我们将创建一个名为"TestClient"的Servlet以测试"HelloWorldSchedule"任务。 字串3

右键点击"动态Web项目",选择"新建"->"动态Web项目":

字串5


图 5 1新建Web项目

字串9


在项目名称域中输入"ScheduleWAR",点击"高级"按钮,在EAR项目中输入"ScheduleEAR",接受其它缺省选项,点击"完成",如下图所示:

字串8


图 5 2创建Web项目 字串7


右键点击"servlet",选择"新建"->"servlet",如下图所示:

字串5


图 5 3新建servlet 字串9


在名称中输入"TestClient",点击"下一步": 字串3


图 5 4创建Servlet(1)

字串5


输入Java包名"ibm.sample.schedule",点击"完成": 字串2


图 5 5创建Servlet(2)

字串3


TestClient被成功创建后,项目资源管理器如下图所示: 字串6


图 5 6创建的Servlet

字串9


双击打开"TestClient.java"文件,在"doGet"方法中输入以下代码:

字串9

字串2

InitialContext context;
try{
System.out.println("test servlet initializing....");
//begin to test schedule
//1. init context
context=new InitialContext();
//2. lookup schedule using its jndi name
Scheduler scheduler=(Scheduler)context.lookup("sample/HelloWorldSchedule");
//3. create class BeanTaskInfo
BeanTaskInfo taskInfo=(BeanTaskInfo)scheduler.createTaskInfo(BeanTaskInfo.class);
//4. lookup sessoin bean using its jndi name
Object obj=context.lookup("ejb/com/ibm/websphere/scheduler/TaskHandlerHome");
//5. Narrow session bean
TaskHandlerHome home=(TaskHandlerHome)PortableRemoteObject.narrow(obj, TaskHandlerHome.class);
//6. add the schedule implementation into taskinfo class
taskInfo.setTaskHandler(home);
//7. set UserCalendar for task

字串1


Calendar now=Calendar.getInstance();
taskInfo.setStartTimeInterval("0 51 21 "+now.get(Calendar.DAY_OF_MONTH)+" FEB ?");
taskInfo.setRepeatInterval("0 * * "+now.get(Calendar.DAY_OF_MONTH)+" FEB ?");
taskInfo.setNumberOfRepeats(3);
taskInfo.setUserCalendar("com/ibm/websphere/scheduler/calendar/DefaultUserCalendarHome", "CRON");
//8. submit the task to scheduler
TaskStatus ts=scheduler.create(taskInfo);
System.out.println("user calendar is: "+taskInfo.getUserCalendarSpecifier());
System.out.println("test servlet end.");
//9. cancle the task and purged immediatelly
//scheduler.cancel(ts.getTaskId(),true);
arg1.getWriter().println("The schedule job has been created successfully!");
}
catch(Exception e){
e.printStackTrace();
}

字串1


字串8


在以上代码中我们执行了以下操作: 字串7

1. 使用之前创建的Scheduler服务JNDI名称"sample/HelloWorldSchedule"查询该Scheduler。

字串3

2. 调用createTaskInfo()方法生成一个TaskInfo接口的实例。创建 TaskInfo 对象并不会将任务添加到持久存储中。它将为必要的数据创建一个占位符。直到调用调度程序中的 create() 方法,才会将任务添加到持久存储中。

字串2

3. 根据JNDI名称查询包含任务逻辑的会话Bean。请注意,此处应使用TaskHandlerHome对象的JNDI名称进行查询。 字串1

4. 调用setTaskHandler()方法指定哪些会话Bean将被Schedule调用。

字串2

5. 设定任务被调度的日历类型、开始时间、重复时间以及重复次数。本例中我们使用CRON类型的缺省日历,指定任务在2006年二月当天的21点51分开始运行,并以1分钟运行一次的频率重复运行3次。 字串9

6. 调用create()方法将任务提交给调度程序。当 create() 方法调用完毕时,任务将保存在持久存储中并根据 TaskInfo 对象中指定的时间运行。Create()方法返回一个TaskStatus对象,该对象是反映当前任务状态的一个快照。 字串7

7. 根据需要,可调用Schedule.cancel()方法取消某一任务以及是否立即将该任务从持久存储中删除。 字串6

8. 输出成功提交任务信息到servlet返回页面。

字串2

完成测试servlet的编码工作后我们即可在WebSphere Application Server v6.0服务器中测试"HelloWorldSchedule"任务。 字串8

在启动服务器之前需添加ScheduleEAR项目。右键点击"WebSphere Application Server V6.0",点击"添加除去项目",如下图所示:

字串6


图 5 7添加项目(1) 字串5


在左侧可用的项目中选择"ScheduleEAR",单击"添加",选中的项目将出现在右侧已配置的项目列表中,单击"完成",如下图所示: 字串8


图 5 8添加项目(2) 字串5


单击服务器启动按钮,待服务器成功启动后,右键单击"TestClient",选择"运行"->"在服务器上运行",如下图所示: 字串7


图 5 9运行TestClient 字串8


在服务器选择列表中WebSphere Application Server V6.0后,得到如下图所示的运行结果:

字串9


图 5 10任务运行结果

字串7


如以上运行结果所示,TestClient返回了任务被成功提交的信息并且在控制台中输入了为该任务设定的日历类型。到达设定的任务运行时间即2006年二月当天的21点51分后,"HelloWorldSchedule"任务被调度程序执行并在控制台中输入文本信息以及系统当前时间。随后,改任务以每隔一分钟的频率又向控制台两次输出信息,这是由于该任务被设定为以每隔一分钟运行一次的频率重复运行三次。 字串2

至此,我们已向控制台输出"Hello
World"信息之一任务为例,说明了在RAD中如何开发、创建、配置并最终测试这一Schedule任务。

字串2

6. 总结

字串4

Scheduler可为J2EE应用程序提供高性能的、具有高可靠性的计时服务功能,它可对被托管的任务进行持久存储并提供事务管理。Scheduler服务通常被广泛用于调度、管理与时间相关的任务或活动,这些任务可调用会话Bean或发送JMS消息,而对Scheduler的管理可通过Java API或JMX实现。 字串7

参考资料

字串1

WebSphere Application Server V6.0在线帮助 字串8


WebSphere Application Server Enterprise Version 5 and Programming Model Extensions

字串9


WebSphere Enterprise Scheduler 规划和管理指南

字串7

字串7


Tags:
责任编辑:
您的评论
用户名: 新注册) 密码: 匿名评论 [所有评论]

·用户发表意见仅代表其个人意见,并且承担一切因发表内容引起的纠纷和责任
·本站管理人员有权在不通知用户的情况下删除不符合规定的评论信息或留做证据
·请客观的评价您所看到的资讯,提倡就事论事,杜绝漫骂和人身攻击等不文明行为