public SagaContext(SagaCollaborator sagaCollaborator, ILogger logger) { this._sagaCollaborator = sagaCollaborator; this._sagaDataConverter = SagaGlobal.CurrentSagaDataConverter; this._sagaResolver = SagaGlobal.CurrentSagaResolver; this._logger = logger; this._sagaSession = null; }
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); }