跳转到主要内容

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

这是您第一次登陆到 developerWorks,已经自动为您创建了您的概要文件。 选择您概要文件中可以公开的信息的信息(如姓名、国家/地区,以及公司),这些信息同时也会与您所发布的内容相关联。 您可以随时更新您的 IBM 账号。

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

  • 关闭 [x]

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

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

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

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

  • 关闭 [x]

使用 WebSphere Studio 实现和访问有状态 Web 服务,第 5 部分

通知 Web 服务资源属性的变更

Hidayatullah Shaikh (hshaikh@us.ibm.com), 高级软件工程师, EMC
Hidayatullah H. Shaikh 是 IBM Software Group 的 On Demand Architecture and Development 开发组的一名高级软件工程师。他所感兴趣和专长的领域包括业务流程建模及集成、面向服务体系结构、网格计算、电子商务、J2EE 技术以及DBMS。您可以通过 hshaikh@us.ibm.com与他联系。
Lalitha Kamesam, 咨询软件工程师, EMC
Lalitha P. Kamesam 是 IBM Software Group 的 On Demand Architecture and Development 开发组的一名咨询软件工程师。她所感兴趣和专长的领域包括电子商务应用软件、DBMS 以及 Web 服务。您可以通过 lpk@us.ibm.com与她联系。
Mark Hunsinger (hunsinge@us.ibm.com), 管理人员,按需业务开发和孵化, EMC
Mark Hunsinger 是 IBM On Demand Architecture and Development 开发组的领头人。Mark 在编程和管理复杂的基于 Web 的开发项目上有着数年丰富的经验。在担任 Demand Architecture and Development 领头人期间,Mark 负责评估、优先级排序、以及最终开发孵化器(incubator),并验证其概念,以填补 IBM On Demand 产品组合方面的空白。您可以通过 hunsinge@us.ibm.com与 Mark 联系。

简介: Web 服务资源框架(The Web Services Resource Framework)(参见 参考资料)为使用 Web 服务访问状态树立了模型。Web 服务资源属性规范(参见 参考资料)定义了如何使用 Web 服务技术来查询以及修改与有状态资源相关联的数据。 本文将向您展示如何在 IBM® WebSphere® Application Server 运行环境中,使用 WebSphere Studio Application Developer V5.1.1 将 Web 服务资源中资源属性值的变化传送到已订阅服务的客户端上。

发布日期: 2004 年 9 月 01 日
级别: 初级
访问情况 : 668 次浏览
评论: 


引言

Web 服务资源框架(WS-Resource)定义了使用 Web 服务访问有状态资源的一系列规范。Web 服务在互操作过程中通常是不能维护状态信息的。然而其接口必须经常提供对状态的处理,这里的状态就是指,作为 Web 服务互操作结果而持续交叉和演变的数据值。在 Web 服务资源框架中,将状态建模,该模型包含有状态资源以及按照隐含的资源模式编写的 Web 服务之间的联系。

Web 服务资源属性规范定义了如何使用 Web 服务技术查询和修改与有状态资源相关的数据。这样客户端便可以使用标准方式来访问与 Web 服务资源相关的数据。Web 服务资源属性的声明展现了 Web 服务资源状态的投影或视图。Web 服务资源属性值的任何改变都将引发通知消息。通常用 Web 服务通知(WS-Notification)完成。Web 服务通知系列文档包括一份白皮书、“Web 服务的发布—订阅通知”以及三份标准化规范:Web 服务基本通知(WS-BaseNotification)、Web 服务代理通知(WS-BrokeredNotification)和 Web 服务主题(WS-Topics)(参阅 参考资料)。

本系列的该部分将会对 Calculator 范例进行修改,通过举例来论述以下内容:

  1. 在 WebSphere 中对 Web 服务通知的支持,可以使用 JMS 代替。
  2. 可以使用 JMS 代理为 Web 服务资源属性创建 topic。
  3. 客户端可以订阅 Web 服务资源的资源属性更改。
  4. Web 服务资源状态的变化将导致 Web 服务产生通知消息并传送到代理,随后传送到所有的已订阅服务的客户端上。

期望读者

