Beispiel #1
0
 public SagaContext(SagaCollaborator sagaCollaborator,
                    ILogger logger)
 {
     this._sagaCollaborator  = sagaCollaborator;
     this._sagaDataConverter = SagaGlobal.CurrentSagaDataConverter;
     this._sagaResolver      = SagaGlobal.CurrentSagaResolver;
     this._logger            = logger;
     this._sagaSession       = null;
 }
Beispiel #2
0
        public async Task <string> Start <T>(T form) where T : class, SagaData
        {
            var xid = await _sagaCollaborator.CreateGlobalTxAsync();

            _logger.LogInformation($"created xid {xid}");
            // bind xid to current call context
            CallContext.SetData(SagaGlobal.SAGA_XID_CONTEXT_KEY, xid);

            // 用一个branchCaller服务去带着xid和sagaData去调用现有的SagaService的方法,
            // 从而包装好分支事务的注册
            _sagaSession = new SagaSession <T>(xid, _sagaCollaborator,
                                               _sagaDataConverter, _sagaResolver, _logger);
            CallContext.SetData(SagaGlobal.SAGA_SESSION_CONTEXT_KEY, _sagaSession);

            // 上面这里的CallContext.SetData后的值下个线程就取不到了. 可能是因为不在同一个async CPS中?. 所以返回后要调用Bind()

            // 初始化saga data避免以后回滚时得到null sagaData
            await _sagaCollaborator.InitSagaDataAsync(xid, _sagaDataConverter.Serialize(form.GetType(), form));

            return(xid);
        }