这个由两部分组成的文章的第1部分向您介绍了业务流程建模表示法(BPMN)和Bonita开放式解决方案,这是一个基于Java的开源工作流工具。 您使用Bonita来开始设计用于预订酒店房间的工作流。 现在,在第2部分中,您将配置变量以保存工作流数据,并在预订房间的工作流中设计表单以进行用户交互。 然后,将您的工作流与PostgreSQL数据库和JasperReports报告引擎连接,以便它可以从数据库中读取预订信息并生成报告。 最后,您将执行工作流程以查看正在执行的房间预订过程。
在Bonita中设计一个简单的表单
启动Bonita并打开在第1部分末尾保存的RoomBookingDiagram_1.0.proc文件。 (该文件也可以从本文的源代码下载中获得 。)工作流包含EnterRoomInformation
, CheckRoomAvailability
和BookRoom
活动,如图1所示:
图1. Bonita中的房间预订工作流程
![Bonita中的预订工作流程的屏幕截图](https://i-blog.csdnimg.cn/blog_migrate/5bde81fb7a2be73fa612197bf01a3914.png)
下一步是为EnterRoomInformation
活动设计一个简单的表单,如图2所示:
图2.一个简单的数据输入表单
图2中的表单包含一个标题(EnterRoomInformation),一个带有标签的下拉列表(必需的房间类型)和一个名为Check Room Availability的按钮。 它还包含其他一些图形元素,例如Bonita徽标,它们是标准Bonita模板的一部分。 (Bonita允许使用自定义模板,但为简单起见,本文使用标准模板。)
创建一个新表格
要开始为EnterRoomInformation
活动创建此新表单,请单击活动以在详细信息窗口中显示其属性。 单击详细信息窗口中的“ 表单”选项卡,然后单击“ 添加”按钮。 将打开“创建新表单”对话框,如图3所示:
图3.创建新表单的对话框
注意,在图3中 ,Bonita在Name字段中输入EnterRoomInformation
作为新表单的名称。 您还可以在对话框中看到“描述”文本框,您可以在其中输入表单的描述,例如A form showing a drop-down list so that the receptionist can choose the type of room required by the customer
。
在“描述”文本框下方,您可以看到“基于...添加小部件”以及两个标记为“ 全 选”和“全选”的按钮。 在按钮下方是一个标记为isRequiredRoomTypeAvailable的复选框。 默认情况下,此复选框处于选中状态,它表示您在第1部分的“ 向工作流程中添加房间可用性标志”部分中配置的isRequiredRoomTypeAvailable
变量。
Bonita如何在表单设计中使用变量
回想一下第1部分中的isRequiredRoomTypeAvailable
变量实际上是CheckRoomAvailability
活动设置的标志。 工作流稍后使用此标志来决定是否可以进行BookRoom
活动,或者是否必须将控件转移回EnterRoomInformation
活动。
由于您要设计的EnterRoomInformation表单只有一个字段(所需房间的类型,这是一个下拉列表),因此可以推断出isRequiredRoomTypeAvailable
变量(或标志)对于设计此表单不是必需的。 那么,您可能想知道为什么EnterBoomInformation表单的Create a new Form对话框将此变量显示为复选框。
通常,当您使用Java语言设计和实现表单时,表单中的每个字段(例如文本框或下拉列表)都与保存应用程序数据的Java对象相关联。 通常称为模型Bean的对象通常用于大多数Java程序员都熟悉的模型视图控制器(MVC)架构中(请参阅参考资料 )。 Bonita使用相同的概念将字段与过程变量相关联,使您可以直接从过程变量快速构建表单。 它只是简单地创建一个默认表单,其中包含与您选择的每个变量相对应的所有字段。 这是一种具有可根据需要进行编辑和定制的表单的快速方法。
因为isRequiredRoomTypeAvailable
是全局变量,所以它在完整的会议室预订工作流以及该工作流的所有单独活动的上下文中有效。 到目前为止,您尚未为工作流程声明任何其他变量。 因此,这是Bonita认为唯一可用于构建EnterRoomInformation表单的变量。 它仅在可用于设计表单的变量列表中包括isRequiredRoomTypeAvailable
全局变量。
如果要立即单击立即创建新表单对话框底部的完成按钮,则Bonita将创建一个表单,其中包含与isRequiredRoomTypeAvailable
变量相对应的字段。 但是,正如从预订工作流的业务逻辑所知道的isRequiredRoomTypeAvailable
在设计EnterRoomInformation表单时,不需要isRequiredRoomTypeAvailable
变量。 因此,在“创建新表单”对话框中,现在应取消选中isRequiredRoomTypeAvailable
变量旁边的框,然后单击“ 完成” 。 Bonita自动配置一个空的EnterRoomInformation表单,如图4所示:
图4. EnterRoomInformation
活动的新配置的空表单
现在,您必须为所需房间类型字段配置一个变量。 此变量将保存所有可用的房间类型,以便接待员可以选择客户想要的类型。 我将其称为TypesOfRoomsAvailable
变量。 EnterRoomInformation表单上的需要房间类型字段将使用TypesOfRoomsAvailable
变量来获取可用房间的不同类型。
配置变量以保存选项列表
仅在EnterRoomInformation表单中才需要TypesOfRoomsAvailable
变量。 这使其成为局部变量。
要开始创建TypesOfRoomsAvailable
变量,请在Bonita白板(设计视图)中单击EnterRoomInformation
活动。 EnterRoomInformation
活动的详细信息显示在详细信息窗口中。 单击详细信息窗口中的“ 数据”选项卡,然后单击“ 添加”按钮。 出现“添加新变量”对话框,类似于第1部分中的图9 (用于配置isRequiredRoomTypeAvailable
全局变量)。 它包括名称(必填),描述,数据类型和默认值字段。 在“名称”字段中输入TypesOfRoomsAvailable
,然后在“描述”文本框中输入A variable to hold the different types of rooms available in the hotel
,如图5所示:
图5.添加新变量的对话框
现在查看图5中的Data type字段。 在第1部分的图9中配置isRequiredRoomTypeAvailable
变量时,您选择Boolean作为数据类型值,因为isRequiredRoomTypeAvailable
变量是可以为true或false的标志。 TypesOfRoomsAvailable
变量需要是选项列表(可用房间的类型),因此请从“数据类型”字段旁边的下拉列表中选择“选项列表”。
一旦选择选项列表作为数据类型,新的一组三个字段(名称,描述和列表)和四个按钮( 添加 , 向上 , 向下 , 删除 )就会出现在添加新变量的下部对话框,如图6所示:
图6.添加一个新变量的对话框,带有“选项列表”数据类型的额外字段
Bonita显示了额外的字段,因为它需要知道可用房间的实际类型,以便可以将类型列表与TypesOfRoomsAvailable
变量相关联。
正如您在图6中看到的那样,“名称”和“列表”字段标记有一个星号,表示它们是必填项。 这是Bonita的可重用性功能,可让您为值列表指定名称。 稍后,您可以将同一列表与其他变量一起重用。
在“名称”字段中键入ListOfRoomTypes
,然后将These are the types of rooms available
用作描述。 然后,为了将实际值输入到列表中,请单击添加按钮。 出现一个Add a item对话框,如图7所示,它允许您一个一个地输入不同类型的房间:
图7.将值添加到“选项列表”数据类型的对话框
您将在列表中仅输入两个值。 首先,在“添加项目”对话框的“项目名称”字段中键入Single
,然后单击“ 确定” 。 该值现在出现在“添加新变量”对话框的“列表”文本框中, 如图6所示。 再次单击“ 添加”按钮,这一次在“项目名称”字段中键入Double
,然后单击“ 确定” 。 完成“添加新变量”对话框。 现在单击“ 确定”按钮,我在图8中圈出了它:
图8. TypesOfRoomsAvailable
变量的完整配置
单击完成的“添加新变量”对话框底部的“ 完成”按钮。 对话框消失,并且TypesOfRoomsAvailable
变量现在出现在EnterRoomInformation
活动的Data选项卡中,如图9所示:
图9. TypesOfRoomsAvailable
变量添加到EnterRoomInformation
活动中
您已经成功配置了TypesOfRoomsAvailable
变量,因此现在可以使用该变量将“需要房间类型”下拉列表添加到EnterRoomInformation表单中。
向表单添加新字段
在白板上仍选择EnterRoomInformation
活动的同时,在详细信息窗口中单击“ 表单”选项卡。 单击表单列表中的EnterRoomInformation ,然后单击Edit按钮,如图10所示:
图10.编辑Bonita表单
您在“ 创建新表单”部分中开发的空EnterRoomInformation表单将显示在表单编辑器窗口中,该窗口的左侧为组件面板,右侧为表单的设计视图。 表单的设计视图显示矩形单元格。 单击组件面板中的Select组件并将其拖动到表单中最顶部的单元格中,如图11所示:
图11.将组件从面板拖到表单中
将带有Select1作为其标签的新字段拖放到表单上,如图12所示:
图12.将一个Select组件放入表单的设计视图
现在单击Select1字段。 details窗口显示其属性,如图13所示:
图13. Details窗口显示了字段的属性
在“名称”和“显示标签”字段中分别输入RequiredRoomType
和Type of room required
作为值。 现在,新字段将所需房间的类型显示为其标签,如图14所示:
图14.所需房间类型字段的更新标签
所需房间类型字段的下拉列表应显示可用房间的类型,以便接待员可以选择。 因此,下一步是使用您在“ 配置变量以保存选项列表”部分中配置的TypesOfRoomsAvailable
变量,为下拉列表填充可用的房间类型。
将Bonita变量与表单上的字段相关联
在表单的设计器视图中选择“需要房间的类型”字段后,在详细信息窗口中单击“ 数据”选项卡。 请注意,此选项卡包括四个字段:可用值,初始值,表达式和保存到,如图15所示。这些表单字段允许您将变量与该字段关联。
图15. Data选项卡显示与字段关联的变量
单击“可用值”字段旁边的下拉列表,然后选择typesOfRoomsAvailable
变量作为其值。 这将在EnterRoomInformation表单的“所需房间类型”字段旁边的下拉列表中填充房间类型。
现在,单击“初始值”字段旁边的下拉列表,然后选择“ 单个” 。 当将EnterRoomInformation表单显示给用户时,这会将Single设置为默认的为需要房间类型字段选择的初始值。 现在,“数据”选项卡应如图16所示:
图16.选择默认初始值后,RequiredRoomType的“数据”选项卡
“数据”选项卡的“表达式”字段允许您编写一个表达式,Bonita可以使用该表达式来评估“保存到”字段指定的变量的值。 如果要在将用户输入保存到变量之前对其进行处理,此功能很有用。 但是,您不需要对用户输入进行任何处理,因此请保留“表达式”字段的默认值。
工作流的下一个活动CheckRoomAvailability
需要知道所需房间的类型,以便可以查询酒店房间预订数据库的可用性。 您需要定义文本类型的工作流级变量以存储用户输入。 因此,使用配置变量以保存选项列表部分中描述的步骤,创建一个名为requiredRoomType
的变量,将其数据类型设置为Text。 现在, requiredRoomType
变量将在“保存到”字段旁边的下拉列表中列出。 从下拉列表中选择此值后,“保存到”字段左侧的复选框也会被选中,如图17所示。这是因为Bonita知道现在“保存到”字段的名称为用于存储用户输入的变量。
图17. RequiredRoomType字段的“表达式”并保存到“数据”选项卡的字段
您已经为EnterRoomInformation表单配置了字段和变量。 现在,您需要为接待员在选择所需房间类型后单击的表单配置一个按钮。
使用Bonita表单中的按钮
Bonita提供了三种类型的按钮:提交,下一个和上一个。 提交类型按钮提交表单数据以进行处理:当用户单击按钮时,表单数据将被提交,并且工作流程中的下一个活动将发生。 在EnterRoomInformation表单的设计视图中,您可以在表单底部看到一个Submit按钮。 Bonita在创建新表单时会自动为您放置此按钮。 您只需要将按钮的标签从Submit更改为Check Room Availability。 其余的已经由Bonita配置。
在设计视图中单击提交按钮。 详细信息窗口显示按钮的属性,如图18所示:
图18. Details窗口,显示Submit按钮的属性
在详细信息窗口的显示标签字段中,输入Check Room Availability
。 这将更改按钮的标签-并完成EnterRooomInformation表单的配置。
将Bonita连接到PostgreSQL
CheckRoomAvailability
活动将查询酒店的房间预订数据库,以获取所需房间类型的可用性。 我将使用流行的开源数据库PostgreSQL来保存房间预订数据。 Bonita提供了许多连接器,您可以配置这些连接器以将其连接到外部应用程序。 您将配置Bonita的PostgreSQL连接器,以将CheckRoomAvailability
活动与酒店的客房预订数据库连接。
要配置Bonita的PostgreSQL连接器,您将:
- 将PostgreSQL连接器添加到
CheckRoomAvailability
活动。 - 使用
requiredRoomType
变量编写一个SQL查询。 - 将SQL查询的输出存储在
isRequiredRoomTypeAvailable
工作流级别变量中,稍后供其他BPM元素用于决策。
配置Bonita的PostgreSQL连接器
在白板上选择CheckRoomAvailability
活动,以在详细信息窗口中显示其属性。 单击详细信息窗口中的“ 连接器”选项卡,如图19所示:
图19. CheckRoomAvailability活动的Connectors选项卡
“连接器”选项卡尚无用于CheckRoomAvailability
活动的连接器。 要为PostgreSQL添加连接器,请单击Add按钮以打开Select a connector对话框,如图20所示:
图20.将PostgreSQL连接器添加到活动中
您可以在连接器列表的“数据库”项下找到PostgreSQL连接器。 双击Database项,然后选择PostgreSQL-在PostgreSQL DB选项上执行查询 ,然后单击Next ,如图21所示:
图21.从Bonita的数据库连接器中选择的PostgreSQL数据库连接器
接下来,您将看到“命名连接器”对话框,如图22所示,该对话框要求您输入名称,描述以及激活连接器的事件:
图22.酒店数据库的PostgreSQL连接器属性
在“名称”和“描述”字段中分别PostgreSQL connector for the CheckRoomAvailability activity
输入HotelDB
和PostgreSQL connector for the CheckRoomAvailability activity
。
通过选择事件字段,您可以选择在CheckRoomAvailability
活动的开始还是结束时需要此连接器。 由于预订工作流中的CheckRoomAvailability
活动只是一个数据库查询,因此在活动开始或结束时激活连接器都无关紧要。 因此,将“选择事件”字段保留为其默认值。
“名称连接器”对话框中的最后一个字段是“如果连接器失败...。”,从其旁边的下拉列表中,可以选择两个选项之一,以防与数据库通信时发生问题:引发错误或忽略它。 为简单起见,还将If连接器失败..字段保留为其默认值,如果数据库连接器不起作用,则会引发错误。
单击下一步按钮。 下一个对话框要求您输入数据库连接信息,包括数据库名称,用户名,密码以及托管数据库的服务器的名称和端口。 这些值取决于您如何设置数据库。 图23显示了我使用的值:
图23. PostgreSQL数据库连接对话框
输入数据库连接信息后,单击“ 下一步”按钮。
提供一个SQL查询以从数据库中读取
现在,您具有一个查询对话框,如图24所示,您可以在其中输入SQL查询来检查房间的可用性:
图24.输入一个SQL查询
您知道requiredRoomType
变量保存了用户所做的选择。 因此,SQL查询必须使用requiredRoomType
变量检查该类型房间的可用性。 在查询文本框中输入以下查询:
Select "Availability" from "RoomInfo" WHERE "RoomType" = '${requiredRoomType}' AND
"Availability" = TRUE
该查询从PostgreSQL的RoomInfo
表中选择可用性RoomInfo
true
所有记录。
在执行此查询之前,Bonita将${requiredRoomType}
替换${requiredRoomType}
requiredRoomType
变量的值。 因此,如果接待员在表单中选择单身作为房间的必需类型,则将执行的实际SQL查询为:
Select "Availability" from "RoomInfo" where "RoomType" = 'Single' AND "Availability"
= TRUE
这就是Bonita如何让您编写在运行时确定的动态SQL查询的方式。
在工作流级别的变量中捕获SQL查询的输出
您需要将SQL查询输出存储在isRequiredRoomTypeAvailable
变量中,该变量已在第1部分中配置为全局变量。 单击下一步按钮,您将看到在PostgreSQL数据库对话框上执行查询,该对话框可让您将SQL查询的输出映射到Bonita变量。 在“连接器输出”组合框中键入rowSet.getValues().asBoolean()
, isRequiredRoomTypeAvailable
从Destination变量下拉列表中选择isRequiredRoomTypeAvailable
,如图25所示:
图25.将SQL查询的输出映射到Bonita变量
如果可以预订所需的房间类型,则rowSet.getValues().asBoolean()
方法将插入true
作为isRequiredRoomTypeAvailable
变量的值。
您已将工作流程连接到数据库。 现在,您可以执行剩下的最后一个工作流程配置步骤:设计房间预订表单,以收集客户信息并预订房间。 对于此步骤,定义CustomerName
, PhoneNumber
和BookingDate
本地变量以保存客户信息。 然后,使用Create a new form屏幕(请参见图3 )来设计新表单。 最后,配置连接器并编写SQL查询,以将预订信息提交到数据库。 因为我已经演示了所有这些过程,所以我保留此表格作为练习。 本文源代码中的RoomBookingDiagram_2.0.proc文件包含房间预订工作流程的最终迭代。
将JasperReports与Bonita集成
现在,您已经配置了完整的房间预订工作流程。 在演示如何执行工作流之前,我将演示如何将JasperReports与EnterRoomInformation
活动集成。 Bonita-JasperReports集成在BPM应用程序中很有用,因为在现实情况下(例如,酒店的客房预订过程)通常需要报告功能。 JasperReports是最受欢迎的开源报告引擎之一。
您需要先安装JasperReports,然后再将其与Bonita结合使用。 请访问JasperReports网站以获取下载和安装说明(请参阅参考资料 )。
使用EnterRoomInformation
活动配置JasperReports的过程类似于在“ 将Bonita连接到PostgreSQL”部分中执行的步骤。 在白板上选择EnterRoomInformation
活动,单击其“ 连接器”选项卡,然后单击“ 添加” 。 您将获得“命名连接器”对话框。 然后从“选择连接器”对话框的“ Jasper”项中选择“ 创建报告-从数据库创建Jasper报告”选项。 在“命名连接器”对话框中,输入BookingSummaryReport
作为连接器的名称。
之后,您将获得图26所示的Database access information对话框,询问您JasperReports连接到数据库所需的信息:
图26.输入JasperReports的数据库访问信息
在数据库驱动程序字段中输入org.postgresql.Driver
。 org.postgresql.Driver
是JDBC驱动程序,每当您使用PostgreSQL数据库时都需要该驱动程序。 图26中显示的其他字段值是我为配置输入的值jdbc:postgresql://localhost:5432/hotelDB
JDBC URL字段为jdbc:postgresql://localhost:5432/hotelDB
,用户名和密码字段均为postgres
。
请参阅相关主题关于关系数据库如PostgreSQL的连接JasperReports的更多细节。
单击Next
按钮,将打开“报告设置”对话框,如图27所示:
图27. JasperReports的报告设置
此对话框要求您提供JasperReports XML(JRXML)文件的路径。 所有JasperReports报告均设计为JRXML文件。 在本文的源代码下载中,我已经提供了CurrentBookingSummaryReport.jrxml文件,用于简单的房间预订摘要报告。 将此文件复制到您选择的位置,并在JRXML文件路径字段中提供文件的路径。
在“输出文件路径”字段中,指定希望Bonita保存预订摘要报告的PDF版本的位置。 在输出格式字段中,选择PDF 。 单击“ 完成” ,您的客房预订摘要报告现已与Bonita完全集成。
执行房间预订工作流程
Bonita与流行的开源Web服务器Jetty捆绑在一起。 这使用户可以轻松测试在Bonita中配置的BPM应用程序。
在尝试进行房间预订工作流之前,您需要设置PostgreSQL数据库并使用示例数据填充该数据库(如果尚未这样做)。 请参阅源代码下载中的Readme.txt文件,以获取有关使用我尝试该应用程序时使用的示例数据来设置和填充PostgreSQL的说明。
该下载文件还包含RoomBookingDiagram_2.0.proc,该文件包含具有所有表单和变量的完整的会议室预订工作流程。 从Bonita的文件菜单中打开该文件,然后在Bonita的工具栏上单击Run以执行工作流,如图28所示:
图28. Bonita工具栏
单击“ 运行”按钮时,Bonita会自动将预订房间的工作流程捆绑在Web存档(WAR)文件中,该文件会在Jetty上部署和运行。 然后,Bonita在Web浏览器中打开EnterRoomInformation表单,如图29所示:
图29. EnterRoomInformation表单
您会看到“单身”是在“所需房间类型”下拉列表中选择的默认值。 而是选择Double ,然后单击Check Room Availability按钮。 您再次获得相同的EnterRoomInformation表单,因为示例数据中没有双人间可供预订。
现在,重新选择“ 单个” ,然后单击“ 检查房间可用性”按钮。 由于客房预订数据库中的样本数据表明有一个房间可供预订,因此现在显示如图30所示的BookRoom表单:
图30. BookRoom表单
您还可以观察到EnterRoomInformation
活动已在您先前指定的位置中保存了客房预订摘要JasperReports报告的PDF版本。
结论
在这个由两部分组成的系列文章中,您在Bonita中配置并执行了一个简单的酒店客房预订工作流,作为BPM应用程序。 您还将工作流与两个外部应用程序进行了接口。 您只需使用Bonita的图形工作流程和表单编辑器即可完成所有此配置,而无需编写任何Java代码。
几乎所有BPM应用程序都需要与外部应用程序接口。 大多数现实世界中的BPM应用程序需要一个以上的BPM引擎和许多其他非BPM外部应用程序,所有这些都可以一起工作。 目前,尚无标准的Java API来描述BPM工具如何与外部应用程序接口以及不同的BPM工具如何相互接口。 因此,每个BPM工具都必须设计某种接口机制,例如Bonita的连接器机制。 如果开发了定义BPM工具或其他应用程序如何公开其功能以集成到工作流中的标准Java BPM API,则这种接口可以变得无缝。
翻译自: https://www.ibm.com/developerworks/java/library/j-bpm2/index.html