///<inheritdoc />
        public virtual IProcessInstance Execute(ICommandContext commandContext)
        {
            if (messageName is null)
            {
                throw new ActivitiIllegalArgumentException("Cannot start process instance by message: message name is null");
            }

            IMessageEventSubscriptionEntity messageEventSubscription = commandContext.EventSubscriptionEntityManager.FindMessageStartEventSubscriptionByName(messageName, tenantId);

            if (messageEventSubscription == null)
            {
                throw new ActivitiObjectNotFoundException("Cannot start process instance by message: no subscription to message with name '" + messageName + "' found.", typeof(IMessageEventSubscriptionEntity));
            }

            string processDefinitionId = messageEventSubscription.Configuration;

            if (string.IsNullOrWhiteSpace(processDefinitionId))
            {
                throw new ActivitiException("Cannot start process instance by message: subscription to message with name '" + messageName + "' is not a message start event.");
            }

            DeploymentManager deploymentCache = commandContext.ProcessEngineConfiguration.DeploymentManager;

            IProcessDefinition processDefinition = deploymentCache.FindDeployedProcessDefinitionById(processDefinitionId);

            if (processDefinition == null)
            {
                throw new ActivitiObjectNotFoundException("No process definition found for id '" + processDefinitionId + "'", typeof(IProcessDefinition));
            }

            ProcessInstanceHelper processInstanceHelper = commandContext.ProcessEngineConfiguration.ProcessInstanceHelper;
            IProcessInstance      processInstance       = processInstanceHelper.CreateAndStartProcessInstanceByMessage(processDefinition, messageName, processVariables, transientVariables);

            return(processInstance);
        }
        public virtual IMessageEventSubscriptionEntity FindMessageStartEventSubscriptionByName(string messageName, string tenantId)
        {
            IDictionary <string, string> @params = new Dictionary <string, string>
            {
                ["eventName"] = messageName,
                ["tenantId"]  = tenantId
            };

            IMessageEventSubscriptionEntity entity = DbSqlSession.SelectOne <MessageEventSubscriptionEntityImpl, IMessageEventSubscriptionEntity>("selectMessageStartEventSubscriptionByName", @params);

            return(entity);
        }
        public virtual IMessageEventSubscriptionEntity InsertMessageEvent(string messageName, IExecutionEntity execution)
        {
            IMessageEventSubscriptionEntity subscriptionEntity = CreateMessageEventSubscription();

            subscriptionEntity.Execution = execution;
            subscriptionEntity.EventName = messageName;

            subscriptionEntity.ActivityId          = execution.CurrentActivityId;
            subscriptionEntity.ProcessDefinitionId = execution.ProcessDefinitionId;
            if (!(execution.TenantId is null))
            {
                subscriptionEntity.TenantId = execution.TenantId;
            }
            Insert(subscriptionEntity);
            execution.EventSubscriptions.Add(subscriptionEntity);
            return(subscriptionEntity);
        }
Ejemplo n.º 4
0
        protected internal virtual void InsertMessageEvent(MessageEventDefinition messageEventDefinition, StartEvent startEvent, IProcessDefinitionEntity processDefinition, BpmnModel bpmnModel)
        {
            ICommandContext commandContext = Context.CommandContext;

            if (bpmnModel.ContainsMessageId(messageEventDefinition.MessageRef))
            {
                Message message = bpmnModel.GetMessage(messageEventDefinition.MessageRef);
                messageEventDefinition.MessageRef = message.Name;
            }

            // look for subscriptions for the same name in db:
            IList <IEventSubscriptionEntity> subscriptionsForSameMessageName = commandContext.EventSubscriptionEntityManager.FindEventSubscriptionsByName(MessageEventHandler.EVENT_HANDLER_TYPE, messageEventDefinition.MessageRef, processDefinition.TenantId);

            foreach (IEventSubscriptionEntity eventSubscriptionEntity in subscriptionsForSameMessageName)
            {
                // throw exception only if there's already a subscription as start event
                if (eventSubscriptionEntity.ProcessInstanceId is null || eventSubscriptionEntity.ProcessInstanceId.Length == 0)
                {
                    // processInstanceId != null or not empty -> it's a message related to an execution
                    // the event subscription has no instance-id, so it's a message start event
                    throw new ActivitiException("Cannot deploy process definition '" + processDefinition.ResourceName + "': there already is a message event subscription for the message with name '" + messageEventDefinition.MessageRef + "'.");
                }
            }

            IMessageEventSubscriptionEntity newSubscription = commandContext.EventSubscriptionEntityManager.CreateMessageEventSubscription();

            newSubscription.EventName           = messageEventDefinition.MessageRef;
            newSubscription.ActivityId          = startEvent.Id;
            newSubscription.Configuration       = processDefinition.Id;
            newSubscription.ProcessDefinitionId = processDefinition.Id;

            if (processDefinition.TenantId is object)
            {
                newSubscription.TenantId = processDefinition.TenantId;
            }

            commandContext.EventSubscriptionEntityManager.Insert(newSubscription);
        }
Ejemplo n.º 5
0
        protected internal virtual void restoreMessageStartEvent(IProcessDefinition previousProcessDefinition, BpmnModel bpmnModel, StartEvent startEvent, EventDefinition eventDefinition)
        {
            MessageEventDefinition messageEventDefinition = (MessageEventDefinition)eventDefinition;

            if (bpmnModel.ContainsMessageId(messageEventDefinition.MessageRef))
            {
                Message message = bpmnModel.GetMessage(messageEventDefinition.MessageRef);
                messageEventDefinition.MessageRef = message.Name;
            }

            IMessageEventSubscriptionEntity newSubscription = EventSubscriptionEntityManager.CreateMessageEventSubscription();

            newSubscription.EventName           = messageEventDefinition.MessageRef;
            newSubscription.ActivityId          = startEvent.Id;
            newSubscription.Configuration       = previousProcessDefinition.Id;
            newSubscription.ProcessDefinitionId = previousProcessDefinition.Id;

            if (!ReferenceEquals(previousProcessDefinition.TenantId, null))
            {
                newSubscription.TenantId = previousProcessDefinition.TenantId;
            }

            EventSubscriptionEntityManager.Insert(newSubscription);
        }