内容


使用 WebSphere Message Broker V8 开发 WS-ReliableMessaging 解决方案

简介

本文演示了 IBM® WebSphere® Message Broker V8(以下简称 Message Broker)中通过从 JAX-WS 和 Microsoft® .NET WCF 客户端调用 Message Broker 流而提供的 WS-RM 支持。本文还为不熟悉该协议的读者提供了 WS-RM 概述,并向您说明如何为客户端和服务启用 WS-RM。本文并没有介绍如何构建 Web 服务客户端和服务,因为您可以 下载在本文中所描述的参考资料

什么是 WS-RM ?

WS-RM 是一个 OASIS 标准,即使目标端点暂时不可用或网络连接失败,它也可以使两个系统可靠地发送 SOAP 消息给对方,并确保交付。WS-RM 定义了在没有成功交付消息的情况下应如何再次发送消息,从而克服这些问题,它可以防止将重复的消息传输到目标端点。

WS-RM 概述
WS-RM 概述
WS-RM 概述

WS-RM 规范定义了两个端点:RM Source (RMS) 和 RM Destination (RMD),以确保消息可靠地发送。使用序列实现可靠性。在发送消息之前,RMS 和 RMD 执行一个信息交换,以建立一个使用惟一标识符标识的序列,该序列由从 1 开始编号的消息序列组成。RMD 使用消息编号来验证并确保交付。

RMS 将每个消息一次或多次地发送到 RMD,并且 RMD 对自己收到的每个消息发回一个确认。如果 RMS 没有收到某个消息被 RMD 收到的确认,RMS 将再次发送消息,直到收到确认为止。上图显示了用于可靠地发送 SOAP 消息的 RMS 和 RMD:

  1. Application Source 为可靠传输发送一个消息。
  2. RMS 接受该消息并一次或多次地传输它。
  3. 接受该消息后,RMD 确认它。
  4. RMD 将消息交付给 Application Destination。

当一个序列中的所有消息都已被成功传输到 RMD 时,RMS 表示序列已终止。RMS 和 RMD 在应用程序层是不可见的,但它们用于确保在消息已丢失或未交付时再次发送消息。在双向 WS-RM 的场景中,请求和响应都被可靠地交付,客户端和服务器上都会有一个 RMS 和一个 RMD。

交换消息

下图显示了在 RMS 和 RMD 端点之间交换消息的一个示例,并显示了使用 WS-RM 的好处。在此消息交换中,一个消息序列(在本例中假设它们是单向的)在 RMS 和 RMD 之间发送。在本例中,RMD 从未收到最初由 RMS 发送的 Message 2,所以 RMD 只发送了 Message 1 和 Message 3 的序列确认。然后,RMS 再次发送 Message 2,这次 RMD 收到它并发送了所有三个消息的确认。然后,RMS 终止该序列:

示例:RMS 和 RMD 之间的消息交换
示例:RMS 和 RMD 之间的消息交换
示例:RMS 和 RMD 之间的消息交换

配置 Message Broker

在 Message Broker V8 中,WS-RM 支持已被添加到 SOAP Nodes,在消息流上配置 WS-RM 是一项管理任务。消息流开发人员不需要知道消息流可能启用 WS-RM,因为它并不影响流设计。管理员使用策略集配置 WS-RM。在 Message Broker V8 之前,策略集仅用于配置 WS-Security。 在 V8 中,您可以为 WS-Security 或 WS-RM 配置策略集。在策略集内,管理员可以配置是否应按顺序接收消息,并且可以定义客户端兼容性设置。 您可以使用 Message Broker Toolkit 或 Message Broker Explorer 中的 BAR Editor 在流或节点级别应用策略集。可以针对提供商 (SOAPInput, SOAPReply) 或消费者 (SOAPRequest) 应用策略集。启用了 WS-RM 的流也可以接收没有使用 WS-RM 标头的请求。虽然 WS-RM 是一个消息级协议,您在 Message Broker 中也只能将它用于 SOAP/HTTP 消息,因为 SOAP/JMS 已被视为可靠。Message Broker 支持 WS-RM V1.0 和 B1.1。默认策略集使用 WS-RM V1.1。

