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);
        }
        public override void OnEvent(IActivitiEvent @event)
        {
            if (IsValidEvent(@event))
            {
                if (@event.ProcessInstanceId is null)
                {
                    throw new ActivitiIllegalArgumentException("Cannot throw process-instance scoped message, since the dispatched event is not part of an ongoing process instance");
                }

                IEventSubscriptionEntityManager         eventSubscriptionEntityManager = Context.CommandContext.EventSubscriptionEntityManager;
                IList <IMessageEventSubscriptionEntity> subscriptionEntities           = eventSubscriptionEntityManager.FindMessageEventSubscriptionsByProcessInstanceAndEventName(@event.ProcessInstanceId, messageName);

                foreach (IEventSubscriptionEntity messageEventSubscriptionEntity in subscriptionEntities)
                {
                    eventSubscriptionEntityManager.EventReceived(messageEventSubscriptionEntity, null, false);
                }
            }
        }