protected internal virtual void deployOnTwoConcurrentThreads(IDeploymentBuilder deploymentOne, IDeploymentBuilder deploymentTwo)
        {
            Assert.That(deploymentOne, Is.Not.EqualTo(deploymentTwo));

            // STEP 1: bring two threads to a point where they have
            // 1) started a new transaction
            // 2) are ready to deploy
            ThreadControl thread1 = ExecuteControllableCommand(new ControllableDeployCommand(deploymentOne));

            thread1.WaitForSync();

            ThreadControl thread2 = ExecuteControllableCommand(new ControllableDeployCommand(deploymentTwo));

            thread2.WaitForSync();

            // STEP 2: make Thread 1 proceed and wait until it has deployed but not yet committed
            // -> will still hold the exclusive lock
            thread1.MakeContinue();
            thread1.WaitForSync();

            // STEP 3: make Thread 2 continue
            // -> it will attempt to acquire the exclusive lock and block on the lock
            thread2.MakeContinue();

            // wait for 2 seconds (Thread 2 is blocked on the lock)
            Thread.Sleep(2000);

            // STEP 4: allow Thread 1 to terminate
            // -> Thread 1 will commit and release the lock
            thread1.WaitUntilDone();

            // STEP 5: wait for Thread 2 to terminate
            thread2.WaitForSync();
            thread2.WaitUntilDone();
        }
        protected internal virtual string DeploymentWithBuilder(IDeploymentBuilder builder)
        {
            DeploymentId = builder.Deploy().Id;
            DeploymentIds.Add(DeploymentId);

            return(DeploymentId);
        }
        protected internal virtual IDeployment deploy(IBpmnModelInstance modelInstance)
        {
            IDeploymentBuilder deploymentbuilder = processEngineConfiguration.RepositoryService.CreateDeployment();

            deploymentbuilder.AddModelInstance("process0.bpmn", modelInstance);
            return(testRule.Deploy(deploymentbuilder));
        }
        public Task <Deployment> Deploy([FromBody] ProcessDefinitionDeployer deployer)
        {
            IDeploymentBuilder deployment = this.repositoryService.CreateDeployment();

            if (deployer.DisableSchemaValidation)
            {
                deployment.DisableSchemaValidation();
            }

            if (deployer.EnableDuplicateFiltering)
            {
                deployment.EnableDuplicateFiltering();
            }

            string resourceName = deployer.Name.EndsWith("bpmn", StringComparison.OrdinalIgnoreCase) ? deployer.Name : $"{deployer.Name}.bpmn";

            IDeployment dep = deployment.Name(deployer.Name)
                              .Category(deployer.Category)
                              .Key(deployer.Key)
                              .TenantId(deployer.TenantId)
                              .BusinessKey(deployer.BusinessKey)
                              .BusinessPath(deployer.BusinessPath)
                              .StartForm(deployer.StartForm, deployer.BpmnXML)
                              .AddString(resourceName, deployer.BpmnXML)
                              .Deploy();

            return(Task.FromResult(deploymentConverter.From(dep)));
        }
Example #5
0
        public Task <Deployment> Save(ProcessDefinitionDeployer deployer)
        {
            try
            {
                IDeploymentBuilder deployment = this.repositoryService
                                                .CreateDeployment()
                                                .DisableDuplicateStartForm();

                deployment.DisableBpmnValidation();
                deployment.DisableSchemaValidation();
                deployment.EnableDuplicateFiltering();

                string resourceName = deployer.Name.EndsWith("bpmn", StringComparison.OrdinalIgnoreCase) ? deployer.Name : $"{deployer.Name}.bpmn";

                IDeployment dep = deployment.Name(deployer.Name)
                                  .Category(deployer.Category)
                                  .Key(deployer.Key)
                                  .TenantId(deployer.TenantId)
                                  .BusinessKey(deployer.BusinessKey)
                                  .BusinessPath(deployer.BusinessPath)
                                  .StartForm(deployer.StartForm, deployer.BpmnXML)
                                  .AddString(resourceName, deployer.BpmnXML)
                                  .Save();

                return(Task.FromResult <Deployment>(deploymentConverter.From(dep)));
            }
            catch (StartFormUniqueException ex)
            {
                throw new Http400Exception(new Http400
                {
                    Code    = "startFormUniqueException",
                    Message = ex.Message
                }, ex);
            }
        }