您可以使用 Policy Set Editor 配置一个策略集,您可以在 Message Broker Explorer 内启动该工具:

  1. 在您的 Broker 上单击右键,并选择 Properties
    选择 Broker Properties
    选择 Broker Properties
    选择 Broker Properties
  2. 在 Properties 窗口,选择 Security and Policy => Policy Sets 以打开 Policy Set Editor:
    打开 Policy Set Editor
    打开 Policy Set Editor
    打开 Policy Set Editor
  3. 在 Policy Set Editor 中,您可以配置 WS-Security 和 / 或 WS-RM 的设置。为 WS-Security 和 WS-RM 提供了默认策略集,分别是 WSS10Default 和 WSRMDefault。在策略绑定中不需要为 WS-RM 进行配置:
    在 Policy Set Editor 中选择 WS-RM
    在 Policy Set Editor 中选择 WS-RM
    在 Policy Set Editor 中选择 WS-RM

您可以指定是否应该按顺序(默认)交付消息。您也可以设置客户端兼容性。在默认情况下,使用 WS-RM V1.1 发送出站请求。然而,如果您有一个包含 SOAPRequest 节点的消费者流,该节点需要发送出站请求至 .NET WCF 服务,那么您可以选择那个使用 WS-RM V1.0 发送出站请求的选项:

在 Policy Set Editor 中选择 WS-RM 选项
在 Policy Set Editor 中选择 WS-RM 选项
在 Policy Set Editor 中选择 WS-RM 选项

您可以使用 BAR Editor 在消息流级别或节点级别应用策略集:

将 Policy Set 应用到 SOAP Input 节点
MBX
MBX

您可以导出和导入策略集。例如,您可能已在一个测试系统上测试您的消息流和策略,现在您希望在生产系统上运行它。Message Broker 命令行工具使您能够导出和导入您的策略集:

  1. 导出策略集,可以使用 mqsireportproperties。例如:
     mqsireportproperties MB8BROKER -c PolicySets -o TestPolicySet 
        -n ws-rm -p TestPolicySet.xml
  2. 导入策略集,可以使用 mqsicreateconfigurableservicemqsichangeproperties。例如:
     mqsicreateconfigurableservice MB8BROKER -c PolicySets -o TestPolicySet 
    
     mqsichangeproperties MB8BROKER -c PolicySets -o TestPolicySet 
        -n ws-rm -p TestPolicySet.xml

InOrder 交付

如果在策略集中的 InOrder 为 true(这是默认设置),每个序列的消息的交付顺序将与 Application Source 发送它们的顺序相同。对于提供商流(使用 SOAP Input 和 SOAP Reply 节点),这表示消息的处理顺序与客户端发送它们的顺序相同。Message Broker 接收的消息有一个消息编号,如果某个消息的编号比相同序列中任何前面的消息都高,在收到前面的消息之前,SOAP Input 节点将不会处理该消息。当 InOrder 为 true 时的行为如下所示:

当 InOrder 为 true 时的行为
当 InOrder 为 true 时的行为
当 InOrder 为 true 时的行为

如果 InOrder 为 false,那么序列中的消息的交付顺序可以与 Application Source 发送它们的顺序不同。对于使用 SOAPInput 和 SOAPReply 节点的提供商流,消息则会在 Message Broker 接收它们之后尽快处理。 如果 Message Broker 所接收的消息其编号高于相同序列中任何前面的消息,那么在处理前面消息之前,SOAPInput 节点就会先处理该消息。没有指定 InOrder 时的行为如下所示:

没有指定 InOrder 时的行为
没有指定 InOrder 时的行为
没有指定 InOrder 时的行为

交付保证

当为一个提供商流启用 WS-RM 时,消息只会被 SOAPInput 节点处理一次。 如果某个消息已被提供商流处理,而 RMS 再次发送相同的消息,该消息不会在消息流中向下传播,因为它是一个重复的消息。 先前已发送的响应会被自动发送,而消息无需再次经过流处理,如下所示:

交付保证
交付保证
交付保证

示例 WS-RM 场景

为了演示如何在 Message Broker 中使用 WS-RM,您可以使用一个简单的消息流,从客户端接收 Web 服务请求并发送响应。您可以扩展该流,将请求转发给一个后端服务,但为了简单起见,该流使用一个 SOAPInput 节点接收 Web 服务请求,在一个 Compute 节点中形成响应,并使用一个 SOAPReply 节点发送响应。 该示例将首先演示,如果客户端和流未使用 WS-RM,那么,在网络中断的情况下,消息可能会丢失。其后,您将在客户端和流上启用 WS-RM,并演示,即使出现网络中断,一旦网络连接恢复,消息仍将到达其目标。

