public void RunsTakeSagaWaitingForAction()
        {
            //Arrange
            var runner     = new Saga();
            var enumerator = runner.Run(this.RootSaga());

            //Act
            SagaAction returnData = null;

            runner.OnActionEvent += (data) =>
            {
                returnData = data;
            };

            for (var i = 0; i < 100; i++)
            {
                enumerator.MoveNext();
            }

            //Assert
            Assert.IsNull(returnData);

            runner.OnAction(new SagaAction <int>("start", 11));

            for (var i = 0; i < 100; i++)
            {
                enumerator.MoveNext();
            }

            //Assert
            Assert.AreEqual("test", returnData.Type);
            Assert.AreEqual(11, returnData.GetPayload <int>());
        }
Exemple #2
0
        private void OnAction(SagaAction action)
        {
            if (this.actionRef != null)
            {
                this.actionRef.Value = action;
            }

            resolved = true;
        }
 public void WriteToDB(string path, EntityType type)
 {
     using (var ctx = new StatisticContext())
     {
         var saga = new SagaAction()
         {
             SagaName = path, AddedDate = DateTime.Now, Type = type
         };
         ctx.Sagas.Add(saga);
         ctx.SaveChanges();
     }
 }
Exemple #4
0
        public void RunTryEffectWithNoFiredExceptionWithFinally()
        {
            //Arrange
            var runner = new Saga();

            //Act
            SagaAction returnData = null;

            runner.OnActionEvent += (data) =>
            {
                returnData = data;
            };

            this.RunSaga(runner, this.SimpleSagaWithFinally(false));

            //Assert
            Assert.AreEqual("finally", returnData.Type);
        }
Exemple #5
0
        public void RunThreadCallEffectFollowedByPutWithTheReturnValue()
        {
            //Arrange
            var runner = new Saga();

            //Act
            SagaAction returnData = null;

            runner.OnActionEvent += (data) =>
            {
                returnData = data;
            };

            this.RunSaga(runner, this.SimpleSaga());

            //Assert
            Assert.AreEqual(1, returnData.GetPayload <int>());
        }
Exemple #6
0
        private async Task UpdateState(
            SagaState sagaState,
            State initialState,
            State newState,
            SagaAction sagaActions)
        {
            sagaState.ExtendedData = JsonConvert.SerializeObject(newState.Value);
            await stateDAO.Update(sagaState);

            var sagaLog = new SagaStateLog
            {
                InitialState = JsonConvert.SerializeObject(initialState.Value),
                FinshedState = JsonConvert.SerializeObject(newState.Value),
                SagaId       = sagaState.SagaInfoId,
                ActionId     = sagaActions.Id
            };

            await actionLogStateDAO.Save(sagaLog);
        }
Exemple #7
0
        public void RunTryEffectWithFiredException()
        {
            //Arrange
            var runner = new Saga();

            //Act
            SagaAction returnData = null;

            runner.OnActionEvent += (data) =>
            {
                returnData = data;
            };

            this.RunSaga(runner, this.SimpleSaga(true));

            //Assert
            Assert.AreEqual("error", returnData.Type);
            Assert.IsNotNull(returnData.GetPayload <NotImplementedException>());
        }
        internal async Task UpdateToFail(SagaAction sagaAction)
        {
            using var context = _serviceProvider.GetRequiredService <SagaContext>();
            var actions = await context.Actions.Where(x => x.IdSaga.Equals(sagaAction.IdSaga)).ToListAsync();

            actions.ForEach(x =>
            {
                if (x.Position == sagaAction.Position)
                {
                    x.Status = StatusOperation.Fail;
                }
                else if (x.Position < sagaAction.Position)
                {
                    x.Status = StatusOperation.WaitCancel;
                }
                else
                {
                    x.Status = StatusOperation.NotExecuted;
                }
            });
            context.Actions.UpdateRange(actions);
            await context.SaveChangesAsync();
        }
Exemple #9
0
 public PutEffect(SagaAction data)
 {
     this.data = data;
 }
Exemple #10
0
 public static PutEffect Put(SagaAction data)
 {
     return(new PutEffect(data));
 }
Exemple #11
0
 public void OnAction(SagaAction data)
 {
     this.OnActionEvent?.Invoke(data);
 }
 internal async Task Update(SagaAction action)
 {
     using var context = _serviceProvider.GetRequiredService <SagaContext>();
     context.Actions.Update(action);
     await context.SaveChangesAsync();
 }
Exemple #13
0
 private void Saga_OnActionEvent(SagaAction data)
 {
     Debug.Log(data.Type + ": " + data.GetPayload <int>());
 }