利用 WebSphere Application Server 构建聚合 Web 服务

电信与万维网的聚合是众多有趣的新型应用程序开发背后主要的推动力。IETF 开发的 SIP 等协议以及 JSR 289 等全新编程模型已经模糊了这两个在传统意义上彼此隔离的世界之间的界限,这使应用程序能够同步控制这两个世界之间的信号。本文提供了一个样例应用程序,演示了如何利用 IBM WebSphere® Application Server 开发聚合 Web 服务。 本文来自于 IBM WebSphere Developer Technical Journal 中文版

Brian Pulito, WebSphere 架构师 - SIP, IBM

作者照片Brian Pulito 的 IBM 职业生涯最初是从 Lotus 团队开始的,当时他从事 Sametime 产品方面的工作,专攻实时协作领域。为了促进 Sametime对标准协议的使用,他开始使用 SIP 协议,这最终以 JSR 289 SIP Servlet Container 的形式融入了 WebSphere。Brian 领导着 JSR 289 容器/代理以及 Communications Enable Application Feature Pack 的开发工作,Communications Enable Application Feature Pack 为希望将通信集成于其 Web 应用程序之中的开发人员提供了一种简化的编程模型。



Dustin Amrhein, 技术推广专家, IBM

作者照片Dustin Amrhein 刚加入到 IBM 时是一名 WebSphere Application Server 开发团队的成员。在担任此职位期间,Dustin 从事 Web 服务基础设施以及 Web 服务编程模型的开发。此外,Dustin 负责 Java RESTful 服务框架开发的技术工作。Dustin 目前担任的角色是 IBM 的 WebSphere 产品组合中的新兴技术的推广者。他目前主要关注交付云计算功能的 WebSphere 技术,包括 WebSphere CloudBurst Appliance。



2011 年 6 月 23 日

简介

SIP 与 HTTP 的聚合促进了所有类型的新功能的开发,包括包含丰富通信特性的 Web 和移动应用程序,例如点击通话、状态监视和第三方呼叫控制。这也对多种不同的行业产生了影响,支持开发各种各样的新特性和服务(图 1)。

图 1. 聚合应用程序的新通信特性
图 1. 聚合应用程序的新通信特性

最新的 SIP servlet 规范 JSR 289 在标准化开发真正聚合式 SIP/HTTP Web 应用程序所需的编程模型方面取得了长足的进展。IBM WebSphere Application Server 最初以 Communications Enabled Applications (CEA) 的 Feature Pack 的形式发布了遵从 JSR 289 的 SIP 容器。

除了开发聚合应用程序之外,JSR 289 编程模型还支持开发聚合 Web 服务。基于 WSDL 的接口提供了通过 HTTP 上的 SOAP 访问聚合 Web 服务的能力,SIP 则用于后端。

这篇文章详述了如何构建聚合 Web 服务。具体来说,本文给出的聚合 Web 服务样例提供了一个接口,用于在状态实体上进行订阅,并在与状态实体相关的属性发生变化时接收通知。在后端,样例应用程序将 Web 服务请求转换为发送给 SIP 状态服务器的 SIP 订阅。

本文给出的聚合 Web 服务展示了聚合 WebSphere Application Server 容器的多种功能,其中包括:

  • 将一项 Web 服务请求转换为 SIP 订阅。
  • 通过 Web 服务建立 SIP 应用程序会话关联。
  • 开发接收异步通知所需的双向 Web 服务。
  • 编写一个基于会话的 Web 服务,以便支持故障转移和冗余。

样例应用程序

本文讨论的样例应用程序提供了一个状态订阅 Web 服务接口,它与一个转发订阅并处理进出 SIP 状态服务器的通知的 SIP 用户代理聚合。图 2 将帮助您演示。

图 2. 聚合应用程序环境
图 2. 聚合应用程序环境

图 3 所示的序列图展示了样例应用程序中实现的完整消息流。

