本文是基于http://www.cnblogs.com/cheng-lei/articles/7274513.html的项目结构进行搭建的,了解之前请先阅读http://www.cnblogs.com/cheng-lei/category/1047427.html中的前四篇文章。

工具 — Nuget包管理器 —程序包管理器控制台

PM> Install-Package RabbitMQ.Client -Version 5.1.0

PM> Install-Package EasyNetQ -Version 3.2.0

一、项目搭建

1. Weiz.MQ 项目,消息队列的通用处理类库,用于正在的订阅和发布消息。

  1、在BusBuilder.cs中添加了对CreateAdvancedBus函数的实现。

 public static IAdvancedBus CreateAdvancedBus()
{
// 消息服务器连接字符串
string connString = "host=dev.corp.wingoht.com:5672;virtualHost=cd;username=ishowfun;password=123456";
if (connString == null || connString == string.Empty)
{
throw new Exception("messageserver connection string is missing or empty");
} return RabbitHutch.CreateBus(connString).Advanced;
}

  2、在MQHelper.cs中添加了对Send、Receive函数的实现。

 public static void Send(MyMessage msg)
{
// 创建消息bus
IBus bus = BusBuilder.CreateMessageBus(); try
{
bus.Send(msg.MessageRouter, msg);
}
catch (EasyNetQException ex)
{
//处理连接消息服务器异常
Console.WriteLine("Send Error!!!");
} bus.Dispose();//与数据库connection类似,使用后记得销毁bus对象
} public static void Receive(MyMessage msg, IProcessMessage ipro)
{
// 创建消息bus
IBus bus = BusBuilder.CreateMessageBus(); try
{
bus.Receive<MyMessage>(msg.MessageRouter, message => ipro.ProcessMsg(message));
}
catch (EasyNetQException ex)
{
//处理连接消息服务器异常
Console.WriteLine("Receive Error!!!");
}
}

  3、在MQHelper.cs中添加了对采用Fanout、Direct、Topic交换机类型进行消息收发功能的实现。

 public static void ProducerFanoutMessage(MyMessage msg, string exchangeName = "chending.fanout")
{
var advancedBus = BusBuilder.CreateAdvancedBus(); if (advancedBus.IsConnected)
{
var exchange = advancedBus.ExchangeDeclare(exchangeName, ExchangeType.Fanout); advancedBus.Publish(exchange, "", false, new Message<MyMessage>(msg));
}
else
{
Console.WriteLine("Can't connect");
} } public static void ConsumeFanoutMessage(string exchageName = "chending.fanout", string queueName = "chending.fanout.queue")
{
var advancedBus = BusBuilder.CreateAdvancedBus();
var exchange = advancedBus.ExchangeDeclare(exchageName, ExchangeType.Fanout); var queue = advancedBus.QueueDeclare(queueName);
advancedBus.Bind(exchange, queue, queueName);
advancedBus.Consume(queue, registration =>
{
registration.Add<MyMessage>((message, info) => { Console.WriteLine("Fanout Content: {0}", message.Body.MessageBody); });
});
} public static void ProducerDirectMessage(MyMessage msg, string queueName = "chending.direct.queue")
{
var advancedBus = BusBuilder.CreateAdvancedBus(); if (advancedBus.IsConnected)
{
var queue = advancedBus.QueueDeclare(queueName); advancedBus.Publish(Exchange.GetDefault(), queue.Name, false, new Message<MyMessage>(msg));
}
else
{
Console.WriteLine("Can't connect");
} } public static void ConsumeDirectMessage(string exchageName = "chending.direct", string queueName = "chending.direct.queue")
{
var advancedBus = BusBuilder.CreateAdvancedBus();
var exchange = advancedBus.ExchangeDeclare(exchageName, ExchangeType.Direct); var queue = advancedBus.QueueDeclare(queueName);
advancedBus.Bind(exchange, queue, queueName);
advancedBus.Consume(queue, registration =>
{
registration.Add<MyMessage>((message, info) => { Console.WriteLine("Direct Content: {0}", message.Body.MessageBody); });
});
} public static void ProducerTopicMessage(MyMessage msg)
{
//// 创建消息bus
IBus bus = BusBuilder.CreateMessageBus(); try
{
bus.Publish(msg, x => x.WithTopic(msg.MessageRouter));
}
catch (EasyNetQException ex)
{
//处理连接消息服务器异常
} bus.Dispose();//与数据库connection类似,使用后记得销毁bus对象
} public static void ConsumeTopicMessage(MyMessage msg)
{
//// 创建消息bus
IBus bus = BusBuilder.CreateMessageBus(); try
{
bus.Subscribe<MyMessage>(msg.MessageRouter, message => Console.WriteLine("Topic Content: {0}", message.MessageBody), x => x.WithTopic(msg.MessageRouter));
}
catch (EasyNetQException ex)
{
//处理连接消息服务器异常
}
}

  4、在ProduceThread.cs中添加了消息发布线程对前面实现的功能进行测试(也可以不作为线程直接调用)。

 public class ProduceThread
{
public static void ProduceMessage() {
MyMessage msg1 = new MyMessage();
msg1.MessageID = "0-1";
msg1.MessageBody = DateTime.Now.ToString();
msg1.MessageRouter = "chending.fanout";
msg1.MessageTitle = "0-1";
MyMessage msg2 = new MyMessage();
msg2.MessageID = "0-2";
msg2.MessageBody = DateTime.Now.ToString();
msg2.MessageRouter = "chending.direct";
msg2.MessageTitle = "0-2";
MyMessage msg3 = new MyMessage();
msg3.MessageID = "0-3";
msg3.MessageBody = DateTime.Now.ToString();
msg3.MessageRouter = "chending.topic.a.b";
msg3.MessageTitle = "0-3"; //MQHelper.Send(msg1);
MQHelper.ProducerFanoutMessage(msg1);
MQHelper.ProducerDirectMessage(msg2);
MQHelper.ProducerTopicMessage(msg3); for (int i = ; i < ; i++) {
MyMessage msg = new MyMessage();
msg.MessageID = (i+).ToString();
msg.MessageBody = DateTime.Now.ToString();
if (i % == )
msg.MessageRouter = "cd.test.demo.a.b";
else
msg.MessageRouter = "cd.test.demo.a";
msg.MessageTitle = (i+).ToString(); MQHelper.Publish(msg);
//Console.WriteLine("Message{0} is published!!!", i + 1);
Thread.Sleep();
}
}

2. Weiz.Producer(生成者)已弃用(改用ProduceThread.cs)

3. Weiz.Consumer 就是Consumer(消费者)

