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

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

  引言

  异步 BeanIBM? 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 服务以并行线程的方式执行任务,而且这些线程都在与创建者相同的上下文中运行。


转载于:https://www.cnblogs.com/Thomson-Blog/articles/1238662.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值