Example #6
0
        public void 执行事务子流程(string bpmnFile)
        {
            string xml = IntegrationTestContext.ReadBpmn(bpmnFile);

            ICommandExecutor commandExecutor = (processEngine.ProcessEngineConfiguration as ProcessEngineConfigurationImpl).CommandExecutor;

            Authentication.AuthenticatedUser = new InProcessWorkflowEngine.TestUser()
            {
                Id       = "评审员",
                FullName = "评审员",
                TenantId = context.TenantId
            };

            IDeploymentBuilder builder = processEngine.RepositoryService.CreateDeployment()
                                         .Name(Path.GetFileNameWithoutExtension(bpmnFile))
                                         .TenantId(context.TenantId)
                                         .AddString(bpmnFile, xml)
                                         .EnableDuplicateFiltering()
                                         .TenantId(context.TenantId);

            IDeployment deploy = commandExecutor.Execute(new DeployCmd(builder));

            IProcessDefinition definition = processEngine.RepositoryService.CreateProcessDefinitionQuery()
                                            .SetDeploymentId(deploy.Id)
                                            .SetProcessDefinitionTenantId(context.TenantId)
                                            .SetLatestVersion()
                                            .SingleResult();

            IProcessInstance processInstance = commandExecutor.Execute(new StartProcessInstanceCmd(definition.Id, null));

            IList <ITask> tasks = processEngine.TaskService.GetMyTasks("评审员");

            commandExecutor.Execute(new CompleteTaskCmd(tasks[0].Id, null));
        }
