Esempio n. 1
0
        private TccTransactionData ConvertDataRowToTccTransactionData(DataRow dr)
        {
            TccTransactionData data = new TccTransactionData();

            data.TxId = dr["TxId"].ToString();
            data.ServiceAtComputer = dr["ServiceAtComputer"].ToString();
            data.SchemaName        = dr["TxSchema"].ToString();
            data.BeginTime         = Convert.ToDateTime(dr["BeginTime"]);
            data.TxState           = (TccTransactionState)dr["TxState"];
            string temp = dr["WorkState"].ToString();

            string[]       strs   = temp.Split(new string[] { "," }, StringSplitOptions.None);
            TccWorkState[] states = new TccWorkState[strs.Length];
            for (int i = 0; i < strs.Length; i++)
            {
                states[i] = (TccWorkState)Convert.ToInt32(strs[i]);
            }
            data.WorkStates  = states;
            data.ContextKey  = dr["ContextKey"].ToString();
            data.ContextData = (byte[])dr["ContextData"];
            if (dr["Error"] != DBNull.Value)
            {
                data.Error = Convert.ToString(dr["Error"]);
            }
            return(data);
        }
Esempio n. 2
0
        internal void RunAction(TContext context, TccAction nextAction, Action <Exception> callback)
        {
            Action <TccWorkUnitContext <TContext> > Proc;
            TccWorkState succState;
            TccWorkState failState;

            Tracing.InfoFmt("WorkUnit<{0}>.Run{1} State:{2}", _workName, nextAction, _state);

            switch (nextAction)
            {
            case TccAction.Try:
                if (_state != TccWorkState.None)
                {
                    throw new Exception("Unexcepted WorkUnit State:" + _state);
                }
                _state    = TccWorkState.Trying;
                Proc      = Try;
                succState = TccWorkState.Tryed;
                failState = TccWorkState.TryFailed;
                break;

            case TccAction.Confirm:
                if (_state != TccWorkState.Tryed)
                {
                    throw new Exception("Unexcepted WorkUnit State:" + _state);
                }
                Proc      = Confirm;
                _state    = TccWorkState.Confirming;
                succState = TccWorkState.Confirmed;
                failState = TccWorkState.ConfirmFailed;
                break;

            case TccAction.Cancel:
                if (_state != TccWorkState.Tryed && _state != TccWorkState.TryFailed)
                {
                    throw new Exception("Unexcepted WorkUnit State:" + _state);
                }
                Proc      = Cancel;
                _state    = TccWorkState.Cancelling;
                succState = TccWorkState.Cancelled;
                failState = TccWorkState.CancelFailed;
                break;

            default:
                throw new Exception("NeverGoHere");
            }

            int hasReturned = 0;
            TccWorkUnitContext <TContext> ctx = new TccWorkUnitContext <TContext>(
                context,
                delegate(Exception ex) {
                if (ex != null)
                {
                    Tracing.ErrorFmt(ex, "WorkUnit<{0}>.Run{1} Failed in callback.", _workName, nextAction);
                }
                else
                {
                    Tracing.InfoFmt("WorkUnit<{0}>.Run{1} ok.", _workName, nextAction);
                }

                if (Interlocked.CompareExchange(ref hasReturned, 1, 0) == 0)
                {
                    if (ex == null)
                    {
                        _state = succState;
                        callback(null);
                    }
                    else
                    {
                        _error = ex;
                        _state = failState;
                        callback(ex);
                    }
                }
                else
                {
                    Tracing.ErrorFmt("WorkUnit<{0}>.Run{1} callback return more than once.", _workName, nextAction);
                }
            }
                );

            try {
                Proc(ctx);
            } catch (Exception ex) {
                if (Interlocked.CompareExchange(ref hasReturned, 1, 0) == 0)
                {
                    Tracing.ErrorFmt(ex, "WorkUnit<{0}>.Run{1} Failed.", _workName, nextAction);
                    _error = ex;
                    _state = failState;
                    callback(ex);
                }
                else
                {
                    Tracing.ErrorFmt("WorkUnit<{0}>.Run{1} return more than once.", _workName, nextAction);
                }
            }
        }
 private string WorkStatesToString(TccWorkState[] states)
 {
     StringBuilder workstates = new StringBuilder();
     for (int i = 0; i < states.Length; i++)
     {
         workstates.Append((int)states[i]);
         if (i != states.Length - 1)
             workstates.Append(",");
     }
     return workstates.ToString();
 }
 private TccTransactionData ConvertDataRowToTccTransactionData(DataRow dr)
 {
     TccTransactionData data = new TccTransactionData();
     data.TxId = dr["TxId"].ToString();
     data.ServiceAtComputer = dr["ServiceAtComputer"].ToString();
     data.SchemaName = dr["TxSchema"].ToString();
     data.BeginTime = Convert.ToDateTime(dr["BeginTime"]);
     data.TxState = (TccTransactionState)dr["TxState"];
     string temp = dr["WorkState"].ToString();
     string[] strs = temp.Split(new string[] { "," }, StringSplitOptions.None);
     TccWorkState[] states = new TccWorkState[strs.Length];
     for (int i = 0; i < strs.Length; i++)
     {
         states[i] = (TccWorkState)Convert.ToInt32(strs[i]);
     }
     data.WorkStates = states;
     data.ContextKey = dr["ContextKey"].ToString();
     data.ContextData = (byte[])dr["ContextData"];
     if (dr["Error"] != DBNull.Value)
         data.Error = Convert.ToString(dr["Error"]);
     return data;
 }