该示例使用一个简单的消息流,如下所示,它从 .NET Web 服务客户端接收 WS-RM 序列(由黑色箭头表示),以及从 JAX-WS 客户端接收 WS-RM 序列(由蓝色箭头表示)。 我们有意使该流保持简单,以说明 WS-RM。

SOAPInput 和 SOAPReply 节点从一个 .NET 客户端和一个 JAX-WS Web 服务客户端接收请求
SOAPInput 和 SOAPReply 节点从一个 .NET 客户端和一个 JAX-WS Web 服务客户端接收请求
SOAPInput 和 SOAPReply 节点从一个 .NET 客户端和一个 JAX-WS Web 服务客户端接收请求

使用 WS-RM 的 Message Broker

  1. 在本文未尾 下载 WMB_BankService_PI.zip Message Broker 项目
  2. 启动 Message Broker Toolkit。
  3. 选择 File => Import,导入项目。在 Import 窗口中,选择 Other => Project Interchange 然后单击 Next
  4. 浏览至您下载的 Message Broker 项目文件。选择 BARFilesBankService,然后单击 Finish
  5. 导入项目之后,您应该看到如下所示的应用程序。
  6. 将所提供的 Bank.bar 文件部署到一个 Message Broker 执行组。
Message Broker Bank Service
Message Broker Bank Service
Message Broker Bank Service

使用 WS-RM 的 .NET WCF 客户端

如果您有 Visual Studio 2010 或更新版本,您可以在本文未尾 下载 BankClientSln.zip 文件中的解决方案,并从您的开发环境运行 .NET 客户端。此外,您可以 下载 BankClient.zip,并解压缩 32 位客户端 BankClient.exe 和配置文件 BankClient.exe.config

通过创建一个 C# 控制台应用程序并导入 WSDL 作为服务引用,可以生成一个 .NET 客户端。然后,该客户端调用在 Message Broker 服务流中暴露的每个操作。主要方法中的代码如下所示。在本文稍后所演示的网络中断时,在 try/catch 块中调用的四个操作将捕获异常。

 BankDelegateClient bc = new BankDelegateClient(); 
 try 
 { 
    bc.orderNewChequeBook(123456); 
    Console.WriteLine("Check Book Ordered"); 
    bc.depositFunds(1, 2, 3); 
    Console.WriteLine("Funds Deposited"); 
    int intResponse = bc.checkBalance(123456); 
    Console.WriteLine("Balance is: " + intResponse); 
    Boolean boolResponse = bc.creditCheck("Message", "Broker"); 
    Console.WriteLine("Got creditCheck response of: " + boolResponse); 
 } 
 catch (Exception e) 
 { 
    Console.WriteLine("I ran into some trouble:\n" + e); 
 } 
 Console.WriteLine("Press ENTER to exit."); 
 Console.ReadLine();

从 Microsoft .NET 发送非 RM 消息给 Message Broker

  1. 首先,从 .NET 发送一个消息给 Message Broker,不使用 WS-RM。从您的开发环境或通过运行 BankClient.exe 启动 .NET 客户端。您看到的输出包含了每个被调用的操作从 Message Broker 收到的响应:
    BankClient.exe
    BankClient.exe
    BankClient.exe
  2. 如果您希望看到线路消息或模拟一个网络中断,您需要 Message Broker Toolkit 中的 tcpMon 和 TCP/IP Monitor 这样的监视程序来将您的请求放在隧道中。在默认情况下,Message Broker 侦听器在端口 7800 上启动(您可以查看事件日志来确认这一点)。设置您的监视程序,以侦听端口 7801 和连接到端口 7800 的隧道。
  3. 接下来,使用文本编辑器或 Microsoft Service Configuration Editor 编辑配置文件(BankClient.exe.config 或使用 Visual Studio 时则是 app.config)。将端点地址从 7800 修改为 7801。如果您熟悉 .NET 配置,您可能想改为添加一个 clientVia 行为。
    在 Service Configuration Editor 中更新端点地址
    在 Service Configuration Editor 中更新端点地址
    在 Service Configuration Editor 中更新端点地址
  4. 再次运行 Bank Client 应用程序,并注意四个请求和响应消息:
    在客户端和服务之间发送的 SOAP 消息
    在客户端和服务之间发送的 SOAP 消息
    在客户端和服务之间发送的 SOAP 消息
  5. 停止监视程序并再次运行 Bank Client 应用程序。请注意,客户端如何获得一个 EndpointNotFoundException,因为一旦隧道重建后,就不可能恢复!
    当出现网络中断时,返回加错误消息
    错误
    错误

