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