logic Server,考虑对队列使用分布式目的地,因为这可以把队列分布到多台服务器上。在这种情况下,应该集群化servlet本身,并对其进行协调,以避免创建重复的工作请求单元。 还应该考虑本文结尾处的参考资料。此外,对其他服务器也适用的考虑事项是把客户端部分交付给各台计算机的方式。一种方式是自愿,即每台计算机的所有者都下载一个可以在客户端计算机上配置和运行的安装程序。另一种方式是使用商业软件分发包,它可以自动下载客户端的最新版本,并把它安装在客户端计算机上。 使用Weblogic Integration工作流来分发工作 前面给出了一种把工作单元分发给客户端的直观方法,即使用servlet和消息驱动bean。尽管该方法实现起来相当容易,但是它不能解决的问题还很多,比如如何以自支持的方式启动过程,定时把请求交付给请求队列。当然,我们不希望让管理员编写一个shell脚本来不停地调用该servlet。此外,还应该以一种应用程序可以预先控制的方式限制所使用的请求数量。考虑到这一点,下面给出一个更加复杂的例子,用于把工作单元分发给远程JMS客户端并对其做出响应,从而利用未充分使用的计算机。
上一页 [1] [2] [3] 下一页
该方法使用了两个在BEA WebLogic Workshop中开发的WebLogic Integration (WLI)工作流,即Java流程定义(Java Process Definition,JPD)文件,它是BPEL/J (Business Process Engineering Language for Java)的前身。BPEL/J是在JSR 207中定义的。第一个工作流响应某些Web服务请求而启动,并执行初始化以通过一个JMS控件订阅JMS请求队列。该工作流使用一个Timer控件不停地进行循环,并定时唤醒一个while循环,从而在请求队列上放置更多的工作单元。该工作流还将使用一个定制Java控件(在本文相关代码中给出)来浏览请求队列,以便决定是否需要在队列上放置更多请求来防止队列出现过载。最后,工作流还将等待来自Web服务的停止消息,然后停止处理。第二个工作流执行的任务与前面例子中的消息驱动bean相同,因为它将对响应队列中的消息做出响应,以便从出队的响应队列调用print()和store()方法。这是一个生存期很短的工作流,而Weblogic Integration将按照要求产生足够的实例。 浏览JMS队列 WebLogic Integration被用作一种为远程流程构造和汇编服务的机制。有现成的组件程序集,即Java控件,它使得开发人员可以轻松地构建复合应用程序而不需要进行大量的开发。尽管Weblogic Integration提供了开箱即用的JMS控件,用于在使用JMS时抽象化内部细节,在某些情况下,由于要细粒度地访问底层方法,最好还是创建一个可重用的定制控件。在这个示例框架中,我需要浏览工作请求队列,以统计在队列中等待的工作项的数量,然后决定能否在队列中放入更多工作项,而不会引起队列过载。为此,我们编写了一个定制Java控件,JMSBrowse,它有一个这样的方法:public interface JMSBrowse extends Control { int numberOfElementsInQueue(String qFactory, String qName); }
这个控件的实现使用了JMS QueueBrowser类来查看一个带有给定的JMS连接工厂的给定JMS队列。它返回队列中等待处理的实例个数。本文所附的代码中提供了完整实现。 启动和停止工作流的Web服务 为了启动和停止负责把工作单元分发给请求队列的Weblogic Integration流程,我们创建了一个Java Web Service (JWS),它服从JSR 181,带有两个方法。public classControlWebService implements com.bea.jws.WebService { /** * @common:control */ private Controls.JMSStopControlMessage JMSStopControl; /** * @common:control */ private Controls.JMSControlMessage JMSControl; static final long serialVersionUID = 1L; /** * @common:operation */ public void startFlow() { JMSControl.subscribe(); JMSControl.sendTextMessage("start"); JMSControl.unsubscribe(); } /** * @common:operation */ public void stopFlow() { JMSStopControl.subscribe(); JMSStopControl.sendTextMessage("stop"); JMSStopControl.unsubscribe(); } }
该Web服务不是直接调用工作流,而是把一条消息放在JMS队列中,然后调用Worker.Message把消息发送给分发JPD。这解除了Web服务实现与工作流之间的耦合,以保持其模块性。在WebLogic Integration中,有一个概念叫做事件生成器,可以使用Weblogic Integration Administration Console对它进行配置您可以把事件生成器配置为从JMS Worker.Message中取出消息,然后将其交付给一个Message Broker通道(逻辑概念) 上一页 [1] [2] [3] [4] [5] 下一页
|