/// <summary> /// 消息队列 客户端消费者 /// </summary> /// <param name="client">TCP 客户端</param> /// <param name="config">队列数据 读取配置</param> /// <param name="log">日志处理</param> /// <param name="readerIndexNode"></param> protected QueueConsumer(MasterServer.TcpInternalClient client, Config.QueueConsumer config, AutoCSer.Log.ILog log, DataStructure.Abstract.Node readerIndexNode) { if (client == null) { throw new InvalidOperationException(); } this.client = client; if (config == null) { Config = defaultConfig; } else { config.Format(); Config = config; } Log = log ?? client._TcpClient_.Log; getDequeueIdentityNode = new DataStructure.Parameter.QueryOnly(readerIndexNode, OperationParameter.OperationType.MessageQueueGetDequeueIdentity); getDequeueIdentityNode.Parameter.SetJson(Config); getMessageNode = new DataStructure.Parameter.QueryOnly(readerIndexNode, OperationParameter.OperationType.MessageQueueDequeue); setDequeueIdentityNode = new DataStructure.Parameter.QueryOnly(readerIndexNode, OperationParameter.OperationType.MessageQueueSetDequeueIdentity); }
/// <summary> /// 多消费者消息队列 客户端消费者 /// </summary> /// <param name="messageQueue">队列消费节点</param> /// <param name="onMessage">消息处理委托</param> /// <param name="config">队列数据 读取配置</param> /// <param name="readerIndex">读取编号</param> /// <param name="log">日志处理</param> public QueueConsumer(DataStructure.MessageQueue.QueueConsumers <valueType> messageQueue, Action <valueType> onMessage, Config.QueueConsumer config, IConvertible readerIndex, AutoCSer.Log.ILog log = null) : this(messageQueue, onMessage, config, readerIndex.ToInt32(null), log) { }
/// <summary> /// 多消费者消息队列 客户端消费者 /// </summary> /// <param name="messageQueue">队列消费节点</param> /// <param name="onMessage">消息处理委托</param> /// <param name="config">队列数据 读取配置</param> /// <param name="readerIndex">读取编号</param> /// <param name="log">日志处理</param> public QueueConsumer(DataStructure.MessageQueue.QueueConsumers <valueType> messageQueue, Action <valueType> onMessage, Config.QueueConsumer config, int readerIndex, AutoCSer.Log.ILog log = null) : base(messageQueue, config, log, readerIndex) { if (onMessage == null) { throw new ArgumentNullException(); } this.onMessage = onMessage; setCheckSocketVersion(); }
/// <summary> /// 消息队列 客户端消费者 /// </summary> /// <param name="messageQueue">队列消费节点</param> /// <param name="onMessage">消息处理委托</param> /// <param name="config">队列数据 读取配置</param> /// <param name="log">日志处理</param> public QueueConsumerAsynchronous(DataStructure.MessageQueue.QueueConsumer <valueType> messageQueue, Action <valueType, Action> onMessage, Config.QueueConsumer config, AutoCSer.Log.ILog log = null) : base(messageQueue, config, log) { if (onMessage == null) { throw new ArgumentNullException(); } OnMessage = onMessage; setCheckSocketVersion(); }
/// <summary> /// 消息队列 客户端消费者 /// </summary> /// <param name="messageQueue">队列消费节点</param> /// <param name="onMessage">消息处理委托,直接在 Socket 接收数据的 IO 线程中处理以避免线程调度,适应于快速结束的非阻塞函数;需要知道的是这种模式下如果产生阻塞会造成 Socket 停止接收数据甚至死锁</param> /// <param name="config">队列数据 读取配置</param> /// <param name="log">日志处理</param> public QueueConsumerStream(DataStructure.MessageQueue.QueueConsumer <valueType> messageQueue, Action <valueType> onMessage, Config.QueueConsumer config, AutoCSer.Log.ILog log = null) : base(messageQueue.ClientDataStructure.Client.MasterClient, config, log, messageQueue) { if (onMessage == null) { throw new ArgumentNullException(); } this.onMessage = onMessage; setCheckSocketVersion(onClientSocket); }