RabbitMQ~消费者实时与消息服务器保持通话
来源:互联网 发布:组合最优化 理论与算法 编辑:程序博客网 时间:2024/05/16 01:38
这个文章主要介绍简单的消费者的实现,rabbitMQ实现的消费者可以对消息服务器进行实时监听,当有消息(生产者把消息推到服务器上之后),消费者可以自动去消费它,这通常是开启一个进程去维护这个对话,它与消息服务器保持一个TCP的长连接,整个这个过程于rabbitMQ为我们提供,程序开发人员只需要实现自己的回调方法即可.
简单的rabbitMQ消费者
/// <summary> /// 消息消费者 /// </summary> public class RabbitMqSubscriber : Lind.DDD.Commons.DisposableBase { private readonly string exchangeName; private readonly string queueName; private readonly IConnection connection; private readonly IModel channel; private bool disposed; /// <summary> /// 从消息服务器拉到消息后触发 /// </summary> public event EventHandler<MessageReceivedEventArgs> MessageReceived; /// <summary> /// Initializes a new instance of <c>RabbitMqMessageSubscriber</c> class. /// </summary> /// <param name="uri"></param> /// <param name="exchangeName"></param> /// <param name="queueName"></param> public RabbitMqSubscriber(string uri, string queueName, string userName = "", string password = "") { this.exchangeName = exchangeName; this.queueName = queueName; var factory = new ConnectionFactory() { Uri = uri }; if (!string.IsNullOrWhiteSpace(userName)) factory.UserName = userName; if (!string.IsNullOrWhiteSpace(password)) factory.Password = password; this.connection = factory.CreateConnection(); this.channel = connection.CreateModel(); } public void Subscribe() { channel.QueueDeclare( queue: this.queueName, durable: false,//持久化 exclusive: false, //独占,只能被一个consumer使用 autoDelete: false,//自己删除,在最后一个consumer完成后删除它 arguments: null); var consumer = new EventingBasicConsumer(channel); consumer.Received += (sender, e) => { var body = e.Body; var json = Encoding.UTF8.GetString(body); var message = JsonConvert.DeserializeObject(json, new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.All }); this.OnMessageReceived(new MessageReceivedEventArgs(message)); channel.BasicAck(e.DeliveryTag, multiple: false); }; channel.BasicConsume(queue: queueName, noAck: false, consumer: consumer); } private void OnMessageReceived(MessageReceivedEventArgs e) { this.MessageReceived?.Invoke(this, e); } protected override void Finalize(bool disposing) { if (disposing) { if (!disposed) { this.channel.Dispose(); this.connection.Dispose(); disposed = true; } } } }
简单调用
class Program { static void Main(string[] args) { var subscriber = new Lind.DDD.RabbitMq.RabbitMqSubscriber("amqp://localhost:5672", "zzl"); subscriber.MessageReceived += Subscriber_MessageReceived; subscriber.Subscribe(); Console.ReadKey(); } private static void Subscriber_MessageReceived(object sender, RabbitMq.MessageReceivedEventArgs e) { Console.WriteLine("消费者2->消费了一个消息{0}", e.Message); Lind.DDD.Logger.LoggerFactory.Instance.Logger_Debug("消费者2->消费了一个消息{0}" + e.Message); Thread.Sleep(2000); } }
实时拉消息
RabbitMQ消息模型
通过上面图我们可以更容易和清晰的去理解rabbitmq的工作流程.
0 0
- RabbitMQ~消费者实时与消息服务器保持通话
- RabbitMQ~消费者实时与消息服务器保持通话
- RabbitMQ~消费者实时与消息服务器保持通话
- RabbitMQ~消费者实时与消息服务器保持通话
- rabbitMQ 消息确认与公平调度消费者
- rabbitMQ学习笔记(三) 消息确认与公平调度消费者
- rabbitMQ学习笔记(三) 消息确认与公平调度消费者
- 保持通话。
- AMQP消息服务器 RabbitMQ
- AMQP消息服务器 RabbitMQ
- AMQP消息服务器RabbitMQ
- AMQP消息服务器RabbitMQ
- 消息服务器RabbitMQ
- RabbitMQ-理解消息通信-消费者和生产者
- RabbitMQ消息队列生产者和消费者
- spring与RabbitMQ整合 消费者消费不到消息 重启才能消费到的问题解决
- RabbitMQ logo AMQP消息服务器 RabbitMQ
- 保持异步数据库服务器的实时更新
- Android wear 之 导航抽屉(WearableNavigationDrawer )
- LeetCode 遍历技巧 | 16. 3Sum Closest
- C语言计算日期间隔天数的经典算法解析
- CG基本数据类型
- 在Eclipse中使用JUnit4进行单元测试(初级篇)
- RabbitMQ~消费者实时与消息服务器保持通话
- 关于Unity5.5+中的UGUI的ImageMask组件在安卓设备不能正常显示的问题的解决方案
- SpringMvc拦截器的实现与使用的场景
- 深入.NET 第七章上机2上机3 员工工作
- scala的list操作
- 在Eclipse中使用JUnit4进行单元测试(中级篇)
- spring mvc 学习文档1
- 【leetcode】347. Top K Frequent Elements
- Android-ButterKnife不能注解RatingBar(含ButterKnife部分原理以及View传递机制)