Esempio n. 1
0
 public RabbitMQ(
     ISubscriptionManager subManager
     , IPersistenceConnection persConnection
     , IServiceCollection scope
     , ILogger <RabbitMQ> logger
     , string queueName = null
     , int retryCount   = 3
     )
 {
     _subManager                 = subManager;
     _persConnection             = persConnection;
     _logger                     = logger;
     _scope                      = scope;
     _queueName                  = queueName;
     _retryCount                 = retryCount;
     _consumerChannel            = CreateConsumerChannel();
     _subManager.OnEventRemoved += SubsManager_OnEventRemoved;
 }
        /// <summary>
        /// 异步智能执行
        /// 根据连接ID会判断是否已经存在该连接,如果存在则直接引用存在的连接,否则新创建
        /// 因为执行业务方法是异步,本程序不自动关闭连接,由业务自行关闭
        /// </summary>
        /// <param name="connectionId">连接ID(如果需要执行一连串则设置相同连接ID,一旦传入该值,则不会关闭此链接,需要调用方关闭。[前提是先执行新建连接ID]])</param>
        /// <param name="persistenceConnection">持久化连接</param>
        /// <param name="action">动作</param>
        /// <param name="accessMode">访问模式</param>
        public static void BrainpowerExecuteAsync(ref string connectionId, IPersistenceConnection persistenceConnection, Action <string, bool, IDbConnection> action, AccessMode accessMode = AccessMode.MASTER)
        {
            bool isClose = false;

            if (string.IsNullOrWhiteSpace(connectionId))
            {
                connectionId = NewConnectionId(persistenceConnection, accessMode);
                isClose      = true;
            }

            bool          isExistsConnection;
            string        connectionString;
            IDbConnection dbConnection = GetDbConnection(connectionId, persistenceConnection, out isExistsConnection, out connectionString, accessMode);

            // 如果不是新建连接ID且不存在连接,则需要本次连接关闭
            if (!isExistsConnection && !isClose)
            {
                isClose = true;
            }

            action(connectionId, isClose, dbConnection);
        }
Esempio n. 3
0
        /// <summary>
        /// 拦截
        /// </summary>
        /// <param name="basicReturn">基本返回</param>
        /// <param name="invocation">拦截参数</param>
        /// <param name="attr">特性</param>
        /// <param name="isExecProceeded">是否已执行</param>
        protected override void Intercept(BasicReturnInfo basicReturn, IInvocation invocation, TransactionAttribute attr, out bool isExecProceeded)
        {
            isExecProceeded = true;
            BasicReturnInfo returnInfo = new BasicReturnInfo();
            object          connId     = null;

            if (attr.ConnectionIdIndex == -1)
            {
                connId = invocation.GetArgumentValue(attr.ConnectionIdIndex);
            }
            IGetObject <IPersistenceConnection> getPerConn = AutofacTool.Resolve(invocation.TargetType) as IGetObject <IPersistenceConnection>;

            if (getPerConn == null)
            {
                basicReturn.SetFailureMsg("未实现IGetObject<IPersistenceConnection>接口");
                return;
            }

            IPersistenceConnection perConn = getPerConn.Get();
            string connectionId            = null;

            // 当有连接ID传过来,判断是否存在该连接事务,存在则不开启新事务
            if (connId != null)
            {
                string connIdStr = connId.ToString();
                if (perConn.GetDbTransaction(connIdStr) != null)
                {
                    invocation.Proceed();
                    return;
                }

                connectionId = connIdStr;
            }
            else
            {
                connectionId = perConn.NewConnectionId();
            }
            IDbTransaction dbTransaction = null;

            try
            {
                dbTransaction = perConn.BeginTransaction(connectionId, attr);

                invocation.SetArgumentValue(attr.ConnectionIdIndex, connectionId);

                invocation.Proceed();

                // 如果返回值为失败标识,也回滚
                Type returnType = invocation.Method.ReturnType;
                if (invocation.Method.ReturnType.IsReturnType())
                {
                    BasicReturnInfo basicReturnInfo = invocation.ReturnValue as BasicReturnInfo;
                    if (basicReturnInfo.Failure())
                    {
                        dbTransaction.Rollback();

                        return;
                    }
                }

                dbTransaction.Commit();
            }
            catch (Exception ex)
            {
                if (dbTransaction != null)
                {
                    dbTransaction.Rollback();
                }
                throw new Exception(ex.Message, ex);
            }
            finally
            {
                perConn.Release(connectionId);
            }
        }