Beispiel #1
0
        public async Task Simple01_Cyclic_DetectCycleOfThreeStatesWithBothStores(bool mockWorkflowStore)
        {
            var workflowEngineBuildResult = BuildWorkflowEngine(mockWorkflowStore, false, new NoOpActivity(), new NoOpEventHandler());

            var packageJsonState = new JsonState();

            packageJsonState.SetProperty("IsSent", false);

            IEventRequestWorkflowMessage initialEventWorkflowMessage = new EventRequestWorkflowMessage(
                WorkflowPackageCyclic02Id, Package01.GetType().FullName, Package01.EntityId, "initial", packageJsonState.ToJsonString());
            var workflowProcessingResult = await workflowEngineBuildResult.WorkflowEngine.ProcessMessage(initialEventWorkflowMessage);

            var package01WorkflowInstance = workflowEngineBuildResult.GetWorkflowInstance(Package01);

            Assert.IsTrue(string.Equals(package01WorkflowInstance.CurrentStateCode, "process.03", StringComparison.OrdinalIgnoreCase));
            Assert.IsTrue(package01WorkflowInstance.CurrentStateProgress == StateExecutionProgress.AwaitingEvent);
            Assert.IsTrue(workflowProcessingResult.WorkflowInstance.Entity.GetProperty <bool>("IsSent"));

            IEventRequestWorkflowMessage processEventWorkflowMessage = new EventRequestWorkflowMessage(
                WorkflowPackageCyclic02Id, workflowProcessingResult.WorkflowInstance.Id, "process", packageJsonState.ToJsonString());

            workflowProcessingResult = await workflowEngineBuildResult.WorkflowEngine.ProcessMessage(processEventWorkflowMessage);

            package01WorkflowInstance = workflowEngineBuildResult.GetWorkflowInstance(Package01);
            Assert.IsTrue(string.Equals(package01WorkflowInstance.CurrentStateCode, "process.03", StringComparison.OrdinalIgnoreCase));
            Assert.IsTrue(package01WorkflowInstance.CurrentStateProgress == StateExecutionProgress.AwaitingEvent);

            processEventWorkflowMessage = new EventRequestWorkflowMessage(
                WorkflowPackageCyclic02Id, workflowProcessingResult.WorkflowInstance.Id, "process", packageJsonState.ToJsonString());
            workflowProcessingResult = await workflowEngineBuildResult.WorkflowEngine.ProcessMessage(processEventWorkflowMessage);

            package01WorkflowInstance = workflowEngineBuildResult.GetWorkflowInstance(Package01);
            Assert.IsTrue(string.Equals(package01WorkflowInstance.CurrentStateCode, "failed", StringComparison.OrdinalIgnoreCase));
            Assert.IsTrue(package01WorkflowInstance.CurrentStateProgress == StateExecutionProgress.Completed);
        }
Beispiel #2
0
        public async Task Simple01_Lock_FailedToTakeTheLock()
        {
            var workflowEngineBuildResult02 = BuildWorkflowEngine(true, false, new NoOpActivity(), new NoOpEventHandler());
            var workflowEngineBuildResult01 = BuildWorkflowEngine(true, false, new NoOpActivity(), new NoOpEventHandler());

            var packageJsonState = new JsonState();

            packageJsonState.SetProperty("IsSent", false);

            IEventRequestWorkflowMessage initialEventWorkflowMessage = new EventRequestWorkflowMessage(
                WorkflowPackage01Id, Package01.GetType().FullName, Package01.EntityId, "initial", packageJsonState.ToJsonString());
            var workflowProcessingResult = await workflowEngineBuildResult01.WorkflowEngine.ProcessMessage(initialEventWorkflowMessage);

            var package01WorkflowInstance = workflowEngineBuildResult01.GetWorkflowInstance(Package01);

            Assert.IsTrue(string.Equals(package01WorkflowInstance.CurrentStateCode, "process", StringComparison.OrdinalIgnoreCase));
            Assert.IsTrue(package01WorkflowInstance.CurrentStateProgress == StateExecutionProgress.AwaitingEvent);
            Assert.IsTrue(workflowProcessingResult.WorkflowInstance.Entity.GetProperty <bool>("IsSent"));
            Assert.IsTrue(package01WorkflowInstance.Lock.LockOwner == workflowEngineBuildResult01.WorkflowEngine.Id);
            WorkflowStoreMock.Verify(m => m.TryLockWorkflowInstance(It.IsAny <Guid>(), It.IsAny <Guid>(), It.IsAny <DateTime>(), It.IsAny <DateTime>(), It.IsAny <CancellationToken>()), Times.Never);
            WorkflowStoreMock.Verify(m => m.TryUnlockWorkflowInstance(It.IsAny <Guid>(), It.IsAny <Guid>(), It.IsAny <DateTime>(), It.IsAny <CancellationToken>()), Times.Once);

            IEventRequestWorkflowMessage processEventWorkflowMessage = new EventRequestWorkflowMessage(
                WorkflowPackage01Id, workflowProcessingResult.WorkflowInstance.Id, "process", "{}");

            Assert.ThrowsAsync <WorkflowException>(() => workflowEngineBuildResult02.WorkflowEngine.ProcessMessage(processEventWorkflowMessage));
        }
