使用异步Bean提高Web服务性能

日期: 2008-04-28 作者:Shailesh K. Mishra 来源:TechTarget中国

  想要提高Web服务的性能吗?试试异步 Bean。本文将说明Web服务如何访问来自各种资源的内容,以按顺序执行业务操作,还将说明异步Bean将如何对其进行促进。

  
  引言

  异步 Bean 是 IBM? WebSphere? Application Server V6.0 的一个特色。WebSphere Application Server 提供了一组 API,允许 Java? 2 Platform Enterprise Edition (J2EE) 应用程序并行执行任务。异步 Bean 是可以由 J2EE 应用程序以异步方式执行的 Java 对象或 Enterprise JavaBeans (EJB) 组件。Bean 使用其创建者的 J2EE 上下文异步运行。异步 Bean 的类型包括:

  Work 是实现 com.ibm.websphere.asynchbeans.Work 接口的对象。它使用 WorkManager.startWork 方法与其调用者并行执行。
  AlarmListener 是实现 com.ibm.websphere.asynchbeans.AlarmListener 接口的对象。当高速临时警报过期时将调用此对象。
  EventListener 是能够实现任何接口的对象。这是用于单个 Java 虚拟机(Java virtual machine,JVM)内的异步事件的轻量级异步通知机制。其设想的主要用途是作为单个 EAR 文件中的 J2EE 组件,指示彼此间的各种应用程序异步事件。

  您可以通过异步 Bean 编程指南 (Asynchronous operations and Web services) 和本文最后的参考资料部分提供的其他参考资料了解有关异步 Bean 的更多信息。

  接下来我们将讨论可以如何在 Web 服务中使用异步 Bean。

  在 Web 服务中使用异步 Bean

  注意:有关如何编写 Java Web 服务的信息,请参考 IBM 红皮书“WebSphere Version 6 Web Services Handbook Development and Deployment”。

  假定我们需要一个 Web 服务,此服务要从两个不同的资源获取数据来执行其业务逻辑。此时可以使用 Work 对象(异步 Bean 的一种风格)来包装这两个任务(从资源检索数据)。现在可以并行执行这两个任务了。为了进行演示,让我们以追加两个文本文件的内容并将其返回的 Web 服务为例。清单 1 和 清单 2 中的代码示例说明了如何使用 Java Bean 来创建此 Web 服务。

  清单 1 用于创建 Web 服务的 Java Bean
               
  package com.demo.asynbean.ws;
  import java.util.ArrayList;
  import javax.naming.InitialContext;
  import javax.naming.NamingException;

  import com.ibm.websphere.asynchbeans.WorkException;
  import com.ibm.websphere.asynchbeans.WorkItem;
  import com.ibm.websphere.asynchbeans.WorkManager;

  /**
   * Created on Jul 9, 2007
   *
   * @author Shailesh K Mishra (shailekm@in.ibm.com)
   * 
   */
  public class WSAsyncBean {
 WorkManager workManager = null;

 /**
  * 
  */
 public WSAsyncBean() {
  super();
  // TODO Auto-generated constructor stub
 }

 public String getContent() {
  String str = “”;
  //get the WorkManager instance first.
  if (workManager == null)
   getWorkManager();

          try {
         WorkItem item = workManager.startWork(new FetchFileContentTask(“1.txt”));
         WorkItem item1 = workManager.startWork(new FetchFileContentTask(“2.txt”));

      //Create an ArrayList
    ArrayList items = new ArrayList();
     //Add the previous WorkItems to ArrayList
    items.add(item);
    items.add(item1);
     //Join them using WorkManager workManager
       workManager.join(items, WorkManager.JOIN_AND,(int) WorkManager.INDEFINITE);

       FetchFileContentTask task1 = (FetchFileContentTask) item.getResult();
       FetchFileContentTask task2 = (FetchFileContentTask) item1.getResult();

       String contentFromFile1 = task1.getContent();
       String contentFromFile2 = task2.getContent();
       str = contentFromFile1 + contentFromFile2;
   
   } catch (WorkException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   } catch (IllegalArgumentException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }

  return str;
 }

 /**
  * 
  */
 private void getWorkManager() {
  try {
       InitialContext ic = new InitialContext();
       workManager = (WorkManager) ic.lookup(“java:comp/env/wm/myWorkManager”);
      
      } catch (NamingException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
      }

  }
}
  
  清单 2 实现 Work 接口的 Java 类
               
  package com.demo.asynbean.ws;
  import java.io.BufferedReader;
  import java.io.IOException;
  import java.io.InputStream;
  import java.io.InputStreamReader;
  import java.net.MalformedURLException;
  import java.net.URL;

  import com.ibm.websphere.asynchbeans.Work;

  /**
   * Created on Jul 7, 2007
   * @author Shailesh K Mishra (shailekm@in.ibm.com)
   * 
   */
  public class FetchFileContentTask implements Work {
 
 String fileName = “”;
 String content =””;
 public FetchFileContentTask(String filename) {
  super();
                this.fileName = filename;
 }

  /*
   * (non-Javadoc)
  * @see javax.resource.spi.work.Work#release()
   */
 public void release() {}
  /*
   * (non-Javadoc)
   * @see java.lang.Runnable#run()
   */
  public void run() {
  
     StringBuffer buffer = new StringBuffer();
  // read the text file present in root directory.
  try {
  /*
   * read the given file name in this application’s root   dir(for demo).
   * You can perform any task here, e.g.
   * fetching data from DB, invoking some other app, web   service, etc.
    */
  URL url = new URL  (“http://localhost:9080/WSAsynBeans/”+fileName);
  InputStream in = url.openConnection().getInputStream();
  BufferedReader br = new BufferedReader(new   InputStreamReader(in));  
  String line=br.readLine();
  while (line != null) {
       try {
                     buffer.append(line);
       line=br.readLine();
          
           }catch (IOException ioe) {
              ioe.printStackTrace();
              break;
    }
         }
    
    content = new String(buffer);
   
    } catch (NamingException e) {
  e.printStackTrace();
    } catch (IOException e) {
  e.printStackTrace();
    }
   
   
}
 /**
  * @return Returns the name.
  */
 public String getContent() {
  return content;
 }
}

  在清单 1 中,Bean 类通过调用 getWorkManager 方法获取对缺省 WorkManager 的引用。然后将通过调用 WorkManager 的 startWork 方法启动从两个源文件获取内容的任务(包装在 FetchFileContentTask 类中)。FetchFileContentTask 类实现 Work 接口,其提供了要实现的两个方法,即 run 和 release。清单 2 显示了 FetchFileContentTask 类的代码。成功以并行方式执行了这两个任务后,将从这些任务检索文件内容,并进行追加。最后,Web 服务返回所追加的字符串。

  结束语
 
  在本文中,您了解了如何在 Web 服务中使用异步 Bean 来提高性能。使用异步 Bean 的好处在于,它支持 Web 服务以并行线程的方式执行任务,而且这些线程都在与创建者相同的上下文中运行。

  关于作者

  Shailesh K. Mishra是位于印度古尔加翁的 IBM Software Lab 的一位软件工程师。他目前正在参与“BizPortlets”项目的相关工作,他主要感兴趣的领域是业务集成。

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国