建立和部署PowerBuilder组件
(石骁騑2001年07月20日 17:56)
一、开发组件
在介绍如何将PB组件部署到Jaguar CTS服务器之前,首先介绍一下如何利用PowerBuilder 7开发一个组件。这一步非常重要,因为在这里要设定许多选项,而这些选项又最终直接影响到PB组件的部署工作。
PB开发的Jaguar组件是具有一些特殊事件和属性的特殊的PB非可视化对象(NVO)。这个对象除了要编写代码和在PB中设置一些属性之外,在Jaguar中还需要设定一些特殊的选项来控制组件的行为,而这些选项的设置即可通过手工设定也可通过PB的Jaguar 组件向导来设定其中的一大部分。
采用Jaguar组件向导创建组件,需要回答一系列的问题和设置一些选项,对这些设置和选项的理解是非常重要的,因为它直接影响部署到Jaguar服务器中组件的行为。
利用PowerBuilder创建Jaguar组件时一般都采用Juguar组件向导,该向导引导你完成一系列的设置来创建一个新的Jaguar组件。在向导引导过程中输入的值最后将影响到组件的事件、属性和部署选项。所以在该向导过程中,必须注意这些选项和属性的值。下面我们就开始一步步利用组件向导来创建一个Jaguar组件,对涉及到的所有选项和属性作详细介绍。
选择“File | New” 菜单或者直接在工具条中选择“New”。PowerBuilder 弹出一个由许多标签组成的对话框。选择“Start Wizards”标签,再选择“Jaguar Component”,然后点击“OK”按钮,Jaguar组件向导启动。在第一次创建组件时需要上述步骤,一旦利用该向导创建了一个组件应用,以后只需要在“Object”标签下创建另外的组件。
向导的第一个屏幕首先介绍了该向导的功能和如何通过客户端应用来存取Jaugar对象。点击"Next"按钮,出现下一个对话框,这个对话框总结了向导需要的所有信息和将要回答的问题,点击"Next"按钮,出现如图1所示对话框。该对话框提示用户输入应用的名称和库路径。在这里可以取一个能反映组件功能的应用名称,也可以选用默认的名称“genapp”,最后确认库路径,并点击"Next"按钮。下一个屏幕显示库路径,如果需要的话,可以改变它,点击"Next"按钮,弹出如图2所示对话框。该对话框要求用户输入PowerBuilder的非可视化组件的名称和描述信息,系统默认为应用名称前加"n_"前缀。点击"Next"按钮,弹出下一个对话框。该对话框要求用户输入Jaguar组件名,这个名称默认为和PowerBuilder对象名相同但用户也可以改变它。点击"Next"按钮,下一个屏幕要求用户输入连接Jaguar服务器的一些信息,如图3所示。当部署组件到Jaguar服务器时,PowerBuilder需要这些信息来取得和服务器的连接。如果Jaguar组件服务器运行在本地机器上,则在“Server name”处填入localhost,如果组件服务器没有运行在本地,则需要输入服务器的的名称或其IP地址。端口号为在Jaguar服务器创建时指定的监听器端口号,确省为9000。登陆账号默认为jagadmin,口令默认为空(Jaguar服务器管理员可以更改默认的登陆账号和口令),鼠标单击"Next"按钮。
图1 指定新的应用名称和库
图2 指定组件名和描述信息
图3 指定服务器信息
下一个屏幕要求用户为组件指定一个包名。什么是包?一般来说,一个包就是一组功能相关的对象的集合。所有部署到Jaguar服务器的组件都需要一个包名。在这里可以手工输入一个包名,也可以取Jaguar服务器上已经存在的一个包名,点击"Next"按钮。
下一个屏幕要求用户选择组件的类型。这里有三种类型供选择:标准型(一般组件)、共享型(共享实例)和服务型(在服务器启动时装入,为Jaguar客户端或组件执行后台服务)。一个共享组件的“sharing”属性被设置为TRUE。服务组件不仅被标志为共享,而且还有另外一些方法,如运行,启动和停止等。选择需要的组件类型,点击“Next”按钮。
下一个屏幕用来指定实例缓冲选项,如图4所示。在选择“不支持(not supported)”情况下,可以通过在组件的“CanBePooled” 事件中添加代码来改变组件实例为支持缓冲。也可以通过在Jaguar manager中改变组件的缓冲属性。选择所需要的缓冲属性,点击“Next”按钮。
图4 指定组件的实例缓冲选项
下一个屏幕用来指定事务支持(Transaction Support)和自动分界/自动清除(Auto Demarcation/Deactivation)选项。这两个属性也可以通过Jaugar manager来直接设定。下面对几种事务分别作一下解释。
“Not Supported(不支持)”:指组件在事务范围之外执行;
“Supports Transaction(支持)”:指如果有一个事务在执行,则该组件在这个事务中执行,否则组件将在事务之外执行。
“Requires Transaction(请求事务)”:指组件将一直在一个事务内部执行。如果客户端向一个组件发出服务请求时,则一个新的事务开始。如果一个组件被另外一个已经运行在一个事务中组件请求,则该组件将使用另外一个组件的事务。
“Requires New Transaction(请求新事务)”:指一个组件初始化后,一个新的事务开始启动。
如果选中“自动分界/清除”选项则指该组件在它的任何一个方法被调用后自动使之不活动;否则,组件直到收到一个 SetAbort 或者 SetComplete 调用才使之不活动。选择完毕后,点击“Next”按钮,下一个屏幕用来指定界面选项,这些选项容许你修改组件界面的方式。在这里强调一点,除非你对组件有特殊的需求或者对这些选项具有非常清楚的理解,一般建议不要改变这些选项,保持默认值。点击“Next”按钮。
下一个屏幕用来选择远程调试(remote debugging)和现场编辑(live editing)。远程调试选项在开发期间是非常有用的,但是到了最终释放代码时,不要选中该选项,否则,用户可以看到你的组件代码。现场编辑指Powerbuilder每次在对组件画板作过改变保存后都自动部署组件到Jaguar。选择需要的选项,点击“Next”按钮。
下面将进行PBD生成的一些选项选择。如果选择第一项,则PowerBuilder将从所有库列表中的PBD创建一个单一合并的PBD,然后还需要为这个合并的PBD另外指定一些选项。如果在组件的数据窗口中有一些动态引用(如用到了数据窗口),则应该选中第二个选项(include unreferenced objects)。输入一个合并后的PBD的名称和使用的资源文件PBR的名字,这个资源文件能使组件具有和通常意义上的Powerbuilder应用一样的功能。点击“Next”按钮。
最后,向导显示出所有的选项并为这个组件生成一个“工作计划(to_do)列表”,点击“Finish”按钮,至此,该组件将被生成。
二、修改PB对象为组件
有时候需要将一个已经存在的PB对象升级为一个组件。这时就需要增加一些事件,还需要为部署该组件创建一个工程。
1. 添加事件
将一个传统的PB对象升级为一个Jaguar组件,需要另外添加一些事件,包括 activate, deactivate 和可选的canBePooled事件。
activate – 该事件映射到“pbm_component_activate”。该事件代码每次在组件被激活时执行。这里需要注意的是映射事件是“pbm_component_activate”而不是平常非常熟悉的pbm_activate。
deactivate – 该事件映射到“pbm_component_deactivate”。当组件不活动时激活该事件。
canBePooled –该事件映射到“pbm_component_canbepooled”。它用来程序控制组件的实例缓冲。返回1时,允许实例缓冲,返回0时,禁止实例缓冲。
2. 创建一个部署工程
一旦将一个传统意义上的PowerBuilder对象升级为一个Jaguar组件,还需要另外创建一个部署工程,在下一节中对其进行详细讨论。
三、部署组件的过程和选项
在客户端应用程序使用组件之前,必须将该组件部署到一个应用服务器中。在Powerbuilder 7中,可以利用PB和Jaguar的集成特性,在PB中每次对组件进行修改保存后,直接将其部署到Jaguar服务器中。这种特性在PB中被称为现场调试(Live Editing),这在开发和测试环境中是非常有帮助的,但不能将其应用到实际应用环境中。
1. PB组件的组成
PowerBuilder PBDs
一个部署过的PowerBuilder组件具有许多的元素。第一个就是编译过的PB代码,存放在一个或者多个PBD中。在操作系统中必须要指定这些组件库的路径,这样PowerBuilder的 PBDs才能够被Jaugar中的PowerBuilder运行时间库引擎存取。
IDL
除了PowerBuilder代码以外,还需要一个界面描述,它在客户端应用向服务器中的组件请求服务时使用。这些界面信息采用界面定义语言(IDL)来描述。
Resources
资源是组件动态应用需要的位图或者数据窗口,这些资源保存在PBR文件中。
2. 部署过程
下面来看将一个Powerbuilder组件部署到Jaugar服务器上时,系统会进行那些操作。一般部署一个组件包括在Jaguar知识库(Repository)中设置一些文件和属性,这样当一个客户端应用请求时组件才可以被找到、定位和执行。这里需要注意的是最好不要手工操作Jaguar知识库中的文件,但是如果你对这些属性文件了解较多,则可以直接编辑这些属性文件,非常方便快捷。
jaguar知识库(Repository)
在Jaguar CTS目录下,有一个文件夹叫“Repository”。该目录包括了所有部署到该服务器的PB组件的相关文件。Java组件(.calss文件)的可执行代码在Jaguar CTS 3.5\java\classes 目录下,不在Repository目录下。
添加组件和包属性到知识库(Repository)
每一个组件或者包都有一系列的相关属性属性文件。在Repository目录下包含了许多以“.props”为后缀的文件,这些文件保存了Jaugar的安装(包括Server)、包和组件的各个方面的信息。在jaugar manager中看到的所有属性就是这些.props文件。Repository目录是这样组织的,每一个Powerbuilder组件的属性文件在包目录下的组件目录里面,包的属性在包目录下面的.props文件中。
添加PowerBuilder代码到Repository
编译过的PowerBuilder代码将被添加到知识库repository目录下的“Components” 目录。部署到Jaugar的每一个包在Componets目录下都有一个子目录,包中的每一个组件都有一个目录存放在包目录的下面。如果组件是PowerBuilder组件,那么就会有一系列的以“C”开头的目录在components目录下。
生成IDL并且添加到Repository
IDL描述了一个组件是如何被客户端应用调用的。在Repository目录下的IDL目录下,可以看到Jaguar组件的IDL。IDL文件是以包为单位组织的,在IDL目录下每个包具有一个子目录,里面包含了所有包中组件的IDL文件。
关于“Cookies”
每当一个PowerBuilder组件被部署到Jaguar服务器上时,它都被放置到了repository目录下的一个新的目录,这些目录以C1开始顺序命名,可以在repository目录下的Components目录下看到这些目录,其中每一个目录都包含了编译过的Powerbuilder代码。Jaguar对这些目录的管理是通过组件的属性-“com.sybase.jaguar.component.pb.cookie”进行的,该属性的值就是目前使用的“cookie”,也就是子目录号。我们可以删除所有数字比它小的目录而不会对组件构成任何影响,这样可以释放许多的磁盘空间出来。
三、Jaugar工程向导
1. 创建一个Jaugar工程
创建一个组件后,还需要一个Jaguar工程来部署组件。创建一个Jaguar工程的步骤和前面谈到的创建一个组件的过程很相似。在Powerbuilder中选择“File | New” ,然后在“Projects”标签中选择“Jaguar Component Wizard”,和组件向导不同的是在工程(Projects)标签,而组件向导则在对象(Objects)标签。
建立一个部署工程以后,就可以在Powerbuilder中打开这个工程选择“Design |Build Project”菜单来部署组件到Jaguar服务器。
2. 现场编辑
在第一次利用组件向导创建一个组件时,可以选择“Live Editing”这个选项。然而,如果在第一次创建组件时没有选择该选项,那么以后还有没有办法选择该选项呢?回答当然是有,可以通过下面的步骤来使该功能有效。
在Jaguar工程中选择组件;
在Powerbuilder中打开组件。在属性面版选择该工程,就可以修改该选项。
3. 部署Powerbuiler组件到另外的服务器
在实际开发中,经常遇到这样的问题,利用开发版部署Powerbuiler组件到另外的服务器时,经常出现不能部署的问题。主要原因可能是:
1. 在PowerBuilder开发环境中想存取商业服务器。
“现场编辑”选项在开发环境是一个非常有用的选项,但它不适于在商业服务器上工作。设想一下,如果每一个开发者对商业服务器均有部署存取权限,那么其中任何一个人的一个小小错误都将导致非常严重后果。
2. 远程地址
另外一种情况就是将组件部署到不是本机的远程网络服务器上,这意味着目前的PB开发环境没有对目标远程服务器的存取权限。
四、包部署
相对于从Powerbuilder部署组件,还有一种部署组件的方法就是包部署,也就是从开发服务器上将包导出到一个文件,然后再将其导入到目标服务器上。
1. 利用Jaugar manager创建导出文档
Jaguar Manager提供了将一个包导出到文件的功能,该文件包含了部署组件所有有关的文件和信息,并以一个 .JAR (java 文档)的文件格式保存。下面是具体步骤:
启动Jaguar服务器管理器并登陆。默认登陆用户为jagadmin,口令为空,如果Jaguar服务器运行在本地开发机器上,则主机名(Hostname)为localhost,否则为远端的机器名或IP地址,默认端口号为9000。
在Jaugar manager左边的树型目录下,在Server/Jaguar/Installed Package目录下,可以看到许多包名,其中包括从Pb组件工程中提交的包,找到包含需要导出组件的包。
在包目录上点击鼠标右键,选择“Export Package”,弹出一个导出对话框。选择“Export as Jaguar Package JAR File”,然后选择将该包导出的路径,最后点击“Export”按钮。在你选择的目录下,Jaguar manager将创建一个名为“包名.jar”的文件,包名为Jaguar manager中显示的包名称。
2. 安装组件
一旦创建了一个名为jar的文件,就可以将其安装到任何一个Jaguar服务器上。安装方法如下:
拷贝JAR文件到目标jaguar服务器可以存取到的目录;
登陆Jaguar manager,在左边的树型视图中找到“Installed Packages”目录;
在“Installed Packages”目录上,点击鼠标右键,选择“Import”;
在弹出的对话框中选择“Deploy from Jaguar Package Jar File”,找到需要导入的JAR文件,最后点击“OK”按钮。所选择的Jar文件就被导入到目标Jaguar服务器上。
五、同步部署组件
前面介绍的包部署的方法是一个非常简单和有效的方法,然而它却存在一些缺点,如在一些大规模部署的情况下,就显得不是很适用,非常的烦琐。在这种大规模部署的情况下,另外的一种称之为同步(synchronization)的方法就显示出了它的优越性。同步即可以在集群(cluster)和服务器(server)层面,也可以在包和组件层面上操作。
同步可以在任何可以连接到的服务器上进行,也可以在一个集群的服务器上执行。集群同步必须在集群的主服务器上进行。下面是同步部署组件的步骤:
启动Jaguar manager,连接到主服务器。这里主服务器的概念就是组件和包所在的服务器;
在“Servers”目录下,选择一个服务器、包或者一个组件,然后在其上鼠标右键选择“Synchronize”;
输入连接到的远端服务器或者集群的用户名和口令。这里需要注意的是如果要连接到多个服务器或者多个服务器在一个集群上,所有的服务器必须具有同样的用户名和口令;
如果要同步到一个集群的所有服务器上,点击“Cluster”选择框,在旁边的编辑框中输入集群名称。注意,这些操作必须是在连接到集群的主服务器上进行。
在“Servers”编辑框中输入需要同步的目标服务器的地址(URL或者IP地址);
在“Options”页面下,有一些选择框,下面分别一一对其进行解释。
“All Cluster Files”:复制所有的集群属性到目标服务器上;.
“All Package Files”:复制所有的源服务器上的包文件到目标服务器。这包括所有的IDL文件、属性文件、执行文件(如PBD文件)和组件定义文件等;
“All Servlet Files”:复制所有的servlets到远程目标服务器上;
“Verbose” :在同步操作时产生详细的信息;
“New Primary”:在集群中指定源服务器为主服务器。在选择该选项时要非常小心,选定该选项后,更改的所有配置将开始起作用;
“New Version”:当同步一个集群时指定一个新的集群版本号;
“Refresh”:在同步的最后执行刷新操作。
“Restart”:在同步完成以后重新启动远程服务器。“then wait”对话框中填入的时间指主服务器等待远程服务器重新启动的时间。
选择了合适的选项后,鼠标单击“Start Sync” 按钮,开始执行同步操作。
结论
深刻理解部署Jaguar组件的各种选项是非常重要的。在Powerbuilder开发环境下,可以利用“Live Editing”或者从部署工程中部署组件。在商业环境下,不能从开发环境中部署组件,这时可以选择导出/导出包的Jar文件的方法或者同步的办法来完成。