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); }
/// <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); } }