代码:

  1. namespace RabbitMQDemo
  2. {
  3. public partial class PublishSubscribe : Form
  4. {
  5. private string exchangeName = "logs";
  6. private string exchangeType = ExchangeType.Fanout;//广播模式
  7. Action<string, TextBox> SetText;
  8. private readonly static PublishSubscribe _PublishSubscribe;
  9. static PublishSubscribe()
  10. {
  11. _PublishSubscribe = new PublishSubscribe();
  12. }
  13. /// <summary>
  14. /// 单例模式
  15. /// </summary>
  16. public static PublishSubscribe SingleForm { get { return _PublishSubscribe; } }
  17. private PublishSubscribe()
  18. {
  19. CheckForIllegalCrossThreadCalls = false;
  20. InitializeComponent();
  21. ReceiveMsg(txtConsumer1);//消费者1
  22. ReceiveMsg(txtConsumer2);//消费者2
  23. SetText += OnSetText;
  24. }
  25.  
  26. private void btnSendMsg_Click(object sender, EventArgs e)
  27. {
  28. SendMsg();
  29. }
  30. /// <summary>
  31. /// 发送消息
  32. /// </summary>
  33. private void SendMsg()
  34. {
  35. string message = txtPublisher.Text;
  36. if (message.Trim().Length <= )
  37. {
  38. MessageBox.Show("请输入要发送的消息");
  39. }
  40. var factory = new ConnectionFactory() { HostName = "localhost" };
  41. using (var connection = factory.CreateConnection())
  42. using (var channel = connection.CreateModel())
  43. {
  44. channel.ExchangeDeclare(
  45. exchange: exchangeName,
  46. type: exchangeType);
  47.  
  48. var body = Encoding.UTF8.GetBytes(message);
  49. channel.BasicPublish(exchange: exchangeName,
  50. routingKey: "",
  51. basicProperties: null,
  52. body: body);
  53. }
  54. }
  55. /// <summary>
  56. /// 接收消息
  57. /// </summary>
  58. private void ReceiveMsg(TextBox box)
  59. {
  60. try
  61. {
  62. var factory = new ConnectionFactory() { HostName = "localhost" };
  63. var connection = factory.CreateConnection();
  64. var channel = connection.CreateModel();
  65.  
  66. //声明交换机
  67. channel.ExchangeDeclare(
  68. exchange: exchangeName,
  69. type: exchangeType);
  70.  
  71. //rabbitmq随机生成队列名 durable=false exclusive=true, autodelete=true
  72. //exchangeName发来的消息在接收端永远都是新的队列在接收
  73. var queueName = channel.QueueDeclare().QueueName;
  74.  
  75. //绑定队列和交换机
  76. //必须绑定了名为exchangeName的queueName队列才能收到消息
  77. channel.QueueBind(
  78. queue: queueName,
  79. exchange: exchangeName,
  80. routingKey: "");
  81.  
  82. var consumer = new EventingBasicConsumer(channel);
  83. consumer.Received += (model, ea) =>
  84. {
  85. var msg = Encoding.UTF8.GetString(ea.Body);
  86.  
  87. txtConsumer1.Invoke(SetText, msg, box);
  88. };
  89. channel.BasicConsume(
  90. queue: queueName,
  91. noAck: true,
  92. consumer: consumer);
  93. }
  94. catch (Exception ex)
  95. {
  96. MessageBox.Show(ex.ToString());
  97. }
  98. }
  99.  
  100. private void OnSetText(string text, TextBox box)
  101. {
  102. box.Text += string.Format("{0}\r\n", text);
  103. }
  104. }
  105. }

界面:

大概流程:

生产者发送一条消息通过exchange交换机绑定到2个队列上,两个队列上都会有这一条消息,消费者1,2向队列取出消息并做处理

测试结果:

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

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

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

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

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

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

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

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

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

  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. Spring AOP 概述

    1. AOP的概念 AOP 是Aspect-Oriented Programming(面向方面编程或者面向切面)的简称,维基百科对其解释如下: Aspect是一种新的模块化机制,用来描述分散在对象.类 ...

  2. Web安全篇之SQL注入攻击

    在网上找了一篇关于sql注入的解释文章,还有很多技术,走马观花吧 文章来源:http://www.2cto.com/article/201310/250877.html ps:直接copy,格式有点问 ...

  3. Luogu P1342 请柬 题解

    差不多是Dijkstra的裸题吧... 这道题可以分为来回两个阶段. 去的时候很简单,直接用一次Dijkstra,然后统计答案. 回来的时候就有些巧妙了,虽然表面上是每个点回到起点,但是何尝不可将其看 ...

  4. python 进程与线程(理论部分)

    一.理论部分 一 什么是进程 进程:正在进行的一个过程或者说一个任务.而负责执行任务则是cpu. 举例(单核+多道,实现多个进程的并发执行): egon在一个时间段内有很多任务要做:python备课的 ...

  5. Mac下配置Java Web开发环境(Mac 10.12)

    1.JDK http://www.cnblogs.com/EasonJim/p/6277541.html 2.MySQL http://www.cnblogs.com/EasonJim/p/62758 ...

  6. Idea查看代码相关技巧

    (1)查看类中的属性与方法快捷键  Alt+7 (2)查看方法被调用 在方法上右键find usages (3)查看方法说明  Ctrl+Q

  7. 使用github oauth 出现 OpenSSL::SSL::SSLError - SSL_connect SYSCALL returned=5 errno=0 state=SSLv2/v3 解决

    A top level initializer is highly recommended to use: conf/initializer/tls_settings.rb OpenSSL::SSL: ...

  8. 转载:怎么用eclipse开发C++程序(以后备用,待实现),使用CDT

    一:准备工作:需下载以下三个软件包 a).Eclipse 3.1 官方站点: http://www.eclipse.org 工具下载地址:http://www.eclipse.org/download ...

  9. jQuery插件开发之boxScroll与marquee

    BoxScroll 常见图片轮播效果的简单实现.可以数字列表控制或者左右按键控制.逻辑很简单,下面的Marquee形成环,这个到了尽头得往回跑,看看注释就知道了. 图片轮播GitHub:https:/ ...

  10. 设置主外键时 ORA-02298: 无法验证 - 未找到父项关键字 --NOVALIDATE;

    主要原因是: 在添加CONSTRAINT的时候,默认是需要VALIDATE表中的已有数据的. 你要插入的表A里,有外键连接到另一个表B的主键,你在表A的外键列插入的值,在表B的主键列找不到就不能插入. ...