///<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); }
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); }
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); }