图 3. 应用程序消息流
图 3. 应用程序消息流

(请注意,这仅仅是实现聚合状态监视器的一种可行方法。您可以决定消除对 sendNotification 的需求,在 NOTIFICATION 消息传入状态服务器时,直接由状态监视器发送 WS-notify 消息。)


构建 Web 服务

这一节介绍了如何构建您的聚合应用程序中需要的 Web 服务。对于这个应用程序,您将构建两个 Web 服务端点和两个 Web 服务客户端。您将为 Web 服务端点和客户端使用 JAX-WS(面向 XML Web 服务的 Java™ API)编程模型。

构建聚合的服务端点

为了节约空间,本文展示的所有清单中均仅显示了相关代码部分。然而,本文的 下载 部分提供了样例应用程序的完整代码。

  1. 第一个 Web 服务端点将作为聚合服务的一部分,并与 SIP 服务基础架构交互。它将提供方法来公开与 SIP 基础架构的消息交互,这些方法包括 subscribe、unsubscribe 和 sendNotifications。您将利用自下而上的方法来构建这个 JAX-WS Web 服务端点,这也就是说,首先您只需编写 Web 服务实现类的代码。清单 1 展示了 PresenceMonitor Web 服务实现类的类定义和相关方法定义。

    清单 1. Web 服务实现
    public class PresenceMonitor {	
    
    	public String subscribe(String presentity, String presenceServerAddress, 
    		String callbackEndpoint) {
    		...
    	}
    	
    	public String unsubscribe() {
    		...
    	}
    	
    	public String sendNotifications() {
    		...
    	}
  2. 接下来,您需要注释该类,以便将其表示为一个 JAX-WS Web 服务实现。清单 2 展示了 PresenceMonitor 类所需的注释。
    清单 2. 带有注释的 Web 服务实现
    @WebService(name="PresenceMonitor", portName="PresenceMonitorPort")
    public class PresenceMonitor {
    
    	@Resource 
    	private WebServiceContext wscontext;
    
    	@WebMethod(operationName="subscribe", action="doSubscribe")
    	public String subscribe(String presentity, String presenceServerAddress, 
    		String callbackEndpoint) {
    		...
    	}
    	
    	@WebMethod(operationName="unsubscribe", action="doUnsubscribe")
    	public String unsubscribe() {
    		...
    	}
    	
    	@WebMethod(operationName="sendNotifications", action="sendNotifications")
    	public String sendNotifications() {
    		...
    	}

    首先,您使用 @WebService 注释表明该类是一个 Web 服务实现。在 @WebService 注释中,您提供了希望指派给该 Web 服务的名称和端口名称。接下来,您使用 @WebMethod 注释,注释了希望在 Web 服务上公开的各方法。在各 @WebMethod 注释中,您提供了一个 operationName 以及一个活动名称。您不必定义 @WebService 或 @WebMethod 注释的任何属性,因为可以使用默认值。最后,您为 javax.xml.ws.WebServiceContext 类型的私有实例变量使用了 @Resource 注释,完成了类的注释。上述操作的结果是在 PresenceMonitor 类实例化时,自动注入一个 WebServiceContext 实例。稍后,您将看到,这使您能够在我们的 PresenceMonitor 实现中检索 HTTP 和 SIP 会话信息。

  3. 有了注释之后,即可利用 WebSphere Application Server 中的实用工具,生成所需的 JAXB(Java Architecture for XML Binding)工件。运行时将利用这些类来打乱和封送发往 PresenceMonitor Web 服务的请求以及该 Web 服务提供的响应。

    为了生成这些工件,您要使用 WebSphere Application Server 安装的 WAS_HOME/bin 目录下的 wsgen 工具。清单 3 展示了在 PresenceMonitor 实现上运行 wsgen 实用工具的情况。

    清单 3. 使用 wsgen 实用工具
    C:\was70dev\bin>wsgen.bat -cp c:\cea\sip\PresenceMonitorServerWAR\build\classes
    com.ibm.sample.presence.ws.PresenceMonitor -d .\wsserver -wsdl -keep

    首先,您要使用 -cp 参数为 wsgen 命令提供一个类路径。这个类路径中必须包含编译您在命令中指定的 com.ibm.sample.presence.ws.PresenceMonitor 实现类所需的所有类。-d 参数提供了分别用于写入资源(WSDL 和模式)和 Java 源文件。最后,–wsdl 参数通知 wsgen 实用工具生成 WSDL(Web 服务描述语言)文件,–keep 参数指导实用工具保留此条命令生成的所有 Java 源文件。–wsdl 和 –keep 这两个参数都是可选的,但此处利用这两个参数来演示 wsgen 实用工具的输出。图 4 展示了生成并保存在命令中指定的 wsserver 目录中的文件列表。

    图 4. 在 PresenceMonitor 上运行 wsgen 生成的文件
    图 4. 在 PresenceMonitor 上运行 wsgen 生成的文件
  4. 应用程序的一个 WAR(Web 存档)文件中的 com.ibm.sample.presence.ws.jaxws 程序包中包含 Java 类以及 PresenceMonitor 类。您使用服务器 WAR 的 PresenceMonitor 实现调用 WAR。此外,尽管 WebSphere Application Server 不需要为 JAX-WS Web 使用它,但您也可在 WAR 中打包 WSDL 和 XSD 文件。由于在 WAR 中包含了 WSDL,因此也可更新 PresenceMonitor 类的 @WebService 注释,以便包含 wsdlLocation 属性,如清单 4 所示。

    清单 4. PresenceMonitor 类中更新的 @WebService 注释
    @WebService(name="PresenceMonitor", portName="PresenceMonitorPort", 
    wsdlLocation=”WEB-INF/wsdl/PresenceMonitorService.wsdl”)
    public class PresenceMonitor {

    wsdlLocation 属性提供了 WSDL 文件相对于 WAR root 位置的相对位置。根据清单 4 中显示的值,您将运行 wsgen 实用工具,从而将 WSDL 文件放置在 WAR 文件的 WEB-INF/wsdl 目录中。

至此,您已经完成了 PresenceMonitor 的实现,接下来,您需要构建将允许您调用 PresenceMonitor 实现的方法的 Web 服务客户端。

构建 Web 服务客户端

为了为 PresenceMonitor 实现构建 Web 服务客户端,您将需要使用 WebSphere Application Server 安装中包含的另一个名为 wsimport 的实用工具。wsimport 实用工具使用 WSDL 文件生成 Web 服务客户端工件。您使用之前 wsgen 实用工具生成的 PresenceMonitorService.wsdl 文件。清单 5 展示了运行 wsimport 实用工具所需的命令。

清单 5. 运行 wsimport 实用工具
C:\was70dev\bin>wsimport.bat wsserver\PresenceMonitorService.wsdl -d wsclient –p 
com.ibm.sample.presence.jaxws.client –keep
  1. 运行 wsimport 实用工具并传入之前生成的 WSDL。-p 参数提供了所有生成的 Java 类需要使用的包名称。同样,-d 参数指定了将生成的工件放在什么位置,-keep 指导 wsimport 保存生成的全部源文件。图 5 展示了 wsclient 目录的列表。

    图 5. 在 PresenceMonitorService.wsdl 上运行 wsimport 生成的文件
    图 5. 在 PresenceMonitorService.wsdl 上运行 wsimport 生成的文件
  2. 将这些类以及客户端应用程序代码放置在独立 WAR 文件中,这将引用为客户端 WAR。您的客户端应用程序代码将利用这些类,将远程调用发送给 PresenceMonitor 实现类公开的 Web 方法。具体来说,您的客户端应用程序代码将分别利用客户端服务和端口类 —— com.ibm.sample.presence.jaxws.client.PresenceMonitorService 和 com.ibm.sample.presence.jaxws.client.PresenceMonitor,以便发送 Web 服务请求和接收 Web 服务响应。稍后,您将看到初始化这些请求的客户端应用程序代码。

构建了聚合 Web 服务实现和相应的 Web 服务客户端之后,您仅需要再构建一个 Web 服务实现。

构建侦听器端点

在 PresenceMonitor Web 服务端点实现中有一个 sendNotifications 方法。该方法包含将 SIP 事件通知发送到侦听 Web 服务端口的逻辑。从这个角度来看,您之前构建的 PresenceMonitor 实现不仅仅是一个端点,还是一个 Web 服务客户端。现在,您需要构建作为通知侦听器的 Web 服务端点。

  1. 将侦听器 Web 服务类命名为 PresenceListener。清单 6 展示了该类及其相关的 Web 服务注释。
    清单 6. PresenceListener web 服务实现
    @WebService(name="PresenceListener", 
    		serviceName="PresenceListenerService", 
    		portName="PresenceListenerPort", 
    	   targetNamespace="http://listener.ws.presence.sample.ibm.com/”)
    public class PresenceListener {
    	
    	@Resource
    	private WebServiceContext wsContext;
    	
    	@WebMethod
    	public void notify(Event event) {
    		…
    	}

    PresenceListener 实现公开了一个名为 notify 的方法,该方法接收事件 Java bean 的一个实例。这是一个由 PresenceMonitor 用于发送 SIP 事件通知的方法。我们将再次访问 notify 方法中的逻辑。正如对 PresenceMonitor 实现所做的那样,您对 PresenceListener 类运行 wsgen 实用工具,以便生成必要的 JAXB 工件。图 6 展示了在 PresenceListener 端点上运行 wsgen 实用工具所生成的结果文件。

    图 6. 在 PresenceListener 上运行 wsgen 生成的文件
    图 6. 在 PresenceListener 上运行 wsgen 生成的文件

    将 PresenceListener 实现类和清单 6 中所示的类放入客户端 WAR。

  2. 为了完成为应用程序构建 Web 服务资产的工作,您需要为 PresenceListener 端点实现生成一个 Web 服务客户端。正如之前所做的那样,只需在此前的 wsgen 命令生成的 WSDL 文件上运行 wsimport 实用工具即可。这也就意味着您对于 PresenceListenerService.wsdl 文件运行 wsimport 实用工具。图 7 展示了 wsimport 命令的结果。

    图 7. 在 PresenceListenerService.wsdl 上运行 wsimport 生成的文件
    图 7. 在 PresenceListenerService.wsdl 上运行 wsimport 生成的文件
  3. 将图 7 所示的文件放入服务器 WAR,使得 PresenceMonitor 能够作为您的 PresenceListener 实现的 Web 服务客户端。

现在,您已经具备了必要的 Web 服务端点和客户端资产。接下来即可整合其余应用程序。我们将观察必要的 SIP 功能以及客户端需要的逻辑。


聚合状态监视器服务器

创建了 Web 服务之后,即可继续构建构成状态监视器的其他类。图 8 所示的类图展示了构成状态监视器的所有主要类。

首先,如上所述,接收所有入站请求的 Web 服务类是 PresenceMonitor。在这里可以看到,PresenceMonitor 使用了一个名为 PresenceSession 的类。PresenceSession 是 Web 服务活动与 SIP 活动之间的聚合点。PresenceSession 对象与 SIP 应用程序会话 (SAS) 对象之间存在一对一的映射关系。实际上,PresenceSession 对象存储为 SAS 中的一个属性。本图也展示了处理所有入站 SIP 请求的 PresenceSipServlet,此外还使用了 PresenseSession 对象。

图 8. 样例应用程序类图
图 8. 样例应用程序类图

PresenceMonitor

如上文所述,PresenceMonitor 是处理 Web 服务请求的主要服务器类。PresenceMonitor 的一个重要方面在于它如何建立客户端会话,会话如何与 SIP 应用程序会话关联。清单 7(删除了日志)中的代码展示了如何从 Web 服务订阅中派生 SIP 应用程序会话。

清单 7. 在 PresenceMonitor 类中建立一个客户端会话
WebMethod(operationName="subscribe", action="doSubscribe")
public String subscribe(String presentity, 
String presenceServerAddress, 
String callbackEndpoint) {

	String msg = "";
	try {
		HttpServletRequest httpRequest = (HttpServletRequest)wscontext.
			getMessageContext().get(MessageContext.SERVLET_REQUEST);
	
		PresenceSession presenceSession;
			
		presenceSession = findExpectedPresenceSession(httpRequest);
			
		if (presenceSession != null)
		{
			msg = "Subscription already sent for this session";
		}
		else 
		{				
			HttpSession httpSession = httpRequest.getSession();
	    		SipApplicationSession appSession = ((javax.servlet.sip.
				ConvergedHttpSession)httpSession).getApplicationSession();
				
//	create the web service session to handle this traffic and save it as an 
//	attribute of the app session
			presenceSession = new PresenceSession(appSession, 
				callbackEndpoint);
appSession.setAttribute(PresenceSession.ATTRIBUTE_PRESENCE_SESSION, 
	presenceSession);
…

如上所述,在代码从 HttpServletRequest 中提取 SIP 应用程序时,Web 容器会自动将一个聚合 cookie 插入用于发送 SOAP 响应的 HTTP 响应。随后,Web 服务客户端可利用此 cookie 维护会话关联。完成此任务的过程如 状态监视器客户端 一节所述。

PresenceSession

PresenceSession 类将 SIP 状态通知转为出站 Web 服务通知。在样例应用程序接收到新订阅时,PresenceMonitor 会创建一个新的 PresenceSession 实例,并将其存储为 SIP 应用程序会话属性。PresenceSession 维护通过 Web 服务传递回客户端的 SIP 通知的队列。

PresenceSession 使用两个重要方法来提供 Web 服务与 SIP 之间的交互。Web 服务 sendNotifications 方法在与 Web 服务会话关联的 PresenceSession 上调用 getNotifyEvent。随后,getNotifyEvent 方法检查队列中的任何新 SIP 通知。如果存在一个新通知,PresenceSession 将调用相关 PresenceListener 的 notify 方法来交付通知。如果队列为空,则将一个 Boolean 值设置为 true,表示在下一次接收到通知时,应立即通过 notify 方法发送回相关的 PresenceListener。

只要 PresenceSipServlet 接收到一条新的 SIP 通知,servlet 就会从 SIP 应用程序会话中提取相关的 PresenceSession,并调用其 putNotifyEvent 方法。这将触发要添加到队列的通知,或者导致 PresenseSession 通过 Web 服务接口将此通知发送给客户端。

PresenceSession

PresenceSipServlet 主要用于从状态服务器接收到的通知。它也会处理从 SUBSCRIBES 发出的响应。样例应用程序利用 SIP 注释而非 sip.xml 部署描述符。

清单 8 展示了如何访问与状态服务器发送的通知关联的 PresenceSession:

清单 8. 访问与通知关联的 PresenceSession
@protected void doNotify(SipServletRequest req) throws ServletException,
		IOException {

	//	First, we access the PresenceSession object associated with this 
	//	notification. The PresenceSession is where notification event are 
	//	queued and picked up through the Web Service interface.
	SipApplicationSession appSession = req.getApplicationSession();
	PresenceSession presenceSession = (PresenceSession)appSession.getAttribute
		(PresenceSession.ATTRIBUTE_PRESENCE_SESSION);
	…

状态监视器客户端

状态监视器客户端会测试状态监视器服务器应用程序。它能将 HTTP 请求转为出站 Web 服务请求。还能处理状态监视服务器发出的入站 Web 服务通知。

状态监视器客户端非常简单。图 9 中的类图展示了其 Web 服务类以外的主要类。

图 9. 状态监视器客户端类图
图 9. 状态监视器客户端类图

TestServlet 处理入站 HTTP 请求,并使用 ClientController 的实例来做出 Web 服务请求。一个客户端 ID 将传入 HTTP 请求,以便映射现有会话,客户端 ID 与 ClientControllers 之间存在一对一的映射关系。PresenceListener 是一个 Web 服务服务器,可接收来自状态监视器服务器的通知(即存储在队列中的通知)。

清单 9 中来自 ClientController 的这段代码展示了初始订阅中 Web 服务端口的建立。此端口映射到传入 HTTP 订阅请求的查询字符串的客户端 ID。(见 测试环境 小节。)此处需要注意的事建立会话相关性的方法。将 SESSION_MAINTAIN_PROPERTY 置入与端口相关的请求上下文中可确保 HTTP SOAP 响应中返回的任何 cookie 都能在此端口发起的后续 HTTP SOAP 请求中使用。这能保证与状态监视器服务器中 SIP 应用程序会话的相关性。

清单 9. 确保 subscribe 方法中的相关性
public String subscribe(String presentity, 
String presenceServerAddress, 
				String callbackEndpoint) {
	String msg = "";
	try {
		if(port == null) {
			String wsdlURLStr = webServiceURL + "?wsdl";
			System.out.println("wsdlURLStr is " + wsdlURLStr);
			if(!wsdlURLStr.startsWith("http://")) {
				wsdlURLStr = "http://" + wsdlURLStr;
			}
			URL wsdlURL = new URL(wsdlURLStr);
			PresenceMonitorService svc = new 
PresenceMonitorService(wsdlURL);
			port = svc.getPresenceMonitorPort();
			BindingProvider bp = (BindingProvider) port;

bp.getRequestContext().put(
BindingProvider.SESSION_MAINTAIN_PROPERTY, Boolean.TRUE);
		}			
		msg = port.subscribe(	presentity,
				presenceServerAddress, callbackEndpoint);
	}
	catch(Exception e) {
		throw new RuntimeException(e);
	}
	if (logger.isLoggable(Level.FINEST)) {
		 logger.exiting(className, "subscribe", port);
	}
	return msg;
}

测试环境

测试环境需要单独一个运行 WebSphere Application Server V7 以及 CEA 特性包或 WebSphere Application Server V8.0 beta 2 或更高版本的应用服务器。此外还需要 sipp 的一个实例,这是一种开源工具,用于模拟 SIP 用户代理。在本例中,一个 sipp 脚本用于模拟 SIP 状态服务器。最后,您将需要一个浏览器来触发测试并验证结果。

将这些应用程序安装在相同应用服务器或两个不同的应用程序服务器中:

  • PresenceMonitorClientWAR.war:此应用程序包含一个测试 servlet,可将 HTTP 请求转为对 PresenceMonitorServer 的 Web 服务请求。换句话说,这是上文中的序列图中展示的 Web 服务客户端。
  • PresenseMonitorServerWAR.war:这是上文介绍的核心代码,一方面公开 Web 服务接口,另一方面公开 SIP 接口。

在安装之后启动应用程序和 sipp 客户端。这里包含了用于启动 sipp 客户端的批处理文件。

以下步骤介绍了如何在安装和运行后执行测试代码(本示例假设两个应用程序均在相同的应用服务器实例上运行。)

  1. 这个 URL 通过 HTTP 请求告知状态监视器客户端(PMC)通过与状态监视器服务器(PMS)的 Web 服务接口启动订阅,PMS 又会通过 SIP 创建一个对状态服务器的订阅:

    http://<appserverhost:port>/PMC/testservlet?action=subscribe&id=1&presenceServerAddress=<sipphost:port>&presentity=Brian&wsURL=http:// <appserverhost:port>/PMS/PresenceMonitorService

    appserverhost:port 将是为应用服务器配置的 WC_defaulthost 链。

    查询字符串中的参数告知客户端应用程序应该做些什么。下面介绍了各参数的具体信息:

    • Action:客户端 servlet 将执行的操作。选择包括 subscribe、sendNotifications、getNotifications 和 unsubscribe。
    • Id:客户端会话的 ID。可以轻松将客户端代码转为使用 cookie 访问 HTTP 会话。
    • presenceServerAddress:通过 Web 服务接口传递到状态监视器服务器,这指定了将 SIP 订阅发送到何处。在实际应用程序中,状态监视器服务器将为此提供相关的配置项。
    • Presentity:所订阅的状态实体字符串。sipp 脚本表明,状态服务器并不关注这个方面。
    • wsURL:客户端用于通过 Web 服务连接到状态监视器服务器的 URL。
  2. 接下来,此 URL 告知 PMC 通过向其发送 Web 服务请求来从 PMS 请求任何可用通知。通过第 1 个步骤,PMS 已经为状态服务器开放了一个订阅。
    http://<appserverhost:port>
    /PMC/testservlet?action=sendNotifications&id=1
    &presenceServerAddress=<sipphost:port>&
    presentity=Brian&wsURL=http://<appserverhost:port>
    /PMS/PresenceMonitorService
  3. 第二个 URL 检索 PMC 从 PMS 接收到的任何通知,并以 HTML 格式显示这些通知:
    http://<appserverhost:port>/PMC/
    testservlet?action=getNotifications&id=1&presenceServerAddress
    =<sipphost:port>&presentity=Brian&wsURL
    =http://<appserverhost:port>/PMS/PresenceMonitorService
  4. 最后这一个 URL 通过 HTTP 请求告知 PMC 取消订阅 PMS,这又会通过 SIP 向状态服务器发送一条 TTL 为 0 的订阅:
    http://<appserverhost:port>/PMC/
    testservlet?action=unsubscribe&id=1&presenceServerAddress
    =<sipphost:port>&presentity=Brian&wsURL=http://
    <appserverhost:port>/PMS/PresenceMonitorService

请注意,本文提供的示例代码并非用于生产用途。本文的目的在于仅提供解释文中概念所需的内容。因此未包含代码的某些重要方面,例如会话失效和故障转移支持等。


结束语

这篇文章介绍了如何使用 WebSphere Applicaton Server 构建一个聚合 Web 服务。本文给出的示例提供了一个接口,用于在状态实体上进行订阅,并在与状态实体相关的属性发生变化时接收通知。在后端,样例应用程序将 Web 服务请求转换为发送给 SIP 状态服务器的 SIP 订阅。本示例演示了聚合 WebSphere Application Server 容器的众多功能,应该是构建您自己的聚合应用程序的良好起点。


下载

描述名字大小
样例应用程序1105_pulito_sampleapp.zip106KB

参考资料

学习

获得产品和技术

讨论

条评论

developerWorks: 登录

标有星(*)号的字段是必填字段。


需要一个 IBM ID?
忘记 IBM ID?


忘记密码?
更改您的密码

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件

 


在您首次登录 developerWorks 时,会为您创建一份个人概要。您的个人概要中的信息(您的姓名、国家/地区,以及公司名称)是公开显示的,而且会随着您发布的任何内容一起显示,除非您选择隐藏您的公司名称。您可以随时更新您的 IBM 帐户。

所有提交的信息确保安全。

选择您的昵称



当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

标有星(*)号的字段是必填字段。

(昵称长度在 3 至 31 个字符之间)

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

 


所有提交的信息确保安全。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=WebSphere, Web development, SOA and web services
ArticleID=682046
ArticleTitle=利用 WebSphere Application Server 构建聚合 Web 服务
publish-date=06232011