异步 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。
注意:有关如何编写 Java Web 服务的信息,请参考 IBM 红皮书“WebSphere Version 6 Web Services Handbook Development and Deployment”。
假定我们需要一个 Web 服务,此服务要从两个不同的资源获取数据来执行其业务逻辑。此时可以使用 Work 对象(异步 Bean 的一种风格)来包装这两个任务(从资源检索数据)。现在可以并行执行这两个任务了。为了进行演示,让我们以追加两个文本文件的内容并将其返回的 Web 服务为例。清单 1 和 清单 2 中的代码示例说明了如何使用 Java Bean 来创建此 Web 服务。
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();
}
}
}
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 服务以并行线程的方式执行任务,而且这些线程都在与创建者相同的上下文中运行。
学习
- 您可以参阅本文在 developerWorks 全球站点上的 英文原文 。
- 通过 Asynchronous beans programming guide 了解更多信息。
- 阅读“The wise work manager for context-based scoping”。
- 阅读“使用 WebSphere Application Server 开发高性能 J2EE 线程”(developerWorks,2006 年 9 月)。
- IBM 红皮书:WebSphere Version 6 Web Services Handbook Development and Deployment
- IBM developerWorks SOA and Web services 专区提供了大量的文章,以及关于如何开发 Web 服务应用程序的初级、中级和高级教程。
- IBM SOA 网站 提供 SOA 的概述,并介绍 IBM 是如何帮助您实现 SOA 的。
- 了解关于 developerWorks 技术事件和网络广播的最新消息。请特别关注以下 SOA 和 Web 服务技术讲座:
- Get started on SOA with WebSphere's proven, flexible entry points
- Building SOA solutions and managing the service lifecycle
- SCA/SDO: To drive the next generation of SOA
- SOA reuse and connectivity
- 访问 Safari 书店,浏览有关这些技术主题以及其他方面的书籍。
- 查看 Web services on demand demo。
- 获取此系列的 RSS Feed。(了解关于 RSS 的更多信息。)
本文介绍如何在Web服务中使用IBM WebSphere Application Server V6.0的异步Bean特性来提高性能。通过示例展示了如何利用Work对象并行执行任务,如从不同资源获取数据。
1277

被折叠的 条评论
为什么被折叠?



