科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件用JMS客户端利用空闲的计算机资源

用JMS客户端利用空闲的计算机资源

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

可以把JMS客户端放置在这些未充分利用的计算机上,从而分担一些通常应由服务器执行的工作。该客户端可以监听某个要执行的工作单元的请求队列,然后在应答队列上做出响应。

作者:中国IT实验室 来源:中国IT实验室 2007年8月24日

关键字:

  • 评论
  • 分享微博
  • 分享邮件
这种方法以常规方式使用了JMS系统。在下面的内容中,我将引入一些代码,并考虑几个扩展问题。

  工作单元类
  JMS请求队列上的每个类都将实现一个UnitOfWork接口,该接口有一个特别有趣的方法,叫做doWork():

public interface UnitOfWork extends java.io.Serializable {
  // This method executes itself on the client machine
  public void doWork();
  // This method prints the current contents of performed work
  public void print();
  // This method stores the instance into a backing store
  public void store();
}

  在我们这个简洁而直观的例子中,我使用一个SimpleMatri类实现了UnitOfWork接口:

public class SimpleMatrix implements UnitOfWork {
 private Integer m1[][];
 private Integer m2[][];
 private Integer result[][];
 private Integer rows = new Integer(3);
 private Integer cols = new Integer(3);
 // May initialize m1 and m2 by locating records from a database
 public SimpleMatrix() {
 }
 // This method actually multiplies m1 x m2 and stores in result
 public void doWork() {
 }
 // This method stores result into a backing store
 public void store() {
 }
 // This method prints the current contents of result
 public void print() {
 }
}

  方法的实现相当简单,限于文章的篇幅,这里就不再进行说明。请参见所附的示例代码,其中给出了完整实现。这里的要点在于,这个SimpleMatrix实例被传递给一个JMS客户端,该客户端只要调用doWork()即可利用其CPU来执行工作。对于这个例子,我不会实际从数据库中检索矩阵或者把矩阵保存到数据库中,但是在实际应用中,这是必须完成的工作。

  Servlet工作创建程序
  可以使用一个servlet来创建这些UnitOfWork实例。尽管WebLogic Server启动类可以执行同样的功能,但出于管理的目的,从安全的Web浏览器发送消息给servlet要更加容易。(另一种可选的实现是使用Web服务。)如果在servlet上安置了安全性,通过身份验证的用户可以在查询字符串中传递命令,以便开始交付工作单元给JMS请求队列或停止交付。我将给出一个servlet的主干例子,以说明其中的一些有用方法。

public class WorkServlet extends HttpServlet {
 ...
 private QueueSender qsender;
 private ObjectMessage msg;
 private int numMessages = 5;
 ...
 // This places the unit of work on the request queue
 public synchronized boolean sendMessages(int numberOfMessages,
                                                 PrintWriter o) {
   for(int i=0; i
  JMS客户端类的任务仅仅是接受请求队列上的消息,调用对象上的doWork()方法在这台计算机上执行工作,然后把结果返回给应答队列,消息驱动bean从应答队列中获取结果,以便进行进一步的处理和保存。可以检查它是否是文本消息,然后告诉客户端停止处理,从而允许发送控件消息给客户端。当然,在实际应用中,消息可能包含客户端的名称,这样就不会造成所有的客户端都停止处理。
  使用UnitOfWork接口的优点在于,JMS客户端只要编写一次,就可以用于以后实现该接口的任何类。这使得JMS客户端具有很大的通用性,可以不加修改地应用到许多不同的场景中。只需把编译后的UnitOfWork接口以及它所有的实现类都包含在客户端的类路径中。
  在这个简化模型中,客户端需要等待消息到达以启动处理。在实际情况中,客户端的方法等待的条件可以是一天中的某个时刻,比如下午5点,或者是计算机的CPU负载低于某个阈值。需要把此类逻辑添加到客户端,使之与计算机的使用安排更加一致。
消息驱动bean接收程序
  消息驱动bean实例将监听应答队列,看看有没有已完成的工作对象单元。下面给出一个例子的主干部分:public class MessageWorkBean implements MessageDrivenBean,
                                            MessageListener {
  ...
  // This method will receive a unit of work object to store
 public void onMessage(Message msg) {
   ObjectMessage om = (ObjectMessage) msg;
   try {
     UnitOfWork unit = (UnitOfWork)om.getObject();
     unit.print();
     unit.store();
   }
   catch(JMSException ex) {
    log("Message Driven Bean: Could not retrieve Unit of Work.");
    ex.printStackTrace();
   }
 }
}

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章