public override void Execute(IExecutionEntity execution)
        {
            ICommandContext commandContext = Context.CommandContext;

            string eventSubscriptionName;

            if (messageEventName is object)
            {
                eventSubscriptionName = messageEventName;
            }
            else
            {
                IExpression expressionObject = commandContext.ProcessEngineConfiguration.ExpressionManager.CreateExpression(messageExpression);
                eventSubscriptionName = expressionObject.GetValue(execution).ToString();
            }

            IEventSubscriptionEntityManager         eventSubscriptionEntityManager = commandContext.EventSubscriptionEntityManager;
            IList <IMessageEventSubscriptionEntity> subscriptionEntities           = eventSubscriptionEntityManager.FindMessageEventSubscriptionsByProcessInstanceAndEventName(execution.ProcessInstanceId, eventSubscriptionName);

            foreach (IMessageEventSubscriptionEntity messageEventSubscriptionEntity in subscriptionEntities)
            {
                Context.ProcessEngineConfiguration.EventDispatcher.DispatchEvent(ActivitiEventBuilder.CreateMessageEvent(ActivitiEventType.ACTIVITY_MESSAGE_RECEIVED, messageEventSubscriptionEntity.ActivityId, eventSubscriptionName, null, messageEventSubscriptionEntity.ExecutionId, messageEventSubscriptionEntity.ProcessInstanceId, messageEventSubscriptionEntity.ProcessDefinitionId));

                eventSubscriptionEntityManager.EventReceived(messageEventSubscriptionEntity, null, false);
            }

            Context.Agenda.PlanTakeOutgoingSequenceFlowsOperation(execution, true);
        }
Ejemplo n.º 2
0
        public virtual void StartProcessInstance(IExecutionEntity processInstance, ICommandContext commandContext, IDictionary <string, object> variables)
        {
            Process process = ProcessDefinitionUtil.GetProcess(processInstance.ProcessDefinitionId);


            // Event sub process handling
            IList <IMessageEventSubscriptionEntity> messageEventSubscriptions = new List <IMessageEventSubscriptionEntity>();

            foreach (FlowElement flowElement in process.FlowElements)
            {
                if (flowElement is EventSubProcess eventSubProcess)
                {
                    foreach (FlowElement subElement in eventSubProcess.FlowElements)
                    {
                        if (subElement is StartEvent startEvent)
                        {
                            if (CollectionUtil.IsNotEmpty(startEvent.EventDefinitions))
                            {
                                EventDefinition eventDefinition = startEvent.EventDefinitions[0];
                                if (eventDefinition is MessageEventDefinition messageEventDefinition)
                                {
                                    BpmnModel bpmnModel = ProcessDefinitionUtil.GetBpmnModel(processInstance.ProcessDefinitionId);
                                    if (bpmnModel.ContainsMessageId(messageEventDefinition.MessageRef))
                                    {
                                        messageEventDefinition.MessageRef = bpmnModel.GetMessage(messageEventDefinition.MessageRef).Name;
                                    }
                                    IExecutionEntity messageExecution = commandContext.ExecutionEntityManager.CreateChildExecution(processInstance);
                                    messageExecution.CurrentFlowElement = startEvent;
                                    messageExecution.IsEventScope       = true;
                                    messageEventSubscriptions.Add(commandContext.EventSubscriptionEntityManager.InsertMessageEvent(messageEventDefinition.MessageRef, messageExecution));
                                }
                            }
                        }
                    }
                }
            }

            IExecutionEntity execution = processInstance.Executions[0]; // There will always be one child execution created

            commandContext.Agenda.PlanContinueProcessOperation(execution);

            if (Context.ProcessEngineConfiguration.EventDispatcher.Enabled)
            {
                IActivitiEventDispatcher eventDispatcher = Context.ProcessEngineConfiguration.EventDispatcher;
                eventDispatcher.DispatchEvent(ActivitiEventBuilder.CreateProcessStartedEvent(execution, variables, false));

                foreach (IMessageEventSubscriptionEntity messageEventSubscription in messageEventSubscriptions)
                {
                    commandContext.ProcessEngineConfiguration.EventDispatcher.DispatchEvent(ActivitiEventBuilder.CreateMessageEvent(ActivitiEventType.ACTIVITY_MESSAGE_WAITING, messageEventSubscription.ActivityId, messageEventSubscription.EventName, null, messageEventSubscription.Execution.Id, messageEventSubscription.ProcessInstanceId, messageEventSubscription.ProcessDefinitionId));
                }
            }
        }
Ejemplo n.º 3
0
        public override void Execute(IExecutionEntity execution)
        {
            ICommandContext commandContext = Context.CommandContext;

            string messageName;

            if (!string.IsNullOrWhiteSpace(messageEventDefinition.MessageRef))
            {
                messageName = messageEventDefinition.MessageRef;
            }
            else
            {
                IExpression messageExpression = commandContext.ProcessEngineConfiguration.ExpressionManager.CreateExpression(messageEventDefinition.MessageExpression);
                messageName = messageExpression.GetValue(execution).ToString();
            }

            commandContext.EventSubscriptionEntityManager.InsertMessageEvent(messageName, execution);

            if (commandContext.ProcessEngineConfiguration.EventDispatcher.Enabled)
            {
                commandContext.ProcessEngineConfiguration.EventDispatcher.DispatchEvent(ActivitiEventBuilder.CreateMessageEvent(ActivitiEventType.ACTIVITY_MESSAGE_WAITING, execution.ActivityId, messageName, null, execution.Id, execution.ProcessInstanceId, execution.ProcessDefinitionId));
            }
        }
Ejemplo n.º 4
0
        public override void HandleEvent(IEventSubscriptionEntity eventSubscription, object payload, ICommandContext commandContext)
        {
            // As stated in the ActivitiEventType java-doc, the message-event is
            // thrown before the actual message has been sent
            if (commandContext.ProcessEngineConfiguration.EventDispatcher.Enabled)
            {
                commandContext.ProcessEngineConfiguration.EventDispatcher.DispatchEvent(ActivitiEventBuilder.CreateMessageEvent(ActivitiEventType.ACTIVITY_MESSAGE_RECEIVED, eventSubscription.ActivityId, eventSubscription.EventName, payload, eventSubscription.ExecutionId, eventSubscription.ProcessInstanceId, eventSubscription.Execution.ProcessDefinitionId));
            }

            base.HandleEvent(eventSubscription, payload, commandContext);
        }