private void ReceiveMessage(MqQueueName queueName, Action<string> action) { IModel channel = null; try { if (_connection == null || !_connection.IsOpen) NewConnection(); //创建通道 channel = _connection.CreateModel(); //创建队列 channel.QueueDeclare(queueName.ToString(), true, false, false, null); channel.BasicQos(0, 1, false); var consumer = new QueueingBasicConsumer(channel); channel.BasicConsume(queueName.ToString(), false, consumer); while (true) { string message = ""; try { var ea = consumer.Queue.Dequeue(); message = Encoding.UTF8.GetString(ea.Body); //处理消息 action(message); //发送确认回执 channel.BasicAck(ea.DeliveryTag, false); } catch (Exception ex) { LogHelper.Fatal("RabbitMQ消费者处理消息失败。消息内容:" + queueName + "," + message, ex); } } } catch (Exception ex) { LogHelper.Fatal("RabbitMQ接收和解析消息失败。", ex); } finally { if (channel != null) { channel.Close(); } } }
/// <summary> /// 发送消息到MQ服务器 /// </summary> /// <param name="queueName">队列名称</param> /// <param name="json">JSON格式的消息</param> public void SendMessage(MqQueueName queueName, string json) { if (_queue.Count > _maxLength) { lock (_queue.SyncRoot) { Monitor.Wait(_queue.SyncRoot); } } _queue.Enqueue(queueName + "," + json); lock (_queueReadLock) { Monitor.Pulse(_queueReadLock); } }
/// <summary> /// 为消息队列创建多个消费者线程 /// </summary> /// <param name="queueName"></param> /// <param name="action"></param> /// <param name="batchSize"></param> private void BatchReceiveMessage(MqQueueName queueName, Action<string> action, int batchSize) { for (int i = 0; i < batchSize; i++) { Thread thread = new Thread((o) => { object[] os = o as object[]; ReceiveMessage((MqQueueName)os[0], os[1] as Action<string>); }); thread.IsBackground = true; thread.Start(new object[] { queueName, action }); _rcvMsgThreadListInExclusiveMode.Add(thread); } }
/// <summary> /// 使用共享模式接收消息。共享模式创建多个消息读取线程,用于所有消息队列的消息读取 /// </summary> /// <param name="queueName"></param> /// <param name="action"></param> public void ReceiveMessageBySharingMode(MqQueueName queueName, Action<string> action) { if (_msgReceiverDic.ContainsKey(queueName)) return; else _msgReceiverDic.Add(queueName, action); DisableReceiveMsgInExclusiveMode(); if (_rcvMsgThreadListInSharingMode.Count == 0) BatchReceiveMessage(MqConcurrentSizeInSharingMode); }