  1、修改OrderProcessMessage.cs,实现不同的消息处理方式。

  public class OrderProcessMessage : MQ.IProcessMessage
{
public void ProcessMsg(MQ.MyMessage msg)
{
Console.WriteLine("ID: {0}, Title: {1}, Router: {2}, Content: {3}", msg.MessageID, msg.MessageTitle, msg.MessageRouter, msg.MessageBody);
}
}
public class OrderProcessMessage1:MQ.IProcessMessage
{
public void ProcessMsg(MQ.MyMessage msg)
{
Console.WriteLine("Process1 ID: {0}, Title: {1}, Router: {2}, Content: {3}", msg.MessageID, msg.MessageTitle, msg.MessageRouter, msg.MessageBody);
}
} public class OrderProcessMessage2 : MQ.IProcessMessage
{
public void ProcessMsg(MQ.MyMessage msg)
{
Console.WriteLine("Process2 ID: {0}, Title: {1}, Router: {2}, Content: {3}", msg.MessageID, msg.MessageTitle, msg.MessageRouter, msg.MessageBody);
}
}

  2、对Program.cs中的Main调用进行了修改。

 class Program
{
static void Main(string[] args)
{
//OrderProcessMessage order = new OrderProcessMessage();
OrderProcessMessage1 order1 = new OrderProcessMessage1();
OrderProcessMessage2 order2 = new OrderProcessMessage2(); //MyMessage msg = new MyMessage();
MyMessage msg1 = new MyMessage();
MyMessage msg2 = new MyMessage();
MyMessage msg3 = new MyMessage(); //msg.MessageRouter = "cd.test.demo";
msg1.MessageRouter = "cd.test.demo.*";
msg2.MessageRouter = "cd.test.demo.#";
msg3.MessageRouter = "chending.topic.#"; //MQHelper.Receive(msg, order);
MQHelper.ConsumeFanoutMessage();
MQHelper.ConsumeDirectMessage();
MQHelper.ConsumeTopicMessage(msg3);
MQHelper.Subscribe(msg1, order1);
//MQHelper.Subscribe(msg1, order2);
MQHelper.Subscribe(msg2, order2); Console.WriteLine("Listening for messages."); ProduceThread.ProduceMessage(); //ThreadStart threadStart = ProduceThread.ProduceMessage;
//Thread thread = new Thread(threadStart);
//thread.Start();
}
}

二、项目运行

启动 Weiz.Consumer (消费者),启动消费者,会自动在RabbitMQ 服务器上创建相关的exchange 和 queue ,同时调用的ProduceThread.ProduceMessage函数会发送消息,接收到的信息会在Console命令行中进行显示。

项目源码:百度云链接:https://pan.baidu.com/s/1sCJqY2fKphXV0ntMIytcVw 密码:hfz5

C# 如何使用 RabbitMQ 实现消息收发的更多相关文章

  1. 通过集群的方式解决基于MQTT协议的RabbitMQ消息收发