在 Message Broker 消息上启用 WS-RM

通过选择 WSRMDefault 策略,您可以在 BAR File Editor 中启用 WS-RM,如 所示。之后,您必须向执行组重新部署您的流,使变更生效。

将 WS-RM 消息从一个 .NET 客户端发送到一个 Message Broker 服务

  1. 首先,在 .NET 配置文件中启用 WS-RM。所提供的文件已包括一个绑定,该绑定被配置为使用 WS-RM,所以只需修改端点以使用 BankPortBindingRM 而不是 BankPortBinding。下面的屏幕截图显示了 Microsoft Service Configuration Editor,但您也可以使用文本编辑器:
    BankClient 配置
    >BankClient 配置
    >BankClient 配置
  2. 从启用您的隧道开始,并运行 Bank Client 应用程序。除了在没有 WS-RM 时所看见的应用程序消息,现在还有 WS-RM 协议消息,如 CreateSequence。
  3. 停止监视程序,并返回 Bank Client 应用程序。请注意,Bank Client 应用程序并没有生成一个错误,而是等待,因为它无法建立一个连接到 Message Broker,并且正在尝试再次发送消息。
  4. 再次启用隧道。.NET 客户端似乎立即采取行动并完成每个操作,就像从未出现过中断或问题一样。
    在客户端和服务之间发送 WS-RM 消息
    在客户端和服务之间发送 WS-RM 消息
    在客户端和服务之间发送 WS-RM 消息

使用 WS-RM 的 JAX-WS 客户端

将 JAX-WS Web 服务客户端项目导入 Rational Application Developer

已提供一个 JAX-WS Web 服务客户端项目,您可以将其导入 Rational Application Developer V8 并部署到应用程序服务器。

  1. 在本文未尾 下载 RAD_BankClient_Projects.zip 中的 Rational Application Developer 项目
  2. 解压缩这个 zip 文件。
  3. 启动 Rational Application Developer。
  4. 选择 File => Import,导入项目。在 Import 窗口中,选择 General => Existing Projects into Workspace,然后单击 Next
  5. 浏览至您解压缩 zip 文件的目录。选择 BankClientBankClientEAR,选择 Copy projects into workspace,然后单击 Finish
  6. 导入项目之后,您应该看到如下所示的应用程序,以及一些用于从应用程序服务器调用 Message Broker Web 服务的 JSP 页面:
    Rational Application Developer Bank Client 应用程序
    Rational Application Developer Bank Client 应用程序
    Rational Application Developer Bank Client 应用程序