Beispiel #3
0
        public async Task Simple01_HappyPath_MovedToFinalOnEventWorkflowMessages()
        {
            var workflowEngineBuildResult = BuildWorkflowEngine(true, false, new NoOpActivity(), new NoOpEventHandler());

            var packageJsonState = new JsonState();

            packageJsonState.SetProperty("IsSent", false);

            IEventRequestWorkflowMessage initialEventWorkflowMessage = new EventRequestWorkflowMessage(
                WorkflowPackage01Id, Package01.GetType().FullName, Package01.EntityId, "initial", packageJsonState.ToJsonString());
            var workflowProcessingResult = await workflowEngineBuildResult.WorkflowEngine.ProcessMessage(initialEventWorkflowMessage);

            var package01WorkflowInstance = workflowEngineBuildResult.GetWorkflowInstance(Package01);

            Assert.IsTrue(string.Equals(package01WorkflowInstance.CurrentStateCode, "process", StringComparison.OrdinalIgnoreCase));
            Assert.IsTrue(package01WorkflowInstance.CurrentStateProgress == StateExecutionProgress.AwaitingEvent);
            Assert.IsTrue(workflowProcessingResult.WorkflowInstance.Entity.GetProperty <bool>("IsSent"));

            IEventRequestWorkflowMessage processEventWorkflowMessage = new EventRequestWorkflowMessage(
                WorkflowPackage01Id, workflowProcessingResult.WorkflowInstance.Id, "process", "{}");

            workflowProcessingResult = await workflowEngineBuildResult.WorkflowEngine.ProcessMessage(processEventWorkflowMessage);

            package01WorkflowInstance = workflowEngineBuildResult.GetWorkflowInstance(Package01);
            Assert.IsTrue(string.Equals(package01WorkflowInstance.CurrentStateCode, "final", StringComparison.OrdinalIgnoreCase));
            Assert.IsTrue(package01WorkflowInstance.CurrentStateProgress == StateExecutionProgress.Completed);
            Assert.IsTrue(workflowProcessingResult.WorkflowInstance.Entity.GetProperty <bool>("IsSent"));
        }
        public async Task <EventExecutionResult> Execute(EventExecutionContext eventExecutionContext, CancellationToken cancellationToken = default)
        {
            var remoteCode           = Code.GetRemoteCode();
            var remoteExecutionState = eventExecutionContext.WorkflowContext.CreateRemoteExecutionState(
                eventExecutionContext.EventConfiguration.Parameters, remoteCode);
            var eventRequestWorkflowMessage = new EventRequestWorkflowMessage(eventExecutionContext.WorkflowContext.WorkflowConfiguration.Id,
                                                                              eventExecutionContext.WorkflowContext.WorkflowInstance.Id, remoteCode, remoteExecutionState);

            var workflowConfiguration = eventExecutionContext.WorkflowContext.WorkflowConfiguration;
            var endpointConfiguration = workflowConfiguration.FindEndpointConfiguration(Code);

            Log.Verbose("Sending event request message [{code}::{messageId}] to {endpoint} [{workflowInstanceId}]",
                        Code, eventRequestWorkflowMessage.WorkflowMessageId, endpointConfiguration.Address,
                        eventExecutionContext.WorkflowContext.WorkflowInstance.Id);

            var messageTransport = eventExecutionContext.WorkflowContext
                                   .WorkflowMessageTransportFactoryProvider.CreateMessageTransportFactory(endpointConfiguration.Type)
                                   .CreateMessageTransport(endpointConfiguration.Address);
            var responseWorkflowMessage = await messageTransport.Request <IEventRequestWorkflowMessage, IEventResponseWorkflowMessage>(
                endpointConfiguration, eventRequestWorkflowMessage, cancellationToken).ConfigureAwait(false);

            Log.Verbose("Received event response message [{messageId}] from {endpoint} [{workflowInstanceId}]",
                        eventRequestWorkflowMessage.WorkflowMessageId, endpointConfiguration.Address,
                        eventExecutionContext.WorkflowContext.WorkflowInstance.Id);

            // merge state changes made by remote event handler during execution
            eventExecutionContext.WorkflowContext.MergeRemoteExecutionState(responseWorkflowMessage.State);
            return(responseWorkflowMessage.EventExecutionResult);
        }
Beispiel #5
0
        public async Task Execute(ICommandContext commandContext, CancellationToken cancellationToken)
        {
            var workflowCommandContext   = (PackageV01WorkflowCommandContext)commandContext;
            var packageV01WorkflowRunner = (PackageV01WorkflowRunner)commandContext.RunnerContext.Runner;

            var jsonState = new JsonState();

            jsonState.SetProperty("IsSent", false);

            IEventRequestWorkflowMessage initialEventWorkflowMessage = new EventRequestWorkflowMessage(
                packageV01WorkflowRunner.WorkflowId, packageV01WorkflowRunner.EntityType, "1", "initial", jsonState.ToJsonString());
            var workflowMessage = await workflowCommandContext.WorkflowMessageTransport.Request <IEventRequestWorkflowMessage, IEventResponseWorkflowMessage>(
                packageV01WorkflowRunner.EndpointConfiguration, initialEventWorkflowMessage, cancellationToken).ConfigureAwait(false);

            System.Console.WriteLine(string.Format(CultureInfo.InvariantCulture,
                                                   "Command [{0}] has been executed [{1}], state [{2}], received workflow ID=[{3:D}]",
                                                   Name, workflowMessage.EventExecutionResult.Status, workflowMessage.State.JsonState, workflowMessage.WorkflowInstanceId.GetValueOrDefault()));
            workflowCommandContext.WorkflowInstanceId = workflowMessage.WorkflowInstanceId.GetValueOrDefault();
        }