您应该对 J2EE 技术、Web 服务、JMS 以及 WebSphere 应用服务器 V5.1(WebSphere Application Server V5.1)有基本的了解。为帮助您熟悉这些技术,请参阅文中 参考资料部分获取入门级资料。您同样可以在 IBM developerWorks 上参阅另外的相关资料,并请阅读该系列的前面四篇文章以熟悉 Web 服务资源框架的概念(参见 参考资料)。

范例代码的内容及需求

本文涉及的范例均由 WebSphere Studio Application Developer V5.1.1 版本(创建 ID 20031120-1915,以下简称 Application Developer)创建。用 WebSphere Application Server V5.1 内置的测试环境(Built-in Test Environment)以及 WebSphere Embedded Messaging(包含于 Application Developer V5.1.1)对这些范例都进行了单独的测试。要获取有关的下载信息,请参阅文中 参考资料部分。将范例中的 WSDL 设置为使用 Apache Axis 附带的 tcpmon 实用程序,以监控被交换的 SOAP 消息。将 tcpmon 实用程序配置为监听 81 端口( listenPort ),并将请求发送到本地主机的目标端口 9080( targetPort ),请参阅文中 参考资料部分以获取更多关于 tcpmon 的信息。

ws-statefulws5code.zip 文件包含本文附带的代码范例。单击文中顶部或底部的 Code图标可以下载该文件。该 zip 文件包含以下文件:

  • WASv5WSAExtensions.jar:包含 WebSphere Application Server V5.1 所需的实用程序类的 JAR 文件,可以创建并访问 SOAP 消息中 WS-Addressing 消息的信息头。操控 WS-Addressing 端口参考基准(EPRS)的助手类也包含在该文件中。可以对这些类进行配置,以在 WebSphere Studio 应用程序中使用。
  • WASvsWSAExtensions-javadoc.zip:实用程序类的 javadoc 。
  • CalculatorService.ear:有状态操作系统服务范例。
  • WASv5WSNTExtensions.jar:包含订户和发布方实用程序类的 JAR 文件。
  • CalculatorServiceClientJava.jar:包含客户端的 JAR 文件,以调用 Calculator Web 服务。

JMS 发布—订阅

JMS 定义了两种信息传递模式:点对点(P2P)和发布—订阅(pub-sub)。在 P2P 模式中,消息的生产者通过队列传送消息给特定的消息消费者,而发布—订阅模式则以一对多或多对多的方式进行消息的传播。本文使用的是发布—订阅模式,在发布—订阅模式中,消息传递客户端(生产者)通过名为主题的虚拟渠道传送消息给已订阅服务的消息传递客户端(消费者)。每个消费者将自动接收每条消息的副本,无需请求或对主题进行轮询以获得新消息。

消息通知通常是异步的。当消息传递给消息消费者时,为了不同时接收这些消息,客户端程序需要创建消息监听器以执行 MessageListener 接口,然后用 MessageConsumer 对象对其进行注册。文中的实例都使用该方法动态注册监听器。

要获取更多关于 JMS 属性的信息,参见 参考资料部分。


Calculator 范例

在该系列的 第 1 部分介绍的 Calculator 范例,能通过标准 WSDL V 1.1 接口为客户端程序提供简单的 Calculator 服务。客户端可以在服务接口创建 calculator 实例,然后从 calculator total 中进行添加或删减。范例中的 Calculator 实例都视为 Web 服务资源。请注意 Calculator Web 服务的实现使用的是现有的 J2EE 最佳实践,此时服务接口作为无状态会话 bean 且该状态一直保持在 CMP 实体 bean 中。

本文将介绍订阅 Calculator 服务的步骤,这样能及时监查 Calculator 状态(即 total 值)的改变和在更改后发送通知消息。特别地,您还能:

  • 引入两个 helper 类,SubscriberHelper 和 PublisherHelper。
  • 添加 JMS 消息监听器,即 CalculatorListenerBean,来接收消息通知。
  • 添加 J2EE 客户端应用程序更改 total 值。该代码可以模拟组件来更改 Calculator Web 服务资源的状态。
  • 添加另外的方法 setTotalWithJMSPub 到 CalculatorStateBean。J2EE 客户端程序将调用该方法更改 total 值和传送通知消息。

本文的引言部分介绍的是如何修改该系列第一部分的范例代码。当您已经完成了这些修改,那么您的代码应如同 ws-statefulws 5 code.zip 文件中的代码。(单击本文顶部或底部的 Code图标)。

