代码:

  1. namespace RabbitMQDemo
  2. {
  3. public partial class Topics : Form
  4. {
  5. private string exchangeName = "topic_logs"; //
  6. private string exchangeType = ExchangeType.Topic;//交换机类型
  7. private readonly static Topics _Topics;
  8. Action<string, TextBox> SetText;
  9. static Topics()
  10. {
  11. _Topics = new Topics();
  12. }
  13. /// <summary>
  14. /// 单例模式
  15. /// </summary>
  16. public static Topics SingleForm { get { return _Topics; } }
  17. private Topics()
  18. {
  19. CheckForIllegalCrossThreadCalls = false;
  20. InitializeComponent();
  21. ReceiveMsg(txtConsumer1);
  22. ReceiveMsg(txtConsumer2);
  23. SetText += OnSetText;
  24. }
  25.  
  26. private void btnSendMsg_Click(object sender, EventArgs e)
  27. {
  28. SendMsg();
  29. }
  30.  
  31. private void SendMsg()
  32. {
  33. string message = txtPublisher.Text;
  34. if (message.Trim().Length <= )
  35. {
  36. MessageBox.Show("请输入要发送的消息");
  37. }
  38.  
  39. var factory = new ConnectionFactory() { HostName = "localhost" };
  40. using (var connection = factory.CreateConnection())
  41. using (var channel = connection.CreateModel())
  42. {
  43. channel.ExchangeDeclare(exchange: exchangeName,
  44. type: exchangeType);
  45.  
  46. var routingKey = cbBoxRoutingKey.Text;
  47. var body = Encoding.UTF8.GetBytes(message);
  48. channel.BasicPublish(exchange: exchangeName,
  49. routingKey: routingKey,
  50. basicProperties: null,
  51. body: body);
  52. }
  53. }
  54.  
  55. private void ReceiveMsg(TextBox box)
  56. {
  57. var factory = new ConnectionFactory() { HostName = "localhost" };
  58. var connection = factory.CreateConnection();
  59. var channel = connection.CreateModel();
  60.  
  61. channel.ExchangeDeclare(exchange: exchangeName,
  62. type: exchangeType);
  63. var queueName = channel.QueueDeclare().QueueName;
  64.  
  65. if (box.Name == "txtConsumer1")
  66. {//消费者1
  67. channel.QueueBind(queue: queueName,
  68. exchange: exchangeName,
  69. routingKey: "*.*.one");
  70. channel.QueueBind(queue: queueName,
  71. exchange: exchangeName,
  72. routingKey: "one.#");
  73. }
  74. else if (box.Name == "txtConsumer2")
  75. {//消费者2
  76. channel.QueueBind(queue: queueName,
  77. exchange: exchangeName,
  78. routingKey: "*.*.two");
  79. channel.QueueBind(queue: queueName,
  80. exchange: exchangeName,
  81. routingKey: "two.#");
  82. }
  83.  
  84. var consumer = new EventingBasicConsumer(channel);
  85. consumer.Received += (model, ea) =>
  86. {
  87. var msg = Encoding.UTF8.GetString(ea.Body);
  88.  
  89. box.Invoke(SetText, msg, box);
  90. };
  91.  
  92. channel.BasicConsume(queue: queueName,
  93. noAck: true,
  94. consumer: consumer);
  95. }
  96. private void OnSetText(string text, TextBox box)
  97. {
  98. box.Text += string.Format("{0}\r\n", text);
  99. }
  100.  
  101. private void Topics_Load(object sender, EventArgs e)
  102. {
  103. string[] dataSource = new string[] { "send.msg.one", "send.msg.two", "one.receive.msg", "two.receive.msg" };
  104. cbBoxRoutingKey.DataSource = dataSource; cbBoxRoutingKey.DropDownStyle = ComboBoxStyle.DropDown;
  105. }
  106. }
  107. }

界面:

大概流程:

生产者绑定一条消息和type='topic'的交换机以及路由键routingKey来发送到队列,消费者绑定同样的交换机和路由键来获取并处理消息

测试结果:

WinForm实现Rabbitmq官网6个案例-Topics的更多相关文章

  1. WinForm实现Rabbitmq官网6个案例-RPC

    获取源码 客户端代码: namespace RabbitMQDemo { public partial class RPC : Form { private readonly static RPC _ ...

  2. WinForm实现Rabbitmq官网6个案例-Publishe/Subscribe

    代码: namespace RabbitMQDemo { public partial class PublishSubscribe : Form { private string exchangeN ...

  3. WinForm实现Rabbitmq官网6个案例-Work Queues

    代码: namespace RabbitMQDemo { public partial class WorkQueues : Form { private string queueName = &qu ...

  4. WinForm实现Rabbitmq官网6个案例-Hello World

    先上代码 namespace RabbitMQDemo { public partial class HelloWorld : Form { string queueName1 = "hel ...

  5. WinForm实现Rabbitmq官网6个案例-Routing

    代码: namespace RabbitMQDemo { public partial class Routing : Form { private string exchangeName = &qu ...

  6. 官网英文版学习——RabbitMQ学习笔记(一)认识RabbitMQ

    鉴于目前中文的RabbitMQ教程很缺,本博主虽然买了一本rabbitMQ的书,遗憾的是该书的代码用的不是java语言,看起来也有些不爽,且网友们不同人学习所写不同,本博主看的有些地方不太理想,为此本 ...

  7. 2022年官网下安装RabbitMQ最全版与官网查阅方法

    目录 一.Erlang环境部署 1.百度搜索"Erlang",或者访问网址:https://www.erlang.org/,找到DOWNLOAD双击进入. 2.找到支持的windo ...

  8. Yeoman 官网教学案例:使用 Yeoman 构建 WebApp

    STEP 1:设置开发环境 与yeoman的所有交互都是通过命令行.Mac系统使用terminal.app,Linux系统使用shell,windows系统可以使用cmder/PowerShell/c ...

  9. MXNet官网案例分析--Train MLP on MNIST

    本文是MXNet的官网案例: Train MLP on MNIST. MXNet所有的模块如下图所示: 第一步: 准备数据 从下面程序可以看出,MXNet里面的数据是一个4维NDArray. impo ...

随机推荐

  1. 什么是马拉车算法(Manacher's Algorithm)?

    提出问题 最长回文子串问题:给定一个字符串,求它的最长回文子串长度. 如果一个字符串正着读和反着读是一样的,那它就是回文串.如a.aa.aba.abba等. 暴力解法 简单粗暴:找到字符串的所有子串, ...

  2. 2016级算法期末模拟练习赛-D.AlvinZH的序列问题

    1111 AlvinZH的序列问题 思路 中等题,动态规划. 简化题意,. 坑点一:二维int数组MLE,明显会超过内存限制,由于\(n\)最大为1e4,那么我们的dp数组最大也是1e4,考虑使用sh ...

  3. 洛谷 P2480 [SDOI2010]古代猪文 题解【欧拉定理】【CRT】【Lucas定理】

    数论综合题. 题目背景 题目背景与题目无关因此省略.题目链接 题目描述 猪王国的文明源远流长,博大精深. iPig 在大肥猪学校图书馆中查阅资料,得知远古时期猪文文字总个数为 \(N\).当然,一种语 ...

  4. golang (4) golang 操作mongdb

    1. 数据按照时间聚合操作 1.1 正常的数据结构 { "_id" : ObjectId("5cac8d7b1202708adf5d4b64"), " ...

  5. git 学习之分支

    在一开始学习 git 的时候我们经常提到一个东西---- master.那么 master 到底是什么呢?其实它就是一个分支,一般这个分支就是主分支.而在一般 git 中都有一个指向当前你工作的分支 ...

  6. 解决问题的思维方式之Problem->Desgin->Solution(笔记)

    Problem->Desgin->Solution: 1.对于每个需要实现的功能问题,我们都称之为Problem(问题). 2.解决问题的具体思考过程,寻求解决问题的方案,即为Desgin ...

  7. HighChart 体验之旅 (后台传递JSON参数和数据的方法)

    转自:http://www.cnblogs.com/daviddai/archive/2013/04/12/Highchart.html 官网:http://www.highcharts.com/ 中 ...

  8. 查询各分类中最大自增ID

    假如现在有表结构: CREATE TABLE `msg_detail` ( `id` ) NOT NULL AUTO_INCREMENT COMMENT 'id', `title` ) NOT NUL ...

  9. html/css元素

    块级元素 会独占一行,多个block元素会各自新起一行.默认情况下,block元素宽度自动填满其父元素宽度. 可以设置width,height属性.块级元素即使设置了宽度,仍然是独占一行. 可以设置m ...

  10. 【angular5项目积累总结】一些正则积累

    /^[1-9][0-9]{0,4}$/ /^[1-9][0-9]{0,4}(,[1-9][0-9]{0,4})*$/ /^([a-zA-Z0-9_\-])+\@(([a-zA-Z0-9\-])+\.) ...