创建 Web 服务以使 Ruby on Rails 客户机与 WebSphere Process Server 集成

从 Ruby 客户机调用 SCA 组件

通过本文了解如何使用 Web 服务来促进 Ruby on Rails 客户机和在 WebSphere® Process Server 上运行的 SCA 组件间的通信。您可以了解如何将 SCA 组件作为服务公开(遵循所需的步骤,以生成将调用服务的 Ruby 客户机)。本文并不会讨论有关 Ruby on Rails 编程或 SCA 开发的所有细节,其重点是使用 Ruby on Rails Web 服务客户机集成 WebSphere Process Server 所需的细节。

Terrence White (tewhite@us.ibm.com), IT 咨询专家, IBM

Terrence White 是 IBM Global Services 的 IT 咨询专家。他目前正在 Service-Oriented Architecture Plus 团队工作,重点是使用流程编排进行 Web 服务和业务流程开发。您可以通过 tewhite@us.ibm.com 与 Terrence 联系。



2007 年 10 月 19 日

引言

WebSphere Process Server 是 IBM 的旗舰集成产品,支持 SOA 生命周期中的运行时活动。WebSphere Process Server 构建于 WebSphere Enterprise Service Bus 产品之上,提供了很多额外功能,包括对基于 BPEL 的流程、业务状态计算机、业务规则和人工任务的支持。服务组件体系结构(Service Component Architecture,SCA)为 WebSphere Process Server 和 WebSphere Enterprise Service Bus 提供了基本编程模型。SCA 使用定义良好的接口将所有集成构件作为服务组件描述。