Calculator 范例的更改流程如 图 1所示。


图 1. Calculator 服务流程
图 1. Calculator 服务流程

步骤 1 使用 CalculatorServiceClient Java 应用程序代替 CalculatorTestClient.jsp(在随后的部分我们将论述该操作的理由)。

步骤 2-3 重复以上操作。CalculatorServiceClient 调用 Calculator Web 服务,该服务将轮流创建 CalculatorState EJB 文件,且主键在 EPR 中返回。

步骤 4 中,CalculatorServiceClient 调用 SubscriberHelper 类来订阅主题以及时发觉 Calculator 状态的改变。

在步骤 5-6 中,SubscriberHelper 类将实例化 CalculatorMessageListener ,以监听在步骤 3 创建的 Calculator 资源实例中 total 值的任何更改。

步骤 7 中,后端应用程序为在步骤 3 创建的 Calculator 资源实例修改 total 值。

在步骤 8-9 中,CalculatorStateBean 会更新 total 值并调用 PublisherHelper 类将 total 值的更改通知给订户。PublisherHelper 类在 JMS 主题队列上发布通知消息。

在步骤 10,CalculatorMessageListener 接收通知消息。

步骤 11 中,CalculatorMessageListener 调用 Calculator 服务获取当前的 total 值。


SubscriberHelper

TSubscriberHelper 提供了 subscribe 方法,这样 Web 服务资源客户端可以用它来注册特定 Web 服务资源实例的资源属性值的变更。subscribe 方法需输入以下参数:

  • ctx —— java 命名上下文对象
  • topic —— 主题名称
  • instanceID —— Web 服务资源实例标识符
  • messageListener ——客户端注册的消息监听器