将非 RM 消息从一个 JAX-WS Web 服务客户端发送到一个 Message Broker 服务

  1. 首先,将 JAX-WS Web 服务客户端部署到您的应用程序服务器。为了在 Rational Application Developer 中做到这一点,选择 Servers 选项卡,右键单击 WebSphere Application Server V8 at localhost,并选择 Add and Remove
  2. 在 Add and Remove 窗口中,选择 BankClientEAR,单击 Add,然后单击 Finish。您应该看到 JAX-WS Web 服务客户端被部署到您的应用程序服务器,如下所示:
    已部署的 Bank Client
    已部署的 Bank Client
    已部署的 Bank Client
  3. 您可以通过运行 TestClient 将消息发送给在 Message Broker 上运行的 Bank Service。您将在 BankClient => WebContent => sampleBankPortProxy 下面找到 TestClient.jsp。
  4. 右键单击 TestClient.jsp,选择 Run as,然后选择 Run on server
  5. 选择应用程序服务器,然后单击 Finish

    现在显示 TestClient 应用程序 UI。首先,发送一个不使用 WS-RM 的消息,并且使用一个 TCP/IP Monitor 来查看被发送的消息。您可以使用 TCP/IP Monitor 模拟一个网络中断,您可以使用 Message Broker Toolkit 中的 TCP/IP Monitor 或 tcpMon。Message Broker 侦听器默认在端口 7800 上启动(您可以查看事件日志来确认这一点)。设置您的监视程序侦听 7801 和连接到 7800 的隧道。

  6. 在 TestClient 界面中,将端点更新为 http://localhost:7801/WebServiceProject/BankService,选择 checkBalance,并单击 Invoke,如下所示。余额被返回到 Result 窗口中:
    调用 checkBalance 操作
    调用 checkBalance 操作
    调用 checkBalance 操作
  7. 在 TCP/IP Monitor 中,您将看到一个 checkBalance 操作的请求和响应消息,如下所示:
    在 TCP/IP Monitor 中显示的 Request/Response
    在 TCP/IP Monitor 中显示的 Request/Response
    在 TCP/IP Monitor 中显示的 Request/Response
  8. 停止 TCP/IP Monitor,以模拟一个网络中断,并再次调用 checkBalance 操作。这一次,没有返回余额,您将会看到一个错误返回到 Result 窗口中:
    网络中断时返回的错误
    网络中断时返回的错误
    网络中断时返回的错误

在 JAX-WS Web 服务客户端上启用 WS-RM

为了在 JAX-WS Web 服务客户端上启用 WS-RM,您需要对其应用一个策略集。该策略集已提供。

  1. 在本文未尾 下载 WAS_WSRM_PolicySet.zip
  2. 导入策略集:在 Rational Application Developer 中,选择 File => Import,然后选择 Web services => WebSphere policy sets
  3. 浏览至下载的策略集 zip 文件并单击 Finish

接下来,将策略集应用到 Web 服务客户端:

  1. 选择 BankClient => Services => Clients,右键单击 Clients 端点,并选择 Manage Policy Set Attachment
  2. 选择服务名称并单击 Next
  3. 在 Application 下面,单击 Add
  4. 对于 Policy set,选择 WSReliableMessaging default,然后单击 OK。忽略针对 WS-I Basic Profile 1.1 显示的警告。
  5. 单击 Finish

有关如何将策略集应用到 Web 服务客户端的更多信息,请参阅 developerWorks 文章 Applying Web Services Reliable Messaging (WS-RM) to a web service

您的 JAX-WS 客户端将被自动重新发布到应用程序服务器。现在它已被配置为使用 WS-RM。

将 RM 消息从 JAX-WS Web 服务客户端发送到 Message Broker

  1. 重新启动 TestClient,并确保 TestClient 所使用的端点是 http://localhost:7801/WebServiceProject/BankService。单击 Update。保持 TCP/IP Monitor 停止,调用 checkBalance 操作。几秒钟之后,启动 TCP/IP Monitor。您将看到请求已成功并返回了一个余额。
  2. 在 TCP/IP Monitor 中,您将看到更多 WS-RM 协议消息与应用程序消息一起被发送,如由客户端发送的 CreateSequence 和由服务返回的 CreateSequenceResponse:
    WS-RM 协议消息现在由客户端和在 Message Broker 上运行的服务发送
    WS-RM 协议消息现在由客户端和在 Message Broker 上运行的服务发送
    WS-RM 协议消息现在由客户端和在 Message Broker 上运行的服务发送

结束语

本文演示了 WebSphere Message Broker V8 中针对 SOAP/HTTP 的 WS-RM 新功能,并演示了 Message Broker 如何使用 WS-RM 与 JAX-WS 或 .NET WCF 客户端进行互操作。 首先使用一个 TCP/IP 隧道来模拟网络中断,您可以看到不可靠的传输如何导致 SOAP/HTTP 请求的失败,要求在客户端应用程序中实现任意重试逻辑。在客户端和服务上启用 WS-RM,可以使客户端或 Web 服务提供商无需额外的编码就能从错误中恢复。该场景非常简单,并且只演示端点从一开始就不可用的错误用例,但 WS-RM 支持在序列中任何位置的恢复,包括丢失的应用程序请求或异步响应。


下载资源


相关主题

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=WebSphere
ArticleID=816803
ArticleTitle=使用 WebSphere Message Broker V8 开发 WS-ReliableMessaging 解决方案
publish-date=05212012