Ruby 是动态键入、解释的面向对象的脚本语言。它以语法简单、方便易用著称。Rails 是 Ruby 编程语言的一个强大插件,提供了用于开发数据库驱动的 Web 应用程序的动态框架。Ruby on Rails 是 Web 应用程序框架,使用模型-视图-控制器体系结构模式来组织应用程序。它构建于两个可靠的原则之上:

  • 约定优于配置(Convention over configuration)
  • 不要重复自己(Don't repeat yourself,DRY)

约定优于配置 意味着开发人员需要遵循 Rails 使用的所有命名约定,避免自定义配置。这个折衷允许框架大幅度加快应用程序开发的速度。DRY 意味着信息位于单一位置,允许框架对项目的组织进行标准化。这些原则一起确定了组成应用程序组件的主要假设,可帮助框架加速应用程序开发。

例如,如果 Rails 中有名为 LineItem 的对象,Rails 则假设有个用于存储数据的对应数据库表 line_items。因此,开发人员不必重复向框架提供映射(以告知对象的持久存储所在位置)的工作。为了使此方法起作用,开发人员需要遵循对象和表名称的正确命名约定。在遵循正确命名约定的情况下,Rails 可以生成用于在数据库中创建表的 DDL 脚本,从而加速开发周期。

本文介绍如何将在 Ruby on Rails 框架中运行的 Web 服务客户机与部署到 WebSphere Process Server 中的 SCA 组件进行集成。


将 SCA 组件作为 Web 服务公开

此部分描述如何创建简单的 SCA 组件并将其作为 Web 服务公开。您应该已经安装了 WebSphere Integration Developer(请参见参考资料)。

创建 SCA 模块

打开 WebSphere Integration Developer,并使用上下文菜单创建名为 TestModule 的新 SCA 模块,以承载组件。

图 1. 模块创建上下文菜单
模块创建上下文菜单

创建新 SCA 组件

完成以下步骤,以创建新 SCA 组件。

  1. 下载 TestServiceData.xsd 文件并将其拖放到 Data Types 文件夹中,从而为组件创建接口。
    图 2. 拖放 TestServiceData.xsd 文件
    拖放 TestServiceData.xsd 文件
  2. 右键单击 interfaces,并创建名为 TestServiceInterface 的新接口。
    图 3. 接口创建上下文
    接口创建上下文
  3. 创建名为 callTestService 的双向操作,并选择恰当的消息类型,如图 4 中所示。
    图 4. 已完成的服务接口
    已完成的服务接口
  4. 打开组装关系图(如果尚未打开),将没有实现类型的新 SCA 组件拖动到画布上。重命名组件 TestService
    图 5. SCA 组件创建上下文菜单
    SCA 组件创建上下文菜单
  5. 使用组件的上下文菜单将接口与组件关联。
    图 6. 接口分配上下文菜单
    接口分配上下文菜单
  6. 选择 Show WSDL 单选按钮,选择 TestServiceInterface 并单击 Apply。
    图 7. 选择 TestServiceInterface
    选择 TestServiceInterface
    WebSphere Integration Developer 支持为 SCA 组件使用以下实现类型:
    • BPEL
    • 状态机
    • 业务规则
    • 人工任务
    • Java™

    接下来可以创建简单 Java 组件,并使用 Web 服务绑定将其公开。不过,您可以使用任何受支持的 WebSphere Integration Developer 实现类型。

  7. 右键单击 SCA 组件,并为组件生成 Java 实现。
    图 8. Java 实现生成上下文菜单
    Java 实现生成上下文菜单
    请注意,WebSphere Integration Developer 已生成了 callTestService 方法,以与在服务接口中创建的操作匹配。
  8. 将以下代码添加到 callTestService 方法。
    清单 1. callTestService 方法的示例代码
      public DataObject callTestService(DataObject input) {
    	
      String firstName  = input.getString("firstName");
      String middleName = input.getString("middleName");
      String lastName   = input.getString("lastName");
    
      String outputStr  = "Hello " + firstName + " " + middleName + " " + lastName + 
                          ", I am WebSphere Process Server!"; 
    	
      ServiceManager sm = new ServiceManager();
      BOFactory bof     = (BOFactory)(sm.locateService("com/ibm/websphere/bo/BOFactory"));
      DataObject output = bof.create("http://TestModule/Data", "TestServiceOutput");
    	
      output.setString("returnMessage", outputStr);
    	
      return output;
    }

    代码以名、中间名和姓作为输入,并从 Process Server 创建 Hello 消息,然后将其发送回 Ruby on Rails。下一个部分将说明如何完成此工作。

将组件作为 Web 服务公开

  1. 将 export 组件拖动到画布上,并将其连接到 Java 组件。出现提示时,选择 OK
    图 9. export 组件上下文菜单
    export 组件上下文菜单
    图 10. 将 export 连接到组件
    将 export 连接到组件
  2. 使用 export 组件的上下文菜单生成 SOAP/HTTP Web 服务绑定。
    图 11. 生成 Web 服务绑定
    生成 Web 服务绑定
    图 12. 选择 SOAP 协议
    选择 SOAP 协议
  3. 请注意 Web Service Ports 下的新条目。
    图 13. 生成的 Web 服务端口
    生成的 Web 服务端口

生成 Ruby on Rails Web 服务客户机

安装 Ruby on Rails

在 Ruby 网站找到 Ruby on Rails 安装程序包(请参见参考资料)。按照此部分的说明执行安装。

安装 SOAP4R

本文使用名为 SOAP4R 的 Ruby 程序包生成所需的 Ruby 客户机代码,以调用在 WebSphere Process Server 上运行的 Web 服务。

  1. 发出以下命令,以使用 RubyGems 打包系统安装 SOAP4R: gem install soap4r --source http://dev.ctor.org/download/.
  2. 编辑 C:\ruby\lib\ruby\1.8\wsdl\soap 下的 classDefCreator.rb 文件,以将 soap4r 定向为支持匿名类型。在该文件中搜索文本 do we define a class for local complexType from it's name?,并将紧靠其上面的文本 type = nil 注释掉。取消注释文本 type = create_class_name(element.name)
    图 14. classDefCreator.rb
    classDefCreator.rb

生成 Web 服务客户端代码

  1. 创建文件夹,以存储 Web 服务客户机代码。在本文中,请使用 C:\GeneratedRubyScripts
  2. 在 WebSphere Integration Developer 中选择数据类型 (Data Types)、接口 (Interface) 和 Web 服务端口 (Web Service Port),并将其复制到 C:\GeneratedRubyScripts 中。
    图 15. 将文件复制到 C:\GeneratedRubyScripts 中
    将文件复制到 C:\GeneratedRubyScripts 中

    C:\GeneratedRubyScripts 中现在应该包含以下文件:

    • TestServiceData.xsd
    • TestServiceInterface.wsdl
    • Export1_TestServiceInterfaceHttp_Service.wsdl

    对于 SOAP4R V 1.5.6,不支持从多个 wsdl 文件生成 Web 服务客户机。因此,请将两个 wsdl 文件合并到一起。

  3. 在文本编辑器中打开 Export1_TestServiceInterfaceHttp_Service.wsdl 文件,并复制 binding 和 service 元素,如图 6 中所示。
    图 16. 仅复制 binding 和 service 元素
    仅复制 binding 和 service 元素
  4. 将此文本复制到 TestServiceInterface.wsdl 文件的底部。
  5. 从 Export1_TestServiceInterfaceHttp_Service.wsdl 中将 SOAP 命名空间 xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/ 复制到 TestServiceInterface.wsdl 中。请确保将其粘贴到 definitions 元素内,如图 17 中所示。
  6. 在 TestServiceInterface.wsdl 文件的 binding 元素中,将 type="Port_0:TestServiceInterface 更改为 type="tns:TestServiceInterface
  7. 在 TestServiceInterface.wsdl 文件的 service 元素中,将 binding="this:Export1_TestServiceInterfaceHttpBinding" 更改为 binding="tns:Export1_TestServiceInterfaceHttpBinding"
    图 17. 已经配置好的 TestServiceInterface.wsdl
    已经配置好的 TestServiceInterface.wsdl
  8. 导航到 GeneratedRubyScripts 目录,如果需要,更正服务器名称(请参见在远程服务器上运行侧栏),并运行以下命令,以生成 Web 服务客户机文件:wsdl2ruby.rb --wsdl TestServiceInterface.wsdl --type client --classdef --force
  9. 确保命令返回 End of app. (status: 0),如图 18 中所示。
    图 18. wsdl2ruby.rb 输出
    wsdl2ruby.rb 输出

    运行脚本时,应该生成以下文件:

    • TestServiceInterface.rb
    • TestServiceInterfaceDriver.rb
    • TestServiceInterfaceMappingRegistry.rb
    • Export1_TestServiceInterfaceHttpServiceClient.rb
  10. 打开 TestWebServiceMappingRegistry.rb 文件,并确保在文件顶部以下代码行以正确的顺序 显示。您可能必须添加对 rubygems 和 soap4r 的引用。
    清单 3. 用于配置模块依赖关系的代码
    require 'TestServiceInterface.rb'
    require 'rubygems'
    gem 'soap4r'
    require 'soap/mapping'
  11. 打开 Export1_TestServiceInterfaceHttpServiceClient.rb 文件,并使用以下代码替换最后两行,以调用服务。在此测试中,将发送 Ruby on Rails 作为服务输入。
    清单 4. 用于设置服务调用的代码
    # Setup call to the Web Service      
    testServiceInput        = TestServiceInput.new("Ruby", "on", "Rails")
    callTestServiceInput    = CallTestService.new(testServiceInput)
    
    # Call Web Service
    callTestServiceResponse = obj.callTestService(callTestServiceInput)
    
    # Print Response
    puts callTestServiceResponse.output.returnMessage

使用 Ruby 独立脚本测试 Web 服务

确保 WebSphere Process Server 在运行,并从命令行提示符运行以下命令:ruby -d Export1_TestServiceInterfaceHttpServiceClient.rb注意:-d 选项用于在服务执行期间显示 SOAP 连接转储(如果需要)。

图 19. 没有 SOAP 连接转储的服务调用
没有 SOAP 连接转储的服务调用

在 Rails 应用程序中使用生成的客户机文件

创建新 Rails 应用程序

  1. 运行 rails webServiceDemo 命令,以在 GeneratedRubyScripts 目录下创建新 Rails 应用程序和文件夹结构。运行命令之后,应该创建了 webServiceDemo 目录来保存 Web 应用程序的构件。
  2. 修改 webServiceDemo\config 下的 boot.rb 文件,以确保 SOAP4R 正确加载。在文件中搜索 require 'rubygems',并在其下添加 gem 'soap4r'
    图 20. 修改 boot.rb
    修改 boot.rb
  3. 转到 webServiceDemo 目录,并使用以下命令创建名为 WebService 的新控制器:ruby script/generate controller WebService
    图 21. 创建 Rails 控制器
    创建 Rails 控制器
  4. 编辑 webServiceDemo\app\controllers 中的 web_service_controller.rb 文件。向 web_service_controller.rb 文件顶部添加 require 'TestServiceInterfaceDriver.rb',以便加载驱动程序。
  5. 添加清单 5 中的代码,以创建操作。请注意,此代码与清单 4 中的 Export1_TestServiceInterfaceHttpServiceClient.rb 独立 Ruby 脚本使用的代码类似。
    清单 5. 用于创建操作的代码
    require 'TestServiceInterfaceDriver.rb'
    
    class WebServiceController < ApplicationController
        
      def invoke
        
      # Setup call to the Web Service      
      testServiceInput        = TestServiceInput.new("Ruby", "on", "Rails")
      callTestServiceInput    = CallTestService.new(testServiceInput)
    
      # Call Web Service
      obj = TestServiceInterface.new()
      callTestServiceResponse = obj.callTestService(callTestServiceInput)
    
      # Assign Response Message
      @returnMessage = callTestServiceResponse.output.returnMessage
        
      end
    end
  6. 从 GeneratedRubyScripts 目录中将 Web 服务客户机文件复制到 webServiceDemo\lib 目录中,以供控制器使用。需要以下文件:
    • TestServiceInterface.rb
    • TestServiceInterfaceDriver.rb
    • TestServiceInterfaceMappingRegistry.rb
  7. 为了给 invoke 操作创建视图,请在 webServiceDemo\app\views\web_service 目录中创建名为 invoke.rhtml 的文件,并将以下代码复制到此文件中:
    清单 6. 用于创建操作的代码
    <html>
    	<head>
    		<title>Invoke Web Service</title>
    	</head>
    	
    	<body>
    		<h1><%= @returnMessage %></h1>
    	</body>
    </html>

    请注意,上面代码中使用的 @returnMessage 实例变量在清单 5 的操作代码中设置。

  8. 运行以下命令,以启动 WEBrick Web 服务器(请参见侧栏关于 WEBrick):ruby script/server webrick
  9. 使用以下 URL 访问页面:http://localhost:3000/web_service/invoke。
    图 22. 网页视图
    网页视图

结束语

本文使用了简单的 SCA 服务来说明如何将 Ruby on Rails Web 应用程序与 WebSphere Process Server 模块集成。文中提供了相关步骤,说明了如何在 WebSphere Integration Developer 中将 SCA 模块作为 Web 服务公开以及如何使用 SOAP4R 生成可迁移到 Ruby on Rails Web 应用程序中的 Ruby 脚本。本文仅限于 WebSphere Process Server 和 Ruby on Rails 的集成,因此还有很多 Ruby on Rails 和 WebSphere Process Server 功能没有讨论(请参见参考资料,以进一步了解这些主题)。


下载

描述名字大小
Sample test fileTestServiceData.xsd695 KB

参考资料

学习

获得产品和技术

  • 使用 IBM 试用软件开发您的下一个项目,可下载或索取 DVD 光盘。

讨论

条评论

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=SOA and web services, WebSphere
ArticleID=261416
ArticleTitle=创建 Web 服务以使 Ruby on Rails 客户机与 WebSphere Process Server 集成
publish-date=10192007