业务整合
4.2 体验开发过程
下面我们要通过开发工具 Toolkit 来实现一个简单消息流的开发、部署和调试,体会 WebSphere Message Broker 开发的基本过程。如果是初次对新创建的运行环境实现开发,需要 有初始化开发环境的过程,否则可以直接进入消息流开发。
4.2.1 初始化开发环境
在“程序”→IBM WebSphere Message Broker 6.0 程序组中启动 WebSphere Message Broker Toolkit。如果是第一次启动 Toolkit,系统会提示设置工作空间,经过必要的设定后进入。通常
情况下,Toolkit 会根据机器语言环境来展示英文或中文界面,也可以用 Eclipse 参数的方式指 定工作空间和界面语言,如:C:\Program Files\IBM\MessageBrokersToolkit\6.0\wmbt.exe -nl en_US -data D:\WMB_Workspace。为了表述精确,建议读者设定英文界面。
Toolkit 由多个视图组成,我们可以在工具右上角进行视图之间的切换,如图 4-2 所示。
图 4-2 开发工具切换视图
切换到代理管理视图,在 Domains 窗口中右击 New→Domain,弹出域配置对话框,输入 配置管理器所在队列管理器的相关信息。在 Queue Manager Name 中输入队列管理器名 WBRKQM,Host 可以保留 localhost,Port 输入为 1414。在 Connection Name 中随意输入连接 名,如 myDomain。配置完成后会在工作空间的 Servers 目录下生成 myDomain.configmgr 文件 记录刚才的配置信息。
现在将代理 WBRK 配置到域中,在 Domains 窗口中右击 New→Broker,弹出代理配置对 话框,输入代理的相关信息。在 Broker Name 中输入 WBRK,在 Queue Manager Name 中输入 WBRKQM。结束后,Toolkit 会询问以增量方式还是完全方式部署代理拓扑的变化。增量方式 只会影响配置变化相关的代理,部署比较快,而完全方式会刷新域中的所有代理,部署过程会 稍慢一些。在当前的域环境中只有一个代理,所以两种方式效果是相同的。
在新的代理配置到 Toolkit 中的域以后,Broker Topology 的代理中会出现一个称为 default 的缺省执行组,其实在这个时候 Toolkit 中的代理结构和代理实体尚未同步,我们如果用 mqsilist WBRK 命令是看不到有任何执行组的,它在第一次部署消息流时会在代理实体中创建。由于 缺省执行组是没有名字的,这会为以后的执行组管理带来一定的困难,所以,通常情况下我们 会在代理中创建自己的执行组。在 Domains 窗口中右击 New→Execution Group,给出执行组 的名称(如 EG)。选择 default,右击 Delete,将其删除。创建域、代理和执行组如图 4-3 所示。
图 4-3 创建域、代理和执行组 这里有两点需要注意:
(1)因为 EG 这时尚未部署过第一个消息流,所以 Toolkit 中的代理结构和代理实体仍然 是不同步的。另外,由于 EG 实体未创建并执行,所以相关的图标都有一个黄色的标记 表示 警告,在 Alerts 窗口中也会有相应的解释 Execution Group is not running。
(2)缺省情况下创建的执行组是 32 位的,如果要在 64 位操作系统中创建 64 位的执行 组,需要首先在 Toolkit 的 Window→Preferences→Broker Administration 菜单中将执行组运行环 境设置为 64-bit。
4.2.2 开发简单消息流
首先,创建消息流项目。切换到代理应用开发视图,在“资源导航”(Resource Navigator)
窗口中右键选择 New→Message Flow Project,在 Project Name 中填写 MyMsgFlowProject 并结 束。这样,就创建了一个名为 MyMsgFlowProject 的消息流项目。
接着,可以在消息流项目中创建代理模式,也可以使用缺省模式而跳过这一步。在消息 流项目中,消息流是可以按代理模式(Broker Schema)分组的,这里的代理模式有点像数据 库中的 schema 或者 Java 编程中的 package。不属于任何代理模式的消息流归于缺省模式,在 资源导航窗口中看到的是(default)。在资源导航窗口中选中消息流项目,右击 New→Broker Schema 创建代理模式 MyBrokerSchema。
然后,创建消息流。选择代理模式,右键选择 New→Message Flow 创建消息流 MyMsgFlow。
Toolkit 会自动打开消息流编辑器,按以下步骤编辑消息流:
(1)展开组件选用板(Palette)将 MQInput、Compute、MQOutput 节点拖入编辑画板中,
将三个节点用连线连接起来,其中 MQInput 的 Out 端子连接 Compute 的 In 端子,Compute 的 Out 端子连接 MQOutput 的 Out 端子。
(2)双击 MQInput 节点,在 Queue Name 属性中输入队列名 QIn。为了清楚起见,右击 MQInput 节点选择 rename,将该节点重新命名为 QIn。类似地,将 MQOutput 节点的 Queue Name 属性设为 QOut,并重命名为 QOut。
(3)点击 Compute 节点,选择 Open ESQL,Toolkit 会自动打开 ESQL 编辑器,里面有一 段缺省的代码表示消息在流经 Compute 节点时的处理过程。缺省代码中的Main函数是代码入 口,两个过程 CopyMessageHeaders 和 CopyEntireMessage 分别表示拷贝消息头和整个消息(包 括消息头和体)。可以将 CALL CopyEntireMessage();前面的注释去掉,或者干脆将 SET OutputRoot = InputRoot;代码写入 Main 函数中。
(4)将消息流和 ESQL 代码保存。简单消息流如图 4-4 所示。
图 4-4 简单消息流
这个简单的消息流的意思是将 QIn 队列中的消息取出经由 Compute 节点处理后放入 QOut 队列中,处理消息的 ESQL 程序实际上只做了一次全文复制,并未对消息内容做任何更改。因 此,这个消息流的效果只是消息搬运。事实上,如果将 Compute 节点省去,效果是相同的。
在部署之前,我们要创建队列 QIn 和 QOut。
C:\>runmqsc WBRKQM def qlocal ('QIn') def qlocal ('QOut') 4.2.3 归档和部署
切换到代理管理视图,在代理管理导航(Broker Administration Navigator)窗口中选择 Servers,右键选择 New→Message Broker Archive 并给出归档文件名(如 MyBAR)。这时 Toolkit 会生成 MyBAR.bar 文件并自动打开 BAR 编辑器,我们可以添加( )或删除( )BAR 中 的内容。在这里我们添加 MyMsgFlow 消息流并保存 BAR 文件。
将 MyBAR.bar 文件从 Broker Administration Navigator 窗口拖到 Domains 窗口中的执行组 EG 中,表示将 MyBAR 部署到 EG 中,如图 4-5 所示。也可以选中 MyBAR.bar 文件,右键选 择 Deploy File,在弹出窗口中选择 EG 执行组表示部署目标,其效果也是一样的。
图 4-5 部署 BAR 文件
部署 BAR 的过程也是配置管理器与代理交互的过程,在第一次部署时代理才真正创建执 行组 EG,这时用 mqsilist 会显示出执行组及其中的消息流。
C:\>mqsilist WBRK
BIP8130I: 执行组:EG - 3736 BIP8071I: 命令成功完成。
C:\>mqsilist WBRK -e EG
BIP8131I: 消息流:MyBrokerSchema.MyMsgFlow BIP8071I: 命令成功完成。
最后,让我们来测试一下这个消息流的效果。任意往 QIn 中放入一条消息,会被代理立 即搬运到 QOut 中,这说明消息流正常运行了。
4.2.4 调试应用
切换到调试(Debug)视图,在调试下拉菜单( )中选择“Debug…”。创建一项 Message Broker Debug 调试配置,可以任意给出配置项的名字(如 MyDebug),选择 Flow Project 为 MyMsgFlowProject,Flow Engine 为 WBRK:EG,点击 Debug 开始调试。可以在消息流节点之 间的连线上右键选择 Add Breakpoint 来增加消息流断点,也可以在 ESQL 代码行左侧右键选择 Add/Remove Breakpoint 来增加或删除代码断点。让我们在 MyMsgFlow 的两条连线上添加断 点,在 ESQL 的 SET InputRoot = OutputRoot;代码上也添加断点,如图 4-6 所示。
图 4-6 在消息流和代码中添加断点
我们再任意往 QIn 中放入一条消息,消息流会在第一个断点停下,这时可以通过 Variables 窗口观察 Message 的结构。因为目前未指定消息格式,所以消息体为 BLOB 类型。由于 Compute 节点含有代码,这时可以按 Step into source 键( )进入 ESQL 代码级调试。调试工具菜单上 的 键分别表示执行到下一层代码的第一句(Step into)、执行到同层代码的下一句
(Step over)、执行到上一层代码的下一句(Step return)。 和 分别表示继续执行到下一个 断点(Resume)和执行到结束(Run to completion)。当执行到代码断点时,Variables 窗口中 的 DebugMessage 为 InputRoot,即从 In 端子中流入时的消息,OutputRoot 为待加工后从 Out 端子流出的消息。消息流调试过程如图 4-7 所示。
图 4-7 消息流调试过程 消息流执行完毕后,QIn 中的消息就被搬运到 QOut 中了。
4.2.5 消息工具
这里介绍一款 WebSphere Message Broker 常用的消息调试工具 rfhutil,它可以从文件或 队列中将消息读入并显示其内容,也可以将消息写入文件或队列中。可以从 WMB 的产品主 页 http://www-306.ibm.com/software/integration/wbimessagebroker/support/中的 SupportPacs 中 下载 IH03 工具包,其中含两个类似的工具软件 rfhutil 和 rfhutilc。前者以 Binding 方式连接 队列管理器,必须与 MQ 安装在同一台机器上,后者以 Client 方式连接队列管理器,可以远 程操作。
rfhutil 的操作界面如图 4-8 所示。我们可以在 Main 中点击 Read File 将消息从文件中读入,
切换到 Data 显示消息内容,再切换到 Main 填写队列管理器和队列名,点击 Write Q 就将消息 写到指定的队列中了。
Toolkit 也提供了一个类似的工具,叫做入队列(Enqueue)和出队列(Dequeue)。其中 Enqueue 表示将消息放入到指定的队列中,Dequeue 表示将消息从指定的队列中取出。将 Toolkit 切换到代理程序开发视图中,可以在工具条中找到 Enqueue( )和 Dequeue( )的图标。
Enqueue 工具也可以在代理程序开发视图中用 New→Enqueue Message File 启动,通过该 工具创建一个后缀名为.enqueue 的文件,文件中包括消息内容和操作参数(如图 4-9 所示)。
我们可以事先将消息内容存放在某个文件中,通过 Browse 将其导入,也可以在文本框中直接 输入文本内容。enqueue 文件可以重复使用,每次打开文件后只需点击 Write to queue 就可以将 一条消息放入指定的队列中。操作参数包括 Queue Manager Name、Queue Name、Host、Port,
前两个参数是队列操作所必需的队列管理器名和队列名,后两个参数表示以 Client 方式连接时 队列管理器所在的机器名(或 IP 地址)和侦听端口。如果缺省 Port 参数,则表示以 Binding 方式连接队列管理器,这时 MQ 的函数库目录必须出现在操作系统的相关路径上,对于 Windows 要在PATH环境变量中添加<WMQ_Dir>/lib,对于 Linux 则要在 LD_LIBRARY_PATH 环境变量中添加/opt/mqm/java/lib。
图 4-8 消息工具 rfhutil 图 4-9 Enqueue 和 Dequeue
Enqueue 工具嵌入在 Toolkit 中,它的内置MQ客户端环境为西文,所以连接的队列管理器 CCSID 必须为 819,这对于大多数基于中文环境的队列管理器(CCSID=1381)用户可能会感 觉 不 便 。 此 外 , Enqueue 工 具 缺 省 认 为 所 操 作 的 是 代 理 所 在 的 队 列 管 理 器 , 通 过 SYSTEM.BKR.CONFIG 通道接入到队列管理器,如果操作的只是普通队列管理器,则可以手 工创建名为 SYSTEM.BKR.CONFIG 的服务器连接通道。
Dequeue 工具可以通过指定的操作参数将消息从队列中取出来并存入文件中。其中,操作
Dequeue 工具可以通过指定的操作参数将消息从队列中取出来并存入文件中。其中,操作