    在完成了基于AMQP协议的RabbitMQ消息收发后,我们要继续实现基于MQTT协议的RabbitMQ消息收发. 由于C#的RabbitMQ.Client包中只实现了基于AMQP协议的消息收发功能的封 ...

  2. 第五节 RabbitMQ在C#端的应用-消息收发

    原文:第五节 RabbitMQ在C#端的应用-消息收发 版权声明:未经本人同意,不得转载该文章,谢谢 https://blog.csdn.net/phocus1/article/details/873 ...

  3. RabbitMQ入门-消息订阅模式

    消息派发 上篇<RabbitMQ入门-消息派发那些事儿>发布之后,收了不少反馈,其中问的最多的还是有关消息确认以及超时等场景的处理. 楼主,有遇到消费者后台进程不在,但consumer连接 ...

  4. rabbitmq(中间消息代理)在python中的使用

    在之前的有关线程,进程的博客中,我们介绍了它们各自在同一个程序中的通信方法.但是不同程序,甚至不同编程语言所写的应用软件之间的通信,以前所介绍的线程.进程队列便不再适用了:此种情况便只能使用socke ...

  5. 整合Spring Cloud Stream Binder与RabbitMQ进行消息发送与接收

    我最新最全的文章都在南瓜慢说 www.pkslow.com,欢迎大家来喝茶! 1 前言 Spring Cloud Stream专门用于事件驱动的微服务系统,使用消息中间件来收发信息.使用Spring ...

  6. RabbitMQ:消息丢失 | 消息重复 | 消息积压的原因+解决方案+网上学不到的使用心得

    前言 首先说一点,企业中最常用的实际上既不是RocketMQ,也不是Kafka,而是RabbitMQ. RocketMQ很强大,但主要是阿里推广自己的云产品而开源出来的一款消息队列,其实中小企业用Ro ...

  7. twsited(5)--不同模块用rabbitmq传递消息

    上一章,我们讲到,用redis共享数据,以及用redis中的队列来实现一个简单的消息传递.其实在真实的过程中,不应该用redis来传递,最好用专业的消息队列,我们python中,用到最广泛的就是rab ...

  8. 如何在项目中引入MetaQ消息收发机制

    当需要异步发送和接收大量消息时,需要在Crystal项目中引入MetaQ消息收发机制. 关于MetaQ使用的官方例子可参考:https://github.com/killme2008/Metamorp ...

  9. RabbitMQ分布式消息队列服务器(一、Windows下安装和部署)

    RabbitMQ消息队列服务器在Windows下的安装和部署-> 一.Erlang语言环境的搭建 RabbitMQ开源消息队列服务是使用Erlang语言开发的,因此我们要使用他就必须先进行Erl ...

随机推荐

  1. Struts2通配符

    action: struts: or: 请求路径:

  2. CS20Chapter3

    waiting  P54 shuffle data 03_Lecture note_Linear and Logistic Regression 学习点1: python的地址输入是要不能用正斜杠\的 ...

  3. DataFrame 加减乘除

    headlist = ['a', 'b'] datalist = [[1, 2], [0,3], [3,2]] df = pd.DataFrame(data=datalist,columns=head ...

  4. 使用java代码将时间戳和时间互相转换

    时间戳转时间: SimpleDateFormat simpleDateFormat = null; simpleDateFormat = new SimpleDateFormat("yyyy ...

  5. Backward compatibility

    向后兼容

  6. NSDate|NSTimeZone|时区|日历

    NSDate,NSDateFormatter以及时区转换-开发者-51CTO博客 iOS 时区转换 东八区 - 简书 iOS时间的时区转换以及一些方法记录 - 简书 iOS - OC NSTimeZo ...

  7. [leetcode] 二叉树的前序,中序,后续,层次遍历

    前序遍历 [144] Binary Tree Preorder Traversal 递归遍历 使用递归,先保存父节点的值,再对左子树进行遍历(递归),最后对右子树进行遍历(递归) vector< ...

  8. 1001. 温度转换 (Standard IO)

    1001. 温度转换 (Standard IO) 时间限制: 1000 ms  空间限制: 262144 KB  具体限制   题目描述 将输入的华氏温度转换为摄氏温度.由华氏温度F与摄氏温度C的转换 ...

  9. 【CSU 1803】2016 (数学)

    Description 给出正整数 n 和 m,统计满足以下条件的正整数对 (a,b) 的数量: 1. 1≤a≤n,1≤b≤m; 2. a×b 是 2016 的倍数. Input 输入包含不超过 30 ...

  10. MySQL架构与引擎初识

    一.MySQL逻辑架构 1.连接层: 最上层是一些客户端和连接服务,所包含的服务并不是MySQL所独有的技术.它们都是服务于C/S程序或者是这些程序所需要的 :连接处理,身份验证,安全性等等. 2.服 ...