Camunda的时尚,时尚,青年BPM开发

图片

BPM开发并不容易。 这是因为该过程必须对客户是可读和可理解的,而不仅仅是从技术角度来看是正确的。

并非所有用于开发业务流程的工具都允许您在清晰的描述和技术功能之间找到折衷方案。 许多高级开发工具和过程描述通常还有一个缺点:它们如此酷,功能强大且复杂,以至于在制造过程中,技术向前迈进了一大步,并且使用这种工具进行开发变得无关紧要。

2018年从根本上改变了我们开发业务流程的方式。 以下是关于这种方法的演变方式以及我们的变化方式。

而不是序幕


我们的部门从事业务流程的开发-从最小的规模到最小的规模到最大的利润。 直到最近,我们还是使用IBM的产品进行开发,这使我们能够在生产中快速启动有效的业务流程。

IBM BPM是一个功能强大的平台,其中包含一组丰富的功能,例如对流程本身,UI表单和集成模块的描述。 此外,该平台的入门门槛较低,这使新手开发人员可以立即将自己沉浸在项目中。 但是该产品也有缺点,如果它们不抑制发展,那么肯定不会对速度和质量有所贡献:

  • 没有理智的版本控制。 IBM BPM根本不提供在存储库中正确存储流程(代码)的能力,而是使用它自己的存储库,该存储库不知道诸如合并之类的概念。
  • 用Java 6开发。也许在撰写本文时,已经可以用Java 7开发,但是在2019年,这有点安慰。
  • IBM BPM正在WebSphere上旋转,因此,开发人员需要对模块的每次更新保持耐心。 此外,这对于管理员来说还很头疼,他们必须定期挂起这个怪兽才能使它恢复生命。
  • 在Integration Designer环境中开发集成模块,实际上并没有为更好的Eclipse所迷惑。
  • 没有正常的单元测试功能。
  • 该平台的成本很高。

除了纯粹的技术开发上的不便之外,这些缺点还造成了另一个问题,它可能比上述所有问题都严重得多。 在Java 12时代,Kotlin,微服务和其他流行趋势和片段,所有这些细微差别都极大地激励了团队。 很难在2019年不断扩展的Java 6 Integration Designer中体验开发的乐趣。

图片

由于存在所有这些限制,因此很难维持下去。 不到一年前,有人提出尝试使用Camunda引擎来描述业务流程。 首先,选择了一个不大但相当重要的法人实体终端注册过程。

由于我们完全重写了它,因此几乎没有旧代码,我们几乎不能将自己局限于任何东西,因此我们选择Kotlin作为开发语言。 尝试使用这种新语言很有趣,该语言主要是为了获得好评。 在我们部门的其他一些项目上,有成功的实施经验。 最终的结果是这样的:Camunda,Spring Boot 2,Kotlin,Postgre。

什么是卡蒙达?


图片

Camunda是一个用Java编写的开源业务流程建模平台,并使用Java作为开发语言。 它是一组库,允许您执行所描述的过程。 要将Camunda集成到项目中,只需添加一些依赖项。 要存储进程,您可以根据任务选择内存DBMS或持久DBMS。 我们选择Postgre,因为该故事对于我们进行“汇报”很重要。 默认情况下,平台部署到H2。

开发包括两个部分:在特殊的Camunda Modeler实用程序中创建流程,以及编写处理图中描述的流程步骤的Java代码。 为了从流程中调用Java代码,足以实现JavaDelegate接口,在上下文中提升该Bean(您可以通过全名指定delagate,但通过Bean则更方便和灵活)并在所需的流程步骤中指定其ID。 在科特林,代表显得更加简洁。 代表的逻辑很简单:他们从上下文中减去某些内容,执行一些操作,然后将其放回上下文中。

图片
Camunda Modeler弹出窗口

Java委托示例:


import org.camunda.bpm.engine.delegate.DelegateExecution; import org.camunda.bpm.engine.delegate.JavaDelegate; public class JavaExampleDelegate implements JavaDelegate { @Override public void execute(DelegateExecution execution) { String someVar = (String) execution.getVariable("someVariable"); // some actions execution.setVariable("otherVariable", "otherValue"); } } 

Kotlin代表示例:


 import org.camunda.bpm.engine.delegate.DelegateExecution import org.camunda.bpm.engine.delegate.JavaDelegate class KotlinExampleDelegate: JavaDelegate { override fun execute(execution: DelegateExecution) { val someVar = execution.getVariable("someVariable") //some code execution.setVariable("otherVariable", "someValue") } } 

在代表中,您可以描述业务逻辑,集成以及您内心渴望的一切。

我们尝试以具有逻辑的业务组件的形式创建一个层,并仅将委托用作流程流的链接,以使代码和流程尽可能少地混合。

在大多数情况下,此方法很方便且成功。 与流程的交互是通过DelegateExecution进行的,例如,DelegateExecution允许处理上下文,事件等。

那就是我们想要的吗?


在开始时,选择工具时,我们正在寻找具有以下功能的解决方案:

  • 准确地从发生故障的位置恢复过程,并且希望开箱即用。
  • 您可以在某些GUI上查看该过程的总体情况。
  • 编写单元测试的能力不仅针对逻辑和集成,还针对流程本身。
  • Java 8及更高版本。
  • 发达的社区。

Camunda可以进行错误恢复和分析。

易于理解的跟踪信息,可以设置在跌落之前执行步骤的尝试次数,可以在跌落时自定义处理程序-例如,如果在跌落期间我们要将某个实体的状态更改为“错误”。 仅通过实现DefaultIncidentHandler即可轻松实现后者。 的确,此处理程序起作用时有一个有趣的时刻:每次进入流程步骤时都会触发错误恢复代码。 我不能说这是一个超级错误或问题。 相反,您只需要在开发时记住并考虑这一点即可。

我们这样解决了它:

 override fun resolveIncident(context: IncidentContext) { val incidentList = Context.getCommandContext().incidentManager.findIncidentByConfiguration(context.configuration) if (incidentList.isNotEmpty()) { //      } } 

Camunda有一个GUI,还不错。

但是,如果您想要更多,例如在流程版本之间迁移实例,那么您将必须努力工作。 默认的UI仅具有最小的功能,但是有一个非常强大的Rest API,可让您创建自己的管理面板-酷而复杂。

我们沿着管理面板的道路前进了。 我们的业务流程架构师在很短的时间内便将其记录下来,包括查看已完成流程的历史记录,版本之间的迁移等功能。

Camunda的Rest非常强大,可以让您使用流程进行几乎任何事情。 例如,您可以使用/ process-definition / key / aProcessDefinitionKey /以这样一个简单的请求启动进程

 { "variables": { "aVariable" : { "value" : "aStringValue", "type": "String" }, "anotherVariable" : { "value" : true, "type": "Boolean" } }, "businessKey" : "myBusinessKey" } 

该示例摘自官方文档,其中包含使用此API的各种情况的详尽说明。

对于单元测试,我们使用常规的Junit。 另外,还有一个相当有趣的库来测试流程本身-'org.camunda.bpm.extension',名称:'camunda-bpm-assert'。 使用它,您可以描述测试以验证流程。

这非常方便,因为查找流中错误的问题通常比在代码中查找困难。 这样的测试可以防止例如不正确的重构,并且确实对我们有所帮助。

对Java 8的需求已部分消失,因为在许多进程中使用Kotlin消除了对G8的需求。 Kotlin非常适合该项目,并且只允许您专注于编写业务逻辑。 很难相信,但是Kotlin所说的关于冷静的一切基本上都是真实的。 几乎所有具有集成功能的应用程序都知道的具有大量字段的实体现在看起来并不那么恐怖,并且实体之间的映射变得更加可读。 经常受到批评的是,在大多数情况下,无效安全性确实有效并且可以提供帮助。

卡蒙达社区非常发达。 事实证明,GitHub上不断有新的库用于测试和度量。

Camunda与Spring完美集成非常好。 添加必要的依赖项,几个注释和几个配置bean-实际上,这就是集成! 结果,我们编写了一个每个人都习惯的常规spring应用程序,从而增加了业务流程的流程。 交互是通过Java API进行的,该API使您可以通过Java代码来操纵流程。

例如,您可以仅使用一个命令来启动该过程:

 runtimeService.startProcessInstanceByKey( "MyTestProcess", "MyBusinessKey", mapOf( "key1" to "value1", "key2" to "value2", ) ) 

这里的MyTestProcess是进程的ID-shnik,而不是实例。 MyBusinessKey是正在运行的流程实例的唯一键。 我们通常在此字段中使用一些商业价值-以便在实例和搜索之间进行更快的导航。

大约以相同的方式,您可以唤醒“困”过程。

明显的缺点或我们遇到的任何问题,特别是无法回顾。 结果,在相当短的时间内,它变成了一个完全正常的过程,并且安全地投入了生产。 其他流程正在该平台上实施,并且非常成功。 现在,在Camunda上,我们已经启动了大约15个应用程序,一次可旋转约10万个进程。

图片

而不是结尾


这里有一些资源有助于实现上述堆栈。 如果您对该主题的其他信息感兴趣,建议您阅读它们。

Source: https://habr.com/ru/post/zh-CN455860/


All Articles