清单 1 .SubscriberHelper subscribe 方法的实现
001     public static void subscribe(Context ctx, String topic, String 
002     instanceID, MessageListener messageListener) {
003         ...
004     String connectionFactoryName = "jms/" + topic + "tcf";
005     String topicName = "jms/" + topic;
006     
007     try 
008     {
009     
010          ...
011     topicConnectionFactory = (TopicConnectionFactory) 
012                                   ctx.lookup(connectionFactoryName);
013          ...
014     topicConnection = topicConnectionFactory.createTopicConnection();
015          ...
016     topicConnection.start();
017     
018     boolean transacted = false;
019     topicSession = topicConnection.createTopicSession(
020     				transacted,
021     				Session.AUTO_ACKNOWLEDGE);
022          ...
023          _topic = (Topic) ctx.lookup(topicName);
024          ...
025          selector = new String("(instanceID = '" + instanceID + "')");
026     topicSubscriber = topicSession.createDurableSubscriber(_topic, 
027                                                               selector);
028          ...
029     topicSubscriber.setMessageListener(messageListener);
030     
031          ...
032     Thread.sleep(120000);
033          ...
034     	}
			

请留意以上的代码片断:

  1. 在第 11 — 16 行,使用主题工厂与主题创建连接。
  2. 在第 19 行,启动与主题连接的对话。
  3. 在第 23 行,用 JNDI 方式查找主题名称。
  4. 在第 25 行,使用 Web 服务资源的实例标识符创建 JMS 选择器(selector)。JMS 消息选择器允许客户端通过消息头指定感兴趣的消息。只有消息头和属性符合选择器要求的那些消息才会被传送。
  5. 在第 26 行,使用步骤 4 查询到的主题和选择器一起创建持久订户。
  6. 在第 29 行,在步骤 5 创建的订户中设置消息监听器。
  7. 在第 32 行,等待消息监听器接收所有主题的更新,设置等待时间为两分钟。该等待时间只针对本范例,因为这并不需要长时间运行的客户端。

PublisherHelper

PublisherHelper 提供 publish 方法,Web 服务资源可以使用该方法发布自身资源属性值的任何更改。publish 方法需要输入以下参数:

  • ctx —— java 命名上下文对象
  • topic ——topic 名称
  • instanceID ——Web 服务资源实例标识符

清单 2 展示了发布消息的实现:


清单 2 .PublisherHelper publish 方法的实现
001     public static void publish(Context ctx, String topic, String 
002     instanceID) 
003     {
004       ...
005     String connectionFactoryName = "jms/" + topic + "tcf";
006     String topicName = "jms/" + topic;
007     
008     try
009     {
010          ...
011          topicConnectionFactory = (TopicConnectionFactory)              
012                                   ctx.lookup(connectionFactoryName);
013          ...
014     topicConnection =                      
015             topicConnectionFactory.createTopicConnection();
016          ...
017     topicSession =
018       topicConnection.createTopicSession(
019     	transacted,
020     	Session.AUTO_ACKNOWLEDGE);
021          ...
022     
023          _topic = (Topic) ctx.lookup(topicName);
024          ...
025     topicPublisher = topicSession.createPublisher(_topic);
026          ...
027     String outString = "Value of " + topic + " has been Changed";
028          ...
029     TextMessage outMessage=topicSession.createTextMessage(outString);
030          ...
031     outMessage.setStringProperty("instanceID", instanceID);
032     topicPublisher.publish(outMessage);
033          ...
034   }
			

请留意以上的代码片断:

  1. 在第 11-15 行,使用主题工厂与主题创建连接。
  2. 在第 17 行,启动与主题连接的对话。
  3. 在第 23-25 行,使用 JNDI 方式查找主题并使用该主题创建主题发布方。
  4. 在第 27 行,使用主题名称构造消息以待发布。主题名称和 Web 服务资源属性名称相同。
  5. 在第 29 行,使用消息创建 JMS TextMessage。
  6. 在第 31 行,当调用 publish 方法时,用接收到的实例 id 将 JMS 属性设置为 instanceID。这就可以在 SubscriberHelper 中定义选择器逻辑,允许客户端有选择性的接收通知消息。
  7. 在第 32 行,使用主题发布者向主题队列发布消息。

修改 CalculatorStateBean

修改 CalculatorStateBean 以添加新的方法, setTotalWithJMSPub 。该方法能更新 total 值。它也通过调用 PublisherHelper 类的 publish 方法并传递下列参数来发布标示 total 值被更改的消息:

  1. 新的 java 命名上下文对象
  2. 主题队列名,与资源属性(即范例中的的 total)名称相同。
  3. CalculatorState 实体 bean 的主键(Calculator 资源的 instanceID)

清单 3展示了代码相应的部分。更详细的内容请查阅 CalculatorService.ear 包含的 CalculatorStateBean.java 文件。


清单 3 .CalculatorStateBean 的 setTotalWithJMSPub 方法的实现
			...
import com.ibm.samples.wsnt.utils.PublisherHelper;
public abstract class CalculatorStateBean implements javax.ejb.EntityBean {
private javax.ejb.EntityContext myEntityCtx;
..
public  void setTotalWithJMSPub(float total) {
   ...
   this.setTotal(total);
   ...
   try 
   {
      PublisherHelper.publish(new InitialContext(),                            
                    "com/ibm/samples/calculator/CalculatorState/total",
                    this.getName());
   
    } catch (NamingException e) {
	e.printStackTrace();
...
			


J2EE 客户端应用程序

新的客户端应用程序 CalculatorBackendApplicationClient 可以用来更改 total 值。该应用程序使用 CalculatorStateBean 的主键和新的 total 值作为输入,该应用程序在 CalculatorStateBean 上调用 setTotalWithJMSPub 方法。请参阅 CalculatorService.ear 中的 CalculatorServiceBackend.java 文件以获取更详细的信息。


CalculatorListenerBean

在上文已经提及,SubscriberHelper 的 subscribe 方法的输入参数之一为 MessageListener 。在本例中,您可以定义 CalculatorListenerBean 类来执行 JMS MessageListener 类。当有消息要传递给 JMS 消费者时,JMS 提供者通过调用监听器的 onMessage 方法来传递消息。 清单 4展示了 CalculatorListenerBean 的构造函数和 onMessage 方法的实现。在本例中,一旦 total 值改变将调用 onMethod 方法。在 onMessage 方法中,Calculator 服务器代理取当前的 total 值。


清单 4 .CalculatorListenerBean onMethod 的实现
			public class CalculatorListenerBean implements MessageListener {
...
public CalculatorListenerBean(CalculatorService calculatorService)
{
	this.calculatorService = calculatorService;
}
public void onMessage(Message msg) {
	try 
      {
		String instanceId = msg.getStringProperty("instanceID");
		String message = ((TextMessage) msg).getText();
            ...
	     if (message.equals("Value of total has been Changed")) 
	     {
			float total = calculatorService.getTotalEPR();
                  ...
	     }
	} catch (JMSException e) {
        ...
	}
			


修改客户端以订阅主题队列

在该部分将论述如何使用 SubscriberHelper 更改客户端代码以支持订阅通知消息。SubscriberHelper 使用 setMessageListener 方法动态注册信息监听器。然而由于上下文,应用服务器不允许从 Web 或 EJB 容器中调用 setMessageListener 。当调用 EJB 和 servlet 方法时,容器会保存与线程相关的上下文,例如当前事务和安全性主体(security principal)。当 JMS 提供者调用 MessageListener 时,应用服务器不能阻止调用和添加合适的上下文。本文中的范例通过将 CalculatorTestExecute JSP 转换成独立的 Java 应用程序来解决该问题。创建 Calculator Web 服务资源的逻辑仍和以前保持一致。 清单 5展示了为订阅通知而对逻辑进行添加的部分:


清单 5 .订阅主题队列的逻辑
001     public class CalculatorServiceClient
002     {
003         ...
004      
005     public static void main(String[] args) 
006     {
007             String acctName = args[0];
008             float add = (new Float(args[1])).floatValue();
009             float sub = (new Float(args[2])).floatValue();
010     
011     	try
012             {
013     		...
014     
015     		CalculatorListenerBean myListener
016                         = new CalculatorListenerBean(calculatorService);
017                     Properties env = new Properties()
018                 env.setProperty(Context.INITIAL_CONTEXT_FACTORY,
019     			"com.ibm.websphere.naming.WsnInitialContextFactory");
020                 env.setProperty(Context.PROVIDER_URL,
021                       "iiop://localhost:2809");
022                 ...
023                 Context ctx = new InitialContext(env);
024                 ...
025                 SubscriberHelper.subscribe(ctx,
026                         "com/ibm/samples/calculator/CalculatorState/total", 
027                         instanceID, 
028                         myListener);
029                 ...
030     	}
031     
032     }
			

请留意以上的代码片断:

  1. 第 15 — 16 行中,对 CalculatorListenerBean 进行实例化,并将其传递给 Calculator 服务。
  2. 在第 17 — 23 行中,创建 java 命名上下文对象。
  3. 在第 25 — 28 行,调用 SubscriberHelper 的 subscribe 方法,传入下列参数:
    1. 在步骤 2 中创建的上下文对象
    2. 与主题名称相同的资源属性名称
    3. calculator Web 服务资源的实例标识符
    4. 在步骤 1 中实例化的消息监听器

修改服务器配置以启用 JMS

在该部分,论述的是在 WebSphere Application Server 5.1 测试环境中激活和配置 JMS 以运行 Calculator 范例的步骤:

  1. 创建新的 server WebSphere Version 5.1 测试环境。在 J2EE 视图中,切换到 J2EE Hierarchy 透视图。右键单击 Servers并选择 New > Server and Server Configuration来打开服务器创建向导,如步骤 4 所示。将服务器命名为 WebSphere Version 5.1 Test Environment并选择 WebSphere version 5.1 > Test Environment作为服务器类型。单击 Finish以完成测试服务器的创建操作。
  2. 编辑 JMS 提供者设置。双击 J2EE Hierarchy 中的 WebSphere Version 5.1 Test Environment,打开编辑程序并切换到 JMS 选项卡以显示 WebSphere JMS Provider Options 面板。确保服务器的设置已经更改。在面板的顶部,确保服务器设置已经展开而单元设置和节点设置都没有展开。修改 JMS 提供者设置以使用 Embedded Messaging
  3. 添加 WAS Topic Connection Factory。在 WebSphere JMS Provider Options 面板的服务器设置部分,向下移动到 JMS Connection Factories 部分的 WASTopicConnectionFactories 条目表并单击 Add。在接下来的向导中,指定以下信息:
    1. Name:com.ibm.samples.calculator.CalculatorState.totaltcf
    2. JNDI Name:jms/com/ibm/samples/calculator/CalculatorState/totaltcf
    3. Port:QUEUED
    4. Node:localhost
    5. Server Name:server1
    6. Purge Policy:EntirePool
  4. 添加 WAS Topic。向下移动到 WebSphere Application Server Topic 条目表并单击 Add。在结果向导中,指定以下信息:
    1. Name:com.ibm.samples.calculator.CalculatorState.total
    2. JNDI Name:jms/com/ibm/samples/calculator/CalculatorState/total
    3. Topic:com.ibm.samples.calculator.CalculatorState.total
  5. 保存更新后的服务器配置并启动服务器。

设置 Calculator Web 服务

该部分将论述如何在 Application Developer 中创建包含 CalculatorService 范例的工作区,以及如何在内置的 WebSphere Application Server Test Environment 中对其进行配置。

  1. 在 Application Developer 中新建名为 CalculatorService的工作区。
  2. 选择 Window>Preferences>J2EE>Enable server targeting support以激活 Application Developer 中的 Server Targeting 功能。
  3. CalculatorService.ear文件导入工作区。确保选择 WASv5WSNTExtensions.jar而不是 jar 文件以创建项目。确保选择 WebSphere Version 5.1 Test Environment(先前已经配置好)作为目标服务器。该步骤将创建以下项目:
    1. 名为 CalculatorService的企业应用程序项目(J2EE 1.3)。
    2. 名为 CalculatorServiceEJB的企业 JavaBeans 项目,该项目包含 CalculatorServiceEJB 组件的实现。
    3. 名为 CalculatorServiceWeb的动态 Web 项目,该项目包含了 Web 服务路由器项目。
    4. 名为 CalculatorBackendApplicationClient的 WebSphere 应用程序客户端项目,该项目包含了更改 WS instanceID total 值的逻辑。
    5. 名为 WASv5WSNTExtensions的 Java 项目,该项目包含了 Publisher 和 SubscriberHelper 类的实现。
  4. 切换至 Java 透视图 ,创建新的 java 项目并命名为 CalculatorServiceClientJava。选择 import > zip file为您的工作区导入 CalculatorServiceClientJava.jar文件。从 zip 文件中选择 CalculatorServiceClientJava.jar文件并为 into folder 选择 CalculatorServiceClientJava project
  5. 添加 CalculatorService 项目至 WebSphere Test Environment。右键单击 J2EE Hierarchy 中的 WebSphere Version 5.1 Test Environment并选择 Add and Remove projects。添加 CalculatorService 项目并单击 Finish
  6. 添加 JDBC Resources。双击 J2EE Hierarchy 中的 WebSphere Version 5.1 Test Environment以打开编辑程序并切换至 Security 。创建 JAAS Authentication Entries。
  7. 将 JDBC Provider 修改为 DB2 JDBC Provider,以使用 COM.ibm.db2.jdbc.DB2XADataSource作为 Implementation Class 名称。
  8. 指定 JNDI 名称 jdbc/calculator为数据源。

这样便完成了对文中 EAR 和 JAR 文件的开发。


运行 CalculatorServiceJavaClient

以下部分将描述设置和运行 CalculatorServiceJavaClient 应用程序的步骤。

  1. 创建并设置新的启动配置。在 J2EE 透视图中,选择 Run>Run以打开 Launch Configuration 向导。在 Launch Configurations 列表中,选择 Java Application并单击 New。将新的配置命名为 CalculatorServiceClient,使用项目 CalculatorServiceClientJava和主类 com.ibm.samples.calculator.CalculatorServiceClient,单击 Apply。此时向导应如 图 2所示:

图 2 .CalculatorServiceClient 应用程序的启动配置
图 2 .CalculatorServiceClient 应用程序的启动配置
  1. 更新类路径。切换至 Classpath 选项卡,添加 WebSphere Test Environment Runtime Files属性目录。在本设置中为 C:\IBM\WebSphere Studio\runtimes\base_51\properties.
  2. 确保 JRE 选项卡选择项为 Default (WebSphere V5.1 JRE)。
  3. 在 Arguments 选项卡中,输入三个参数: Hello 10 5。您可以 Hello 这个名字来创建 Calculator Web 服务资源,并在总数上加 10 减 5。
  4. 选择 Apply
  5. 确保 WebSphere Application Server Test Environment 已经运行。
  6. 单击 Launch Configuration 向导底部的 Run
  7. 清单 6展示了与输出控制台相关的部分。CalculatorServiceClient 应用程序已经运行,并为即将发送给主题的消息等待两分钟。您可以通过运行 CalculatorBackendApplicationClient 发布此类消息。为进行此步操作,请记住 instanceID ,1092325353206。如清单 6 中第 9 行所示。在您运行 CalculatorBackendApplicationClient 应用程序需要用到它。


清单 6 .CalculatorServiceClient 控制台信息
001     
002     CalculatorServiceClient: Creating calculator for Account = Hello
003     CalculatorServiceClient: Getting an Initial Context..
004     CalcualatorServiceClient: Giving Control to SubscriberHelper
005     ...
006     
007     SubscriberHelper - Subscribe the message : 
008     topic://com.ibm.samples.calculator.CalculatorState.total?brokerVersion=1
009     SubscriberHelper -– Sleeping for 2 minutes. InstanceId = 1092325353206
			


运行 CalculatorBackendApplicationClient

以下部分将描述设置并运行 CalculatorBackendApplicationClient 应用程序的步骤。

  1. 创建并设定新的启动配置。在 J2EE 透视图中,选择 Run>Run以打开 Launch Configuration 向导。在 Launch Configurations 列表中,选择 WebSphere V5 Application Client并单击 New。将新的配置命名为 CalculatorBackendApplicationClient,并使用下拉列表,指定 Enterprise Application 为 CalculatorService以及 Application Client 为 CalculatorBackendApplicationClient,单击 Apply。向导此时应如 图 3所示。

图 3 .CalculatorBackendApplicationClient 的启动配置
图 3 .CalculatorBackendApplicationClient 的启动配置
  1. 在 Arguments 选项卡中,输入 calculator 的 Calculator WS Instance 标识符,该标识符在步骤 8 -以即将改变的所有值运行 CalculatorServiceClient 中已经创建好。本范例中是 1092325353206 350。实际上,您正尝试将实例标识符等于 1092325353206的 Calculator 资源的 total 值设置为 350
  2. 选择 Apply
  3. 确保 WebSphere Application Server Test Environment 已经运行。
  4. 在 Launch Configuration 向导的底部,单击 Run
  5. Listing 7 shows the relevant section of the output console. Line 10 shows application parameters. It calls setTotalWithJMSPub method in the CalculatorState EJB to update the total for the instanceID as in Line 20. 清单 7 展示了输出控制台的相关部分。第 10 行展示了应用程序参数。调用 CalculatorState EJB 中的 setTotalWithJMSPub 方法对第 20 行中的 instanceID 更新 total。


清单 7 . 客户端应用程序的控制台输出结果
						
001     IBM WebSphere Application Server, Release 5.1 
002     J2EE Application Client Tool 
003     Copyright IBM Corp., 1997-2003
004     ..
005     WSCL0001I: Command line, property file, and system property 
006     resolved to:         File to launch          = 
007     C:/CalculatorService/CalculatorService
008     ..
009             Soap Connector Port     = null
010             Application Parameters  = 1092325353206 350 
011     ..
012     WSCL0013I: Initializing the J2EE Application Client Environment.
013     ..
014     WSCL0035I: Initialization of the J2EE Application Client Environment 
015     has completed.
016     WSCL0014I: Invoking the Application Client class 
017     com.ibm.samples.calculator.CalculatorServiceBackend
018     CalculatorServiceBackend: Changing Total Information for instance id 
019     1092325353206 from 10.0 to 350.0
020     CalculatorServiceBackend: Call setTotalWithJMSPub
021     CalculatorServiceBackend: Successfully Updated the total
							


  1. 现在查看 WebSphere Test Environment Console。 清单 8展示了相关部分,特别是 CalculatorStateBean 的调用和 PublisherHelper 向队列发布消息。
    • 第 4-5 行展示了 PublisherHelper 已经创建的 Text 消息。
    • 第 6-7 行展示了将被发布的消息的主题名称。


清单 8. PublisherHelper 发布与主题相关的消息
001     CalculatorStateBean : setTotalWithJMSPub got control now
002     PublisherHelper: Getting an TopicConnectionFactory...
003     ..
004     PublisherHelper - Creating a TextMessage: Value of 
005     com/ibm/samples/calculator/CalculatorState/total has been Changed
006     PublisherHelper - Publish the message : 
007     topic://com.ibm.samples.calculator.CalculatorState.total?brokerVersion=1 
						


  1. 如果发布消息成功,CalculatorServiceClient 等待的 CalculatorListenerBean 将会接收到该消息。为进行验证,切换到 CalculatorServiceClient Console 视图。在控制台视图中会显示其输出结果。 清单 9展示了输出结果的相关部分。CalculatorListenerBean 接收消息,并将信息连同 instanceID 和新的 total 值一起显示出来。


清单 9. CalculatorServiceClient 接收 total 值更改后的消息
001     ..
002     CalculatorListenerBean: onMessage() called with message =  Value of 
003     com/ibm/samples/calculator/CalculatorState/total has been Changed
004     CalculatorListenerBean: Instance Id = 1092325353206
005     CalculatorListenerBean: New Total Value = 350.0
006     ...
007     SubscriberHelper: Closing the TopicSession and TopicConnection now.
008     CalculatorServiceClient:  Exiting
009     ...
						

以上说明了如何订阅 Calculator 资源以获取任何状态的变更和发送有关更改的通知消息。


结束语

本文讨论了如何修改 Calculator 服务的范例,将其建立为订阅服务以获取任何状态(total 值)变更的通知。文中展示了在状态发生更改时,如何修改 Calculator 服务范例来发送通知消息。本文讨论了如何:

  • 建立 JMS 消息监听器
  • 通过创建一个新的 Web 服务资源实例来设置要发布的主题。
  • 接收客户端 Web 服务资源属性内部的更改
  • Web 服务资源状态的改变使 Web 服务产生通知消息并将消息转送至代理。

虽然关于 Calculator 服务本身的实例稍微简单了些,但该系列的文章旨在帮助您加深对 WS-* 规范的理解,以及利用该支持使您的程序启动和运行的更快速。参见本文 参考资料部分以获得关于这些规范的更多信息以及该系列的其他文章。



下载

名字大小下载方法
ws-statefulws5code.zipHTTP

关于下载方法的信息


参考资料

作者简介

Hidayatullah H. Shaikh 是 IBM Software Group 的 On Demand Architecture and Development 开发组的一名高级软件工程师。他所感兴趣和专长的领域包括业务流程建模及集成、面向服务体系结构、网格计算、电子商务、J2EE 技术以及DBMS。您可以通过 hshaikh@us.ibm.com与他联系。

Lalitha P. Kamesam 是 IBM Software Group 的 On Demand Architecture and Development 开发组的一名咨询软件工程师。她所感兴趣和专长的领域包括电子商务应用软件、DBMS 以及 Web 服务。您可以通过 lpk@us.ibm.com与她联系。

Mark Hunsinger 是 IBM On Demand Architecture and Development 开发组的领头人。Mark 在编程和管理复杂的基于 Web 的开发项目上有着数年丰富的经验。在担任 Demand Architecture and Development 领头人期间,Mark 负责评估、优先级排序、以及最终开发孵化器(incubator),并验证其概念,以填补 IBM On Demand 产品组合方面的空白。您可以通过 hunsinge@us.ibm.com与 Mark 联系。

关于报告滥用的帮助

报告滥用

谢谢! 此内容已经标识给管理员注意。


关于报告滥用的帮助

报告滥用

报告滥用提交失败。 请稍后重试。


developerWorks:登录


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


忘记密码?
更改您的密码

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

 


当您初次登录到 developerWorks 时,将会为您创建一份概要信息。您在 developerWorks 概要信息中选择公开的信息将公开显示给其他人,但您可以随时修改这些信息的显示状态。您的姓名(除非选择隐藏)和昵称将和您在 developerWorks 发布的内容一同显示。

请选择您的昵称:

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

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

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


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

 


为本文评分

评论

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=SOA and web services
ArticleID=23163
ArticleTitle=使用 WebSphere Studio 实现和访问有状态 Web 服务,第 5 部分
publish-date=09012004
author1-email=hshaikh@us.ibm.com
author1-email-cc=
author2-email=lpk@us.ibm.com
author2-email-cc=Copy email address
author3-email=hunsinge@us.ibm.com
author3-email-cc=Copy email address