本文为翻译文章,如有不合理处请查看原文:https://community.alfresco.com/community/bpm/blog/2018/12/10/activiti-7-beta-building-and-deploying-a-custom-business-process,且此文章接Activiti7 探索系列一构建,部署和运行自定义业务流程(一)
构建云连接器
我们在自定义Runtime Bundle中部署的流程定义依赖于云连接器service task1,实现云连接器可以使用Spring Boot项目完成,就像我们对Runtime Bundle一样。 我们这里有一个示例项目,以至于复制构建自定义云连接器不会太困难。云连接器包含业务逻辑的Java实现,该实现应在Activiti 7流程引擎处理一个Service Task时执行。 它位于Runtime Bundle旁边的自己的容器中。
下图说明:
Service Task1定义上的实现属性值(即serviceTask1Impl)将用作Spring Cloud Stream通道目标名称(在绑定的中间件RabbitMQ上)。 因此,我们必须确保Cloud Connector使用spring.cloud.stream.bindings。<channel> .destination属性值创建绑定到此名称的使用者。
构建Springboot2.x应用
使用Spring Boot应用程序非常容易。 只需访问https://start.spring.io/并填写应用程序的数据,如下所示:
确保在Activiti 7 Beta 1 - 3中使用Spring Boot 2.0.x版,Beta 4应与2.1.x版本保持一致。
您不必像我一样使用相同的Group(org.activiti.training)和Artifact(sample-activiti7-cloud-connector)名称,只需使用您喜欢的任何名称即可。 但是,如果您从本文中复制代码,则使用相同的包名称(即同一组)可能会更容易。 然后单击“Generate Project”按钮。 完成的Spring Boot 2 Maven项目将自动下载为ZIP。
标准spring boot应用测试
在继续使用Activiti之前,让我们确保Spring Boot应用程序正常工作。 这涉及两个步骤。 首先构建应用程序JAR,然后运行应用程序JAR。
构建应用程序的jar:
运行应用程序jar:
应用程序不包含太多,因此它将自行退出。
添加依赖(activiti7 Cloud Connector)
Spring Boot应用程序具有我们需要的大多数依赖项,但Activiti 7云连接器依赖项除外。 所以让我们添加它们。 我们可以使用BOM(物料清单)依赖关系,它将引入所有需要的Activiti 7依赖关系管理配置,包括所有依赖关系的正确版本。
Pom.xml添加以下内容:
这将导入Activiti 7 Beta 3的所有依赖项管理配置。现在我们只需要添加一个支持构建和运行服务任务实现等的Activiti 7 Cloud Connector依赖项。将以下依赖项添加到pom.xml:
这将引入运行嵌入在Spring Boot应用程序中的Activiti 7 Cloud Connector所需的所有Activiti和Spring依赖项。注意:如果您在云连接器中有ReST端点,并且希望它们以与Runtime Bundle中相同的方式保护,则可能还需要以下依赖关系:
Cloud Connector 应用
我们现在可以使用所谓的Spring Boot Starter将此应用程序转换为Activiti 7云连接器,将@EnableActivitiCloudConnector注释添加到SampleActiviti7CloudConnectorApplication.java启动类上如下:
同时我们还添加了几个可以搜索Spring Beans的Java Package路径,我们使用@ComponentScan注释来完成此操作。 如果您使用不同的Java包创建项目,那么您必须更改org.activiti.training.sampleactiviti7cloudconnector路径以匹配您的项目环境。
添加应用名称属性
要添加Spring Application Name属性,请打开项目application.properties文件并添加以下属性:
应用程序名称在微服务环境中标识此应用程序,并在向服务注册表(如Netflix Eureka服务注册表)注册时使用。 它还用于在Spring Cloud Config Server中查找<applicationName> [ - <profile>].[properties | yml]以及在Hashicorp的Consul或Apache Zookeeper等其他服务注册表中进行配置。
配置App以使用Keycloak进行身份验证
部署的所有云连接器都使用Keycloak进行用户身份验证。 所以我们需要告诉我们的连接器它可以找到Keycloak服务器。打开项目的application.properties配置文件添加以下属性:
当应用程序通过ACT_ *属性替换初始化时,几乎所有这些属性都可以设置其值。
配置应用程序以生成和使用异步消息
部署的所有云连接器都使用Spring Cloud Stream来生成和使用异步消息。 这些消息可以来自例如RabbitMQ,而Cloud Connector使用Spring AMQP协议来实现RabbitMQ。 我们需要告诉Cloud Connector不同的消息目的地是什么。打开项目的application.properties配置文件并添加以下属性:
属性具有以下含义:
属性名称 | 值 | 描述 |
spring.cloud.stream.bindings. sampleConnectorConsumer.destination | serviceTask1Impl | 绑定中间件(即RabbitMQ)上的通道的目标目标。 这必须与Service Task Definition实现属性值匹配。 |
spring.cloud.stream.bindings. sampleConnectorConsumer.contentType | application/json | 频道的内容类型 |
spring.cloud.stream.bindings. sampleConnectorConsumer.group | ${spring.application.name} | 渠道的消费者群体。 仅适用于入站绑定。 订阅给定目标的所有组都会收到已发布数据的副本,但每个组中只有一个成员从该目标接收给定的消息。 |
spring.rabbitmq.host |
${ACT_RABBITMQ_HOST:rabbitmq} | RabbitMQ消息代理运行的主机名。 通常通过Helm Chart中的ACT_RABBITMQ_HOST初始化 |
通道名称sampleConnectorConsumer只是内部Spring Cloud Streams接线。
其他应用程序配置
我们还需要提供一些配置属性,打开项目的application.properties配置文件并添加以下属性:
实现输入通道接口
除非我们将其连接到将出现Service Task1事件的Spring Cloud Stream频道,否则我们的云连接器不会做太多工作。 在org.activiti.training.sampleactiviti7cloudconnector包中创建一个名为SampleConnectorChannel的接口:
SAMPLE_CONNECTOR_CONSUMER值必须与spring.cloud.stream.bindings.<channel name>.<property>配置中指定的通道名称匹配。 我们现在可以在连接器类实现中使用此示例使用者。
实现连接器类
所以最后要实现Service Task 1业务逻辑。 在项目包中创建一个名为SampleConnector的类:
该类以两个注释开始,一个用于使其成为Spring bean(@Component),另一个用于将其绑定到SampleConnectorChannel(@EnableBinding)。 然后我们连接ConnectorProperties bean,它包含有关连接器的信息,例如服务类型,服务版本,应用程序名称和应用程序版本。 然后注入IntegrationResultSender bean以便能够将数据响应到启动runtime bundle,基本上将事件发送回runtime bundle。然后,我们使用StreamListener注释在方法中实现服务任务业务逻辑。我们可以随意命名该方法,这里被命名为execute。 在这种情况下,实现实际上没有做任何事情,它只是将带有变量var1的消息发送回运行时包。因此,Sample Cloud Connector与Sample Runtime Bundle的关联正是它正在侦听的流,它需要与运行时包中流程定义XML中的Service Task的implementation 属性相匹配。 还有另一个流用于将结果发送回运行时包但我们使用spring boot starter的默认值,因此除非他们找到更改它的理由,否则没有人担心
构建并运行Sample Cloud Connector
我们现在已经准备好构建和运行云连接器,只是为了确保在创建Docker镜像和部署之前所有内容都能正常编译和运行.如下构建:
我正在关闭测试,因为在正确的主机上没有运行RabbitMQ来进行测试。
然后按如下方式运行云连接器:
看起来一切都按预期开始,以便部署它。
部署云连接器
在本节中,我们将介绍部署云连接器的一种方法。
构建我们的Docker云连接器镜像
我们现在通过自定义流程定义完成了云连接器。 为了使用它,我们需要将它作为Docker Image提供。 为了生成Docker镜像,我们需要一个Dockerfile。 使用以下内容在项目的顶级目录中创建一个:
这将创建基于Alpine linux和OpenJDK的云连接器映像。 我们需要运行它。它将在端口8080上暴露。
让我们的Maven项目在Fabric8 Maven插件的帮助下自动为我们构建镜像。将其添加到sample-activiti7-cloud-connector / pom.xml中,如下所示:
现在,为了构建Docker镜像,我们只需要执行以下maven命令:
确保我们能够获取镜像本地镜像列表中
我们现在准备将云连接器包含在Activiti 7部署中。
部署自定义云连接器Docker镜像
我们现在要做的就是将我们的云连接器与必要的服务和基础设施一起部署。 我们可以使用先前的完整示例Helm Chart设置。 我们只需要将Sample Cloud Connector添加到此解决方案部署中。 为此,我们需要为云连接器创建一个Helm包。
创建云连接器Helm Chart
实现这一目标的最简单方法是将开箱即用的示例云连接器的Helm Charts复制到我们的Helm Repo项目(我们之前创建的GitHub页面项目,在我的案例中为https://github.com/gravitonian/helm-repo):
现在我们可以更新这些charts以匹配我们的Sample Cloud Connector。
打开helm-repo / charts / sample-cloud-connector / Chart.yaml文件并将其更新为如下所示,更改名称和版本(注意:chart的名称及其包含的目录必须匹配):
然后打开helm-repo / charts / sample-cloud-connector / values.yaml文件并将其更新为如下所示:
以下值应当被更新:
名称 | 新值 | 描述 |
image.repository | activiti-cloud-connector-custom | 这是我们本地Docker存储库中自定义云连接器Docker Image的名称。 你可以做$ docker image ls来查看它。 |
image.tag | 0.0.1-SNAPSHOT | 这是我们本地Docker存储库中自定义云连接器Docker Image的版本。 你可以做$ docker image ls来查看它。 |
service.name | sample-activiti7-cc-app | 这是表示新云连接器的服务的名称。 |
打包并发布示例云连接器的Helm chart
我们现在准备为Sample Cloud Connector Helm Chart创建一个Helm包。在/ helm-repo目录中执行以下命令:
现在让我们将包括包的所有chart文件上传到我们的Helm Repository(即https://github.com/gravitonian/helm-repo)。 首先生成索引文件:
此命令生成index.yaml文件。 我们来看看它:
helm repo GitHub项目现在看起来像这样:
提交并推送更改:
添加我们的Helm Repository初始化本地Helm
我们现在可以将此Helm repo添加到我们的Helm安装中,如下所示(如果您在开发运行时捆绑包时执行此操作,则可选):
更新repo以确保我们在本地获得所有最新的东西(重要:不要忘记这样做!):
更新完整实例以部署云连接器
在activiti-cloud-charts/activiti-cloud-full-example /requirements.yaml文件中添加对Sample Cloud Connector的依赖关系:
为了获取对Sample Cloud Connector的新依赖性,我们需要更新依赖项,如下所示:
看到包含下载的依赖项的Chart目录:
通过完整实例Helm Charts部署云连接器
我们现在准备使用新的示例云连接器升级我们正在运行的完整示例解决方案(假设它以前正在运行)。首先检查完整示例部署的名称:
我们可以看到Full Example部署的名称为cloying-possum。 执行以下Helm命令进行更新
请注意,我们不能像在使用activiti-cloud-charts / activiti-cloud-full-example安装之前那样参考Activiti Helm Repo中的完整示例 helm chart 包。 这是因为我们改变的不仅仅是values.yaml。 我们也在改变requirements.yaml(即依赖项)。 并且远程activiti-cloud-charts / activiti-cloud-full-example helm包中的依赖关系仍然是相同的,因此我们需要从本地目录中只用点(.)获取chart信息。
查看Kubernetes仪表板并确保正确部署新的Runtime Bundle:
我第一次得到上面的错误。 为了解决这个问题,我刚刚在Docker for Desktop高级设置中添加了一个CPU并重新启动
测试自定义流程
我们现在应该处于可以测试自定义过程的状态。 我们在Sample Runtime Bundle中部署了流程定义,并在Sample Cloud Connector中部署了Service任务实现。
像往常一样,为了能够进行任何ReST调用,我们需要从Keycloak获取访问令牌。 如果您转到Postman集合中的keycloak目录并选择getKeycloakToken,您将获得一个访问令牌:
返回的访问令牌将用于以用户hruser身份验证进一步的请求。 请注意,此令牌是时间敏感的,并且它会在某些时候自动失效,因此如果您开始收到未经授权的错误,您可能需要再次请求它(您将在屏幕中间右侧的Postman中看到401 Unauthorized错误)。
一旦我们获得了用户的令牌,我们就可以与所有用户端点进行交互。 例如,我们可以调用ReST调用来查看在Sample Runtime Bundle中部署的Process Definitions。 我们之前复制了rb-my-app Postman集合,并将URL更改为指向新的Sample Runtime Bundle:({{gatewayUrl}} / sample-activiti7-rb-app / v1 / process-definitions):
现在,让我们使用Sample Runtime Bundle中包含的Sample Process Definition启动一个流程实例。 要基于此流程定义启动流程实例,我们可以使用rb-my-app Copy文件夹中的startProcess Postman请求。 此请求应更新为{{gatewayUrl}} / sample-activiti7-rb-app / v1 / process-instances POST ReST调用:
注意POST主体,它将processDefinitionKey指定为sampleproc-e9b76ff9-6f70-42c9-8dee-f6116c533a6d(取自对getProcessDefinitions调用的响应),以告知Activiti基于最新版本的Sample Process定义启动流程实例。 我还删除了此调用默认指定的流程变量,因为流程不希望使用任何变量进行初始化。 commandType属性也已更改为payloadType:
单击“发送”按钮(但请确保您首先拥有有效的访问令牌,否则您将看到401未授权状态)。 您应该获得有关新流程实例的信息的响应:
接下来要做的就是列出活动任务。 但在我们这样做之前,我们需要与预期分配了任务的用户登录(即获取访问令牌)。 目前,我们以用户hruser身份登录。 我们的自定义流程定义具有分配给testuser的用户任务。 因此,在我们进行调用并检索此任务之前,我们需要为testuser用户获取一个新的访问令牌。
要执行此操作,请单击keycloak文件夹中的getKeycloakToken请求,然后单击Body选项卡:
将用户名更改为testuser。 然后单击“发送”以获取此用户的访问令牌。
我们现在可以在rb-my-app Copy文件夹中调用getTasks请求。 将URL更新为{{gatewayUrl}} / sample-activiti7-rb-app / v1 / tasks?page = 0&size = 10,它与sample-activiti7-rb-app运行时捆绑包相关联。 如果我们运行getTasks请求,我们应该看到如下响应:
我们可以在这里看到任务的ID,它是4f36e024-f6e5-11e8-bbfe-46f0074bbf7d。 该任务已分配给testuser,并且该用户可以使用completeTask请求完成该任务,如下所示:
在这里,我还更新了URL以包含任务ID:{{gatewayUrl}} / sample-activiti7-rb-app / v1 / tasks / 4f36e024-f6e5-11e8-bbfe-46f0074bbf7d / complete
完成此用户任务应该自动使进程转换到Service Task1.我们应该看到有关正在执行的服务任务实现的日志,如下所示:
要获取日志,请转到Kubernetes Dashboard概述以获取命名空间Activiti 7(https://localhost:31234/#!/overview?namespace=activiti7),然后单击Sample Cloud Connector Deployment(即 <helm-release-name>-sample-cloud-connector)。 在“New Replica Set”框中,右侧有几行,如果单击它们,则会将您带到日志中。