扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
引言
IBM® WebSphere® Process Server(下文简称为 Process Server)中的业务状态机 (BSM) 组件提供了一种定义和使用业务“名词”的方法。这些名称是“订单”或“行程”之类的内容,它们使用生命周期控制其行为。例如,在行程完成之后将不支持对行程的取消操作,并且相对于未预留的行程,需要以不同的方式进一步处理已预留的行程。BSM 作为一种状态机,提供了一种开发、调试和监视这些“名词”的方法。
BSM 提供对具有生命周期的业务项目的支持。这些项目的状态由事件驱动,而且通常具有循环逻辑(返回以前的状态)。在整个系列文章中,我们将以自动售货机为例进行阐述。自动售货机可以开启、收取钱币、分发产品和找零钱。它周而复始地执行这些循环,直到被关闭为止。它也具有其他循环。例如,自动售货机必须确保客户投进了足够的钱币,才会分发请求的产品。而且,在适用的情况下,还需要把找的零钱返回给客户。
此类应用程序通常使用状态机来表示。状态机主要由状态和状态之间的转换构成。这些转换可以通过多种方式发生。BSM 与 Process Server 中的其他组件类似,是一种服务组件体系结构 (SCA) 组件。其接口使用 Web 服务描述语言 (WSDL) 定义。可以预定义任何数量的 WSDL,并且可以将它们与开发出来的 BSM 相关联。而且,在这些 WSDL 中定义的所有操作都必须在 BSM 中使用。对于 BSM,WebSphere Integrated Developer(下文简称为 Integration Developer)提供了一种以图形方式开发 BSM 的方法。编辑器的表示形式基于状态机建模和设计的统一建模语言 (UML) 定义。我们将介绍在构建和扩展自动售货机时,如何在编辑器中表示状态机。
BSM 编辑器使用状态机的 XML 表示形式,称为状态适应性编排语言(SACL,发音为 sachel)。SACL 文件用于生成业务流程编排 (BPC) BPEL 进程。此进程可以长时间运行,因此它可以管理状态机状态的持久性。事实上,生成进程不会影响 BSM 的开发、调试或监视。不过,当通过 BPC Explorer 或 BPC Explorer 运行时 API 管理 BSM 时,核心功能以及与状态机的交互将由一个长时间运行的 BPEL 进程来表示。
由于 BSM 生成 BPEL 进程,因此,这会导致在设计业务应用程序时碰到何时应使用此方法而不使用彼方法的问题。在最高级别上,可以将进程看做是与“名词”状态机一起使用的“动词”。不过,在状态机比较简单的情况下,使用进程更好一些。例如,不带任何循环(返回原来的状态)的状态机在作为一个进程开发时可能更有意义。但是,如果存在许多循环,则作为状态机进行开发、调试和监视更合理一些。
现在让我们了解一下自动售货机,以便探讨 BSM 支持的核心状态机概念,以及这些概念在 Integration Developer 中的表示形式。
![]() ![]() |
![]()
|
核心状态机概念
前面我们已经讲过,在本文章系列中,我们将使用自动售货机来阐述 BSM 的功能。在本文中,我们将构建最基本的自动售货机。我们将在后续文章中讲述一些高级概念,例如条件、操作、超时和组合状态。
开启和关闭
自动售货机最简单的用例是维护接口。此接口控制自动售货机的开启和关闭,如图 1 所示。
此状态机有三种状态和两种转换。
InitialState1
状态是初始状态,由绿色圆形图标表示。由于这是状态机启动的位置,因此每个状态机均必须有一个确切的初始状态。
FinalState1
状态是最终状态,由蓝色圆形图标表示。状态机在到达最终状态后就会结束。可能存在多种最终状态,但由于状态机始终在到达最终状态时结束,因此在 BSM 中定义多个最终状态对应用程序的功能或逻辑没有任何影响。仅在需要不同的输入操作(将在后续文章中讨论)或者通常使状态机更具可读性时才使用多个最终状态。
Running
状态是一种简单的状态。在此状态中,可以通过 powerOn
操作进入 Running 状态,并可以通过 powerOff
操作退出该状态。稍后您将了解到,我们可以使用多种操作进入和退出单个状态。 本例中的转换是由与 BSM 关联的 WSDL 接口(或多个接口)上的操作所导致的。
您可以使用接口编辑器来定义操作。对于本例,该接口(在接口编辑器中)如下面的图 2 所示。
这两种操作都是单向操作,每种操作都带有单一参数 (serialNumber
),用于唯一地确定自动售货机。换句话说,由于状态机是持久性的,因此我们需要确保操作能够应用到状态机的正确实例。这意味着,每个操作必须传递能够识别状态机实例的独特信息。用数据库术语说,就是 BSM 的主键。BSM 使用与 BPEL 相同的技术来调用此关联信息。
关联信息在编辑器中定义,方法是单击状态机的背景,并在 Properties 视图中选择 Correlation 选项卡(请参见图 3)。
在本例中,我们是使用称为 serialNumber 的单一变量(也叫做属性)进行关联的,该变量的类型为 String。自动售货机关联 ID 的属性如图 4 所示。
需要为 BSM 的接口中定义的每个操作分配关联属性,以确保将操作应用于正确的进程实例。此值可以分配到传入参数的任何部分,因此虽然 serialNumber 可能是 BSM 的关联 ID,但其他传入操作可以将其指定为员工 ID。通过指定用于关联值的参数和参数部分,BSM(如 BPEL)提供了创建属性别名的功能。在我们的示例中,对于每个操作都提供了一个别名,并且指出应从每个操作上的 serialNumber 参数指定关联 serialNumber。尽管本例非常简单,但有些示例可能非常复杂,特别是关联信息来自带有复杂部分的消息时。
回过头看我们的示例,其中的两个转换由导致该转换的操作来标识。齿轮图标用于指示编辑器中的操作。因此,当我们调用 powerOn
操作时,将创建一个 BSM,而且与我们传入的 serialNumber
相关联(因为它是 serialNumber
关联属性的别名)。然后该状态机将转入 Running
状态。如果我们尝试使用相同的序列号再次调用 powerOn
操作,则会失败,因为 Running
状态没有与 powerOn 关联的传出转换。有效的操作只有 powerOff
操作,该操作将导致发生从 Running
到 FinalState1
的转换。这时 BSM 失效,这意味着现在可以重新使用序列号。使用错误的 serialNumber
调用 powerOff
会导致相应的 BSM 关闭,如果不存在具有该序列号的 BSM,则会导致失败。
初始状态传出的转换是唯一性的。初始状态传出的转换只能有一种,而且为此转换指定的操作只应使用这一次。此转换必须有一种操作,因为在创建状态机实例时必须为状态机设置关联。
现在我们有了一台可以开启和关闭的自动售货机。此状态机将能够运行,我们可以使用 BPC Explorer 测试它。
![]() ![]() |
![]()
|
在 BPC Explorer 中测试自动售货机
您可以通过 Integration Developer 中的 BPC Explorer 选项或者通过外部 Web 浏览器来启动 BPC Explorer。要在 Integration Developer 内部启动该浏览器(请参见图 5),请右键单击 Servers 视图中的服务器,选择 Launch,然后单击 BPC Explorer。
如果该服务器尚未启动,该此选项将显示为灰色。要在 Web 浏览器中启动 BPC Explorer,请使用以下地址:http://localhost:9080/bpc,其中 localhost 和 9080 分别为缺省主机名和端口值。此缺省页(如图 6 所示)指向一个屏幕,其中显示为您分配的人工任务。
人工任务与为 BSM 生成的长时间运行进程是分开的,本文没有讨论该人工任务。要找到自动售货机 BSM,请单击左上部的条目 My Process Templates,如图 7 所示。
术语“模板”用于确定长时间运行进程的定义,“实例”则表示当前运行的长时间运行进程的特定实例。对于 BSM,在调用初始状态传出的操作时将创建进程实例;同时,在到达最终状态时该进程实例将失效。
在上面的屏幕中,对于我们的 BSM 仅有一个模板。该模板的名称与我们为 BSM 给定的名称 VendingMachine 相同。尽管在我们的示例中只有 BSM,但该视图中显示了系统中所有 BPEL 和 BSM 应用程序的所有进程模板。
要创建自动售货机的实例,请单击 VendingMachine
前面的复选框,然后单击 Start Instance 按钮,请参见图 8。
在此屏幕中(图 8),您可以指定用于创建 BSM 的参数。Process Name 是用于确定与 BSM 的此实例关联的进程的名称。serialNumber
是创建状态机的 powerOn
操作的参数。如果 powerOn
操作有多个参数,则它们也会显示在这里。我们还记得,在设计 BSM 时,serialNumber
是用于进行关联的,因此它必须是唯一的。
在单击 Submit 时,将创建一个 BSM 实例,而且 BPC Explorer 会自动导航回 My Process Templates 屏幕。这时,我们可以使用多种方法来查看刚才创建的状态机实例。其中一种方法是单击 VendingMachine
前面的复选框,并单击 Instances 按钮。这将显示该模板的所有实例(无论您是否创建了它们)。另一种方法是单击 BPC Explorer 左导航部分中的 Started By Me 选项。这会显示您使用任何模板创建的实例。在我们的示例中,图 9 显示了一个相同的实例。
在本文中,我们的重点是测试 BSM,因此不计划详细介绍在此屏幕上可以执行哪些操作,但将重点介绍以下几项。
了解一些基本的 BSM 操作
BPC Explorer 中显示的状态与 BSM 实例的状态毫无关系。此状态与实例本身有关。对于 BSM,Terminate 按钮将立即终止该实例。这在尝试安装其他版本的 BSM 时会特别有用。如果服务器不是处于开发模式,则 BPEL 在有运行的实例后将不允许替换模板。在生产中,BSM 与 BPEL 类似,其中可以指定“Valid from”日期,该功能可导致在“Valid from”日期之后创建的所有实例都使用该版本的模板。“Valid from”可以在总体 BSM 的 Properties 视图中找到(在 BSM 编辑器的空白处单击),如图 10 所示。
在我们的示例中没有使用“Valid from”。
我们还必须能够对 BSM 执行其他操作。为实现这一点,请单击进程名称 (test1)。这将转到图 11 所示的屏幕,其中显示了该实例的详细信息。
您也可以在此屏幕上终止该实例,但要调用某个操作,请单击 Events 选项卡(即使它显示为灰色),如图 12 所示。
这将显示可以对 BSM 调用的所有操作。注意,这里显示了所有操作,无论它们在 BSM 的当前状态中是否有效。例如,图 13 中显示了 powerOn
操作,但使用该操作要么会导致创建一个新的 BSM(如果使用了唯一的序列号),要么会由于 Running
状态不支持该操作而导致失败(如果使用了相同的序列号)。要使用某个操作,请单击相应的操作名称。在我们的示例中,请单击 powerOff
转到一个新页,其中可以为特定操作输入数据。
我们可以输入序列号并单击 Submit。该序列号必须与我们先前创建 BSM 实例使用的序列号相同。在接受此操作之后,BSM 将结束。BPC 浏览器返回到操作列表屏幕,但由于状态机实例不再可用,因此操作列表将替换为“No items found”。如果返回 Started By Me 视图,则不再显示 BSM 实例。
![]() ![]() |
![]()
|
结束语
在本文中,我们讨论了 BPEL 进程与 BSM 之间的区别,并重点介绍了状态机如何为事件驱动的循环“名词”提供优秀的解决方案。我们创建了一个基本的自动售货机,并使用 BPC 浏览器对其进行了测试。在本系列的后续文章中,我们将对自动售货机进行扩展,使其能够收取钱币并分发产品。我们还将寻求其他方法来测试和调试 BSM。
婵犵數濮烽弫鍛婃叏閻戝鈧倹绂掔€n亞鍔﹀銈嗗坊閸嬫捇鏌涢悢閿嬪仴闁糕斁鍋撳銈嗗坊閸嬫挾绱撳鍜冭含妤犵偛鍟灒閻犲洩灏欑粣鐐烘⒑瑜版帒浜伴柛鎾寸洴閹儳煤椤忓應鎷洪梻鍌氱墛閸楁洟宕奸妷銉ф煣濠电姴锕ょ€氼參宕h箛鏃傜瘈濠电姴鍊绘晶娑㈡煕鐎c劌濡介柕鍥у瀵粙濡歌閳ь剚甯¢弻鐔兼寠婢跺﹥娈婚梺鍝勭灱閸犳牠骞冨⿰鍫濈厸闁稿本绋撹ぐ瀣煟鎼淬値娼愭繛鍙壝悾婵堢矙鐠恒劍娈鹃梺鍓插亝濞叉牠鎮″☉銏$厱閻忕偛澧介惌瀣箾閸喐鍊愭慨濠勭帛閹峰懐绮电€n亝鐣伴梻浣规偠閸斿宕¢崘鑼殾闁靛繈鍊曢崘鈧銈嗗姂閸庡崬鐨梻鍌欑劍鐎笛呯矙閹寸姭鍋撳鐓庡籍鐎规洑鍗冲畷鍗炍熼梹鎰泿闂備線娼ч悧鍡涘箠鎼淬垺鍙忔い鎺嗗亾闁宠鍨块崺銉╁幢濡炲墽鍑规繝鐢靛О閸ㄦ椽鏁嬮柧鑽ゅ仦娣囧﹪濡堕崨顔兼闂佺ǹ顑呴崐鍦崲濞戙垹骞㈡俊顖濐嚙绾板秹鏌f惔銏e妞わ妇鏁诲璇差吋閸偅顎囬梻浣告啞閹搁箖宕版惔顭戞晪闁挎繂顦介弫鍡椼€掑顒婂姛闁活厽顨嗙换娑㈠箻閺夋垹鍔伴梺绋款儐閹瑰洭寮婚敐鍛婵炲棙鍔曠壕鎶芥⒑閸濆嫭婀扮紒瀣灴閸╃偤骞嬮敃鈧婵囥亜閺囩偞鍣洪柍璇诧功缁辨捇宕掑▎鎴濆濡炪們鍔岄幊姗€骞嗗畝鍕<闁绘劙娼х粊锕傛煙閸忚偐鏆橀柛鏂跨焸閹偤宕归鐘辩盎闂佸湱鍎ら崹鐢割敂閳哄懏鍊垫慨姗嗗墻濡插綊鏌曢崶褍顏€殿喕绮欐俊姝岊槼闁革絻鍎崇槐鎾存媴缁涘娈┑鈽嗗亝缁诲牆顕f繝姘亜缁炬媽椴搁弲锝夋偡濠婂啰效闁诡喗锕㈤幊鐘活敆閸屾粣绱查梺鍝勵槸閻楀嫰宕濇惔锝囦笉闁绘劗鍎ら悡娑㈡倶閻愯泛袚闁哥姵锕㈤弻鈩冩媴閻熸澘顫掗悗瑙勬礈閸犳牠銆佸鈧幃鈺呮惞椤愩倝鎷婚梻鍌氬€峰ù鍥х暦閸偅鍙忛柟鎯板Г閳锋梻鈧箍鍎遍ˇ顖炲垂閸岀偞鐓㈡俊顖滃皑缁辨岸鏌ㄥ┑鍡╂Ц缂佲偓鐎n偁浜滈柡宥冨妿閳藉绻涢崼鐔虹煉婵﹨娅e☉鐢稿川椤斾勘鈧劕顪冮妶搴′簼婵炶尙鍠栧畷娲焵椤掍降浜滈柟鍝勬娴滈箖姊洪幐搴㈢┛濠碘€虫搐鍗遍柟鐗堟緲缁秹鏌涢锝囩畼妞ゆ挻妞藉铏圭磼濡搫顫岄悗娈垮櫘閸撴瑨鐏冮梺鍛婁緱閸犳岸宕㈤幖浣光拺闁告挻褰冩禍浠嬫煕鐎n亜顏柟顔斤耿閺佸啴宕掑☉姘箞闂佽鍑界紞鍡涘磻閸℃ɑ娅犳い鎺戝€荤壕濂告煕鐏炲墽鈽夌紒妞﹀洦鐓欓柣鐔告緲椤忣參鏌熼悡搴㈣础闁瑰弶鎸冲畷鐔兼濞戞瑦鐝¢梻鍌氬€搁崐椋庣矆娓氣偓楠炴牠顢曢妶鍌氫壕婵ê宕崢瀵糕偓瑙勬礀缂嶅﹪寮婚崱妤婂悑闁告侗鍨界槐閬嶆煟鎼达紕鐣柛搴ㄤ憾钘濆ù鍏兼綑绾捐法鈧箍鍎遍ˇ浼存偂閺囥垺鐓涢柛銉e劚婵$厧顭胯閸ㄤ即婀侀梺缁樓圭粔顕€顢旈崼鐔虹暢闂傚倷鐒︾€笛呮崲閸屾娑樜旈崨顓犲幒闂佸搫娲㈤崹娲偂閸愵亝鍠愭繝濠傜墕缁€鍫熸叏濡寧纭鹃柦鍐枛閺屾洘绻涜鐎氱兘宕戦妸鈺傗拺缂備焦锚婵洦銇勯弴銊ュ籍闁糕斂鍨藉鎾閳ユ枼鍋撻悽鍛婄叆婵犻潧妫楅埀顒傛嚀閳诲秹宕堕妸锝勭盎闂婎偄娲︾粙鎰板箟妤e啯鐓涢悘鐐靛亾缁€瀣偓瑙勬礋娴滃爼銆佸鈧幃銏$附婢跺澶�
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者