Example #7
0
        public virtual IDeploymentWithDefinitions Deploy(IDeploymentBuilder deploymentBuilder)
        {
            IDeploymentWithDefinitions deployment = deploymentBuilder.DeployWithResult();

            engineRule.ManageDeployment(deployment);

            return(deployment);
        }
        public void 获取已完成流程节点(string bpmnFile)
        {
            string xml = IntegrationTestContext.ReadBpmn(bpmnFile);

            ICommandExecutor commandExecutor = (processEngine.ProcessEngineConfiguration as ProcessEngineConfigurationImpl).CommandExecutor;

            Authentication.AuthenticatedUser = new InProcessWorkflowEngine.TestUser()
            {
                Id       = "评审员",
                FullName = "评审员",
                TenantId = context.TenantId
            };

            IDeploymentBuilder builder = processEngine.RepositoryService.CreateDeployment()
                                         .Name(Path.GetFileNameWithoutExtension(bpmnFile))
                                         .TenantId(context.TenantId)
                                         .AddString(bpmnFile, xml)
                                         .EnableDuplicateFiltering()
                                         .TenantId(context.TenantId);

            IDeployment deploy = commandExecutor.Execute(new DeployCmd(builder));

            IProcessDefinition definition = processEngine.RepositoryService.CreateProcessDefinitionQuery()
                                            .SetDeploymentId(deploy.Id)
                                            .SetProcessDefinitionTenantId(context.TenantId)
                                            .SetLatestVersion()
                                            .SingleResult();

            BpmnModel model = commandExecutor.Execute(new GetBpmnModelCmd(definition.Id));

            IProcessInstance processInstance = commandExecutor.Execute(new StartProcessInstanceCmd(definition.Id, null));

            IList <ITask> tasks = processEngine.TaskService.GetMyTasks("用户1");

            ITaskEntity      task      = tasks[0] as ITaskEntity;
            IExecutionEntity execution = commandExecutor.Execute(new GetExecutionByIdCmd(task.ExecutionId));

            processEngine.TaskService.Complete(task.Id, new Dictionary <string, object>
            {
                { "流程变量", "变量值" }
            });

            var list = commandExecutor.Execute(new GetCompletedTaskModelsCmd(task.ProcessInstanceId, true));

            Assert.Contains(model.MainProcess.FlowElements, x => list.Any(y => x.Id == y.Id));

            tasks = processEngine.TaskService.GetMyTasks("用户2");
            task  = tasks[0] as ITaskEntity;
            processEngine.TaskService.Complete(task.Id, new Dictionary <string, object>
            {
                { "流程变量", "变量值" }
            });

            list = commandExecutor.Execute(new GetCompletedTaskModelsCmd(task.ProcessInstanceId, true));

            Assert.Contains(model.MainProcess.FlowElements, x => list.Any(y => x.Id == y.Id));
        }
        protected internal virtual string Deployment(IDeploymentBuilder deploymentBuilder, params string[] resources)
        {
            for (var i = 0; i < resources.Length; i++)
            {
                deploymentBuilder.AddClasspathResource(resources[i]);
            }

            return(DeploymentWithBuilder(deploymentBuilder));
        }
        public void setUp()
        {
            IDeploymentBuilder deploymentbuilder = repositoryService.CreateDeployment();
            IBpmnModelInstance defaultModel      = DefaultExternalTaskModelBuilder.CreateDefaultExternalTaskModel().Build();
            IBpmnModelInstance modifiedModel     = DefaultExternalTaskModelBuilder.CreateDefaultExternalTaskModel().ProcessKey(ANOTHER_PROCESS_KEY).Build();

            deploymentId = Deployment(deploymentbuilder, defaultModel, modifiedModel);

            base.setUp();
        }
        protected internal virtual string Deployment(IDeploymentBuilder deploymentBuilder,
                                                     params IBpmnModelInstance[] bpmnModelInstances)
        {
            for (var i = 0; i < bpmnModelInstances.Length; i++)
            {
                var bpmnModelInstance = bpmnModelInstances[i];
                deploymentBuilder.AddModelInstance("testProcess-" + i + ".bpmn", bpmnModelInstance);
            }

            return(DeploymentWithBuilder(deploymentBuilder));
        }
        protected internal virtual IDeployment deploy(IList <IBpmnModelInstance> modelInstances)
        {
            IDeploymentBuilder deploymentbuilder = processEngineConfiguration.RepositoryService.CreateDeployment();

            for (int i = 0; i < modelInstances.Count; i++)
            {
                deploymentbuilder.AddModelInstance("process" + i + ".bpmn", modelInstances[i]);
            }

            return(testRule.Deploy(deploymentbuilder));
        }
Example #13
0
        public Task <Deployment> Deploy([FromBody] ProcessDefinitionDeployer deployer)
        {
            try
            {
                IDeploymentBuilder deployment = this.repositoryService.CreateDeployment();

                if (deployer.DisableSchemaValidation)
                {
                    deployment.DisableSchemaValidation();
                }

                if (deployer.EnableDuplicateFiltering)
                {
                    deployment.EnableDuplicateFiltering();
                }

                string resourceName = deployer.Name.EndsWith("bpmn", StringComparison.OrdinalIgnoreCase) ? deployer.Name : $"{deployer.Name}.bpmn";

                IDeployment dep = deployment.Name(deployer.Name)
                                  .Category(deployer.Category)
                                  .Key(deployer.Key)
                                  .TenantId(deployer.TenantId)
                                  .BusinessKey(deployer.BusinessKey)
                                  .BusinessPath(deployer.BusinessPath)
                                  .StartForm(deployer.StartForm, deployer.BpmnXML)
                                  .AddString(resourceName, deployer.BpmnXML)
                                  .Deploy();

                return(Task.FromResult(deploymentConverter.From(dep)));
            }
            catch (ActivitiValidationException ex)
            {
                var http400 = new Http400()
                {
                    Code    = "activitiValidationException",
                    Message = "流程定义验证失败",
                    Target  = this.GetType().Name,
                };

                http400.Details = new List <HttpException>();
                foreach (var err in ex.ValidationErrors ?? new List <ValidationError>())
                {
                    http400.Details.Add(new Http400
                    {
                        Code        = "activitiValidationException",
                        OriginError = err,
                        Message     = err.ToString()
                    });
                }

                throw new Http400Exception(http400, ex);
            }
        }
