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

http://hi.baidu.com/kvbypuobiqbgipd/item/0b8fb859f7056213aaf6d703

 

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

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

1. 前言

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






2. Scheduler简介

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

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

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

一般而言,具备以下特性的任务可考虑将其托管给Scheduler服务进行管理与调度:

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

2.1. 调度程序

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

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

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

2.2. Scheduler 任务实现

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

  • 调用会话Bean的任务
  • 发送java消息的服务

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

2.3. Scheduler服务相关接口说明

2.3.1. Scheduler接口

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

2.3.2. TaskInfo接口

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

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

BeanTaskInfo :调用无状态会话 bean。

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

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

2.3.3. TaskHandler接口

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


com.ibm.websphere.scheduler.TaskHandlerHomecom.ibm.websphere.scheduler.TaskHandler

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

2.3.4. UserCanlendar接口

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


com.ibm.websphere.scheduler.UserCalendarHomecom.ibm.websphere.scheduler.UserCalendar

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

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

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


setStartTimeInterval setStartByInterval setRepeatInterval

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

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

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

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

秒 分 小时 日 月 星期

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

0 23 10 19 FEB ?

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

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

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

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

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






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

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

Rational Application Developer 6.0

DB2 Universal v8.0 或以上版本

Rational Application Developer 6.0

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

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


图 3 1 选择RAD工作空间
图 3 1 选择RAD工作空间

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


图 3 2 新建EJB项目
图 3 2 新建EJB项目

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


图 3 3 项目资源管理器
图 3 3 项目资源管理器

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


图 3 4 新建会话Bean
图 3 4 新建会话Bean

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


图 3 5 输入会话Bean名称
图 3 5 输入会话Bean名称

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

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


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

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


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

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

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

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


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

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






4. 创建与配置Scheduler服务

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

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


图 4 1运行管理控制台
图 4 1运行管理控制台

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


图 4 2浏览当前Scheduler服务
图 4 2浏览当前Scheduler服务

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

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


图 4 3创建Scheduler服务
图 4 3创建Scheduler服务

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


图 4 4新建Scheduler服务列表
图 4 4新建Scheduler服务列表

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


图 4 5创建、验证表
图 4 5创建,验证表

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


图 4 6启动Scheduler服务
图 4 6启动Scheduler服务



回页首

5. 测试任务

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

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


图 5 1新建Web项目
图 5 1新建Web项目

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


图 5 2创建Web项目
图 5 2创建Web项目

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


图 5 3新建servlet
图 5 3新建servlet

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


图 5 4创建Servlet(1)
图 5 4创建Servlet(1)

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


图 5 5创建Servlet(2)
图 5 5创建Servlet(2)

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


图 5 6创建的Servlet
图 5 6创建的Servlet

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


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 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. 使用之前创建的Scheduler服务JNDI名称"sample/HelloWorldSchedule"查询该Scheduler。

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

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

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

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

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

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

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

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

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


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

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


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

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


图 5 9运行TestClient
图 5 9运行TestClient

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


图 5 10任务运行结果
图 5 10任务运行结果

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

至此,我们已向控制台输出"Hello

World"信息之一任务为例,说明了在RAD中如何开发、创建、配置并最终测试这一Schedule任务。






6. 总结

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值