Example #14
0
        public virtual void testParseExternalTaskWithoutTopic()
        {
            IDeploymentBuilder deploymentBuilder = repositoryService.CreateDeployment().AddClasspathResource("resources/bpmn/external/ExternalTaskParseTest.TestParseExternalTaskWithoutTopic.bpmn20.xml");

            try
            {
                deploymentBuilder.Deploy();
                Assert.Fail("exception expected");
            }
            catch (ProcessEngineException e)
            {
                AssertTextPresent("External tasks must specify a 'topic' attribute in the camunda namespace", e.Message);
            }
        }
Example #15
0
        protected internal virtual IDeploymentWithDefinitions Deploy(IDeploymentBuilder deploymentBuilder, IList <IBpmnModelInstance> bpmnModelInstances, IList <string> resources)
        {
            int i = 0;

            foreach (IBpmnModelInstance bpmnModelInstance in bpmnModelInstances)
            {
                deploymentBuilder.AddModelInstance(i + "_" + DefaultBpmnResourceName, bpmnModelInstance);
                i++;
            }

            foreach (string resource in resources)
            {
                deploymentBuilder.AddClasspathResource(resource);
            }

            return(Deploy(deploymentBuilder));
        }
        public void 读取信号边界事件处理(string bpmnFile)
        {
            string xml = IntegrationTestContext.ReadBpmn(bpmnFile);

            ICommandExecutor commandExecutor = (processEngine.ProcessEngineConfiguration as ProcessEngineConfigurationImpl).CommandExecutor;

            Authentication.AuthenticatedUser = new InProcessWorkflowEngine.TestUser()
            {
                Id       = "评审员",
                FullName = "评审员",
                TenantId = context.TenantId
            };

            IDeploymentBuilder builder = processEngine.RepositoryService.CreateDeployment()
                                         .Name(Path.GetFileNameWithoutExtension(bpmnFile))
                                         .TenantId(context.TenantId)
                                         .AddString(bpmnFile, xml)
                                         .EnableDuplicateFiltering()
                                         .TenantId(context.TenantId);

            IDeployment deploy = commandExecutor.Execute(new DeployCmd(builder));

            IProcessDefinition definition = processEngine.RepositoryService.CreateProcessDefinitionQuery()
                                            .SetDeploymentId(deploy.Id)
                                            .SetProcessDefinitionTenantId(context.TenantId)
                                            .SetLatestVersion()
                                            .SingleResult();

            IProcessInstance processInstance = commandExecutor.Execute(new StartProcessInstanceCmd(definition.Id, null));

            IList <ITask> tasks = processEngine.TaskService.GetMyTasks("用户1");

            ITaskEntity      task      = tasks[0] as ITaskEntity;
            IExecutionEntity execution = commandExecutor.Execute(new GetExecutionByIdCmd(task.ExecutionId));

            //Process process = (processEngine.ProcessEngineConfiguration as ProcessEngineConfigurationImpl).DeploymentManager.ResolveProcessDefinition(definition).Process;
            //FlowElement activity = process.GetFlowElement(execution.CurrentActivityId, true);
            //string taskName = task.Name;

            //commandExecutor.Execute(new TerminateTaskCmd(task.Id, "测试终止", true));

            processEngine.TaskService.Complete(task.Id, new Dictionary <string, object>
            {
                { "流程变量", "变量值" }
            });

            tasks = processEngine.TaskService.GetMyTasks("用户2");
            task  = tasks[0] as ITaskEntity;
            processEngine.TaskService.Complete(task.Id, new Dictionary <string, object>
            {
                { "流程变量", "变量值" }
            });

            var list = commandExecutor.Execute(new GetCompletedTaskModelsCmd(task.ProcessInstanceId, true));

            //commandExecutor.Execute(new ReturnToActivityCmd(task.Id, execution.CurrentActivityId, "回退到", null));

            //task = tasks[0] as ITaskEntity;
            //execution = commandExecutor.Execute(new GetExecutionByIdCmd(task.ExecutionId));

            //commandExecutor.Execute(new TerminateProcessInstanceCmd(processInstance.Id, "流程已被取消", null));

            //IProcessInstance activityInstance = (processEngine.ProcessEngineConfiguration as ProcessEngineConfigurationImpl).CommandExecutor.Execute(new StartProcessInstanceByActivityCmd(definition.Id, execution.BusinessKey, activity.Id, null, execution.TenantId, null, true, execution.Name));

            //try
            //{
            //    //var events = processEngine.RuntimeService.CreateExecutionQuery()
            //    //    .SetParentId(tasks[0].ExecutionId)
            //    //    .SignalEventSubscriptionName("自动回退")
            //    //    .List();

            //    int count = 0;
            //    while (count < 3)
            //    {
            //        processEngine.ManagementService.ExecuteCommand(new SignalEventReceivedCmd("自动回退", null, false, context.TenantId));
            //        count += 1;
            //    }
            //}
            //catch { }
        }
Example #17
0
 public DeployCmd(IDeploymentBuilder deploymentBuilder)
 {
     this.deploymentBuilder = deploymentBuilder;
 }
 public ControllableDeployCommand(IDeploymentBuilder deploymentBuilder)
 {
     this.deploymentBuilder = deploymentBuilder;
 }
        public void 回退到任务已完成节点(string bpmnFile)
        {
            string xml = IntegrationTestContext.ReadBpmn(bpmnFile);

            ICommandExecutor commandExecutor = (processEngine.ProcessEngineConfiguration as ProcessEngineConfigurationImpl).CommandExecutor;

            Authentication.AuthenticatedUser = new InProcessWorkflowEngine.TestUser()
            {
                Id       = "评审员",
                FullName = "评审员",
                TenantId = context.TenantId
            };

            IDeploymentBuilder builder = processEngine.RepositoryService.CreateDeployment()
                                         .Name(Path.GetFileNameWithoutExtension(bpmnFile))
                                         .TenantId(context.TenantId)
                                         .AddString(bpmnFile, xml)
                                         .EnableDuplicateFiltering()
                                         .TenantId(context.TenantId);

            IDeployment deploy = commandExecutor.Execute(new DeployCmd(builder));

            IProcessDefinition definition = processEngine.RepositoryService.CreateProcessDefinitionQuery()
                                            .SetDeploymentId(deploy.Id)
                                            .SetProcessDefinitionTenantId(context.TenantId)
                                            .SetLatestVersion()
                                            .SingleResult();

            IProcessInstance processInstance = commandExecutor.Execute(new StartProcessInstanceCmd(definition.Id, null));

            try
            {
                IList <ITask> tasks = processEngine.TaskService.GetMyTasks("节点1");

                ITaskEntity      task      = tasks[0] as ITaskEntity;
                IExecutionEntity execution = commandExecutor.Execute(new GetExecutionByIdCmd(task.ExecutionId));

                processEngine.TaskService.Complete(task.Id, new Dictionary <string, object>
                {
                    { "流程变量", "变量值" }
                });

                tasks = processEngine.TaskService.GetMyTasks("节点2");
                task  = tasks[0] as ITaskEntity;
                processEngine.TaskService.Complete(task.Id, new Dictionary <string, object>
                {
                    { "流程变量", "变量值" }
                });

                var list = commandExecutor.Execute(new GetCompletedTaskModelsCmd(task.ProcessInstanceId, true));

                tasks = processEngine.TaskService.GetMyTasks("节点3");
                task  = tasks[0] as ITaskEntity;

                commandExecutor.Execute(new ReturnToActivityCmd(task.Id, list[0].Id, $"回退测试到{list[0].Name}"));
            }
            catch
            {
            }

            System.Diagnostics.Debugger.Break();
        }
Example #20
0
 public virtual void CreateDeployment(string processArchiveName, IDeploymentBuilder deploymentBuilder)
 {
     // default implementation does nothing
 }