WinForm实现Rabbitmq官网6个案例-Publishe/Subscribe
代码:
- namespace RabbitMQDemo
- {
- public partial class PublishSubscribe : Form
- {
- private string exchangeName = "logs";
- private string exchangeType = ExchangeType.Fanout;//广播模式
- Action<string, TextBox> SetText;
- private readonly static PublishSubscribe _PublishSubscribe;
- static PublishSubscribe()
- {
- _PublishSubscribe = new PublishSubscribe();
- }
- /// <summary>
- /// 单例模式
- /// </summary>
- public static PublishSubscribe SingleForm { get { return _PublishSubscribe; } }
- private PublishSubscribe()
- {
- CheckForIllegalCrossThreadCalls = false;
- InitializeComponent();
- ReceiveMsg(txtConsumer1);//消费者1
- ReceiveMsg(txtConsumer2);//消费者2
- SetText += OnSetText;
- }
- private void btnSendMsg_Click(object sender, EventArgs e)
- {
- SendMsg();
- }
- /// <summary>
- /// 发送消息
- /// </summary>
- private void SendMsg()
- {
- string message = txtPublisher.Text;
- if (message.Trim().Length <= )
- {
- MessageBox.Show("请输入要发送的消息");
- }
- var factory = new ConnectionFactory() { HostName = "localhost" };
- using (var connection = factory.CreateConnection())
- using (var channel = connection.CreateModel())
- {
- channel.ExchangeDeclare(
- exchange: exchangeName,
- type: exchangeType);
- var body = Encoding.UTF8.GetBytes(message);
- channel.BasicPublish(exchange: exchangeName,
- routingKey: "",
- basicProperties: null,
- body: body);
- }
- }
- /// <summary>
- /// 接收消息
- /// </summary>
- private void ReceiveMsg(TextBox box)
- {
- try
- {
- var factory = new ConnectionFactory() { HostName = "localhost" };
- var connection = factory.CreateConnection();
- var channel = connection.CreateModel();
- //声明交换机
- channel.ExchangeDeclare(
- exchange: exchangeName,
- type: exchangeType);
- //rabbitmq随机生成队列名 durable=false exclusive=true, autodelete=true
- //exchangeName发来的消息在接收端永远都是新的队列在接收
- var queueName = channel.QueueDeclare().QueueName;
- //绑定队列和交换机
- //必须绑定了名为exchangeName的queueName队列才能收到消息
- channel.QueueBind(
- queue: queueName,
- exchange: exchangeName,
- routingKey: "");
- var consumer = new EventingBasicConsumer(channel);
- consumer.Received += (model, ea) =>
- {
- var msg = Encoding.UTF8.GetString(ea.Body);
- txtConsumer1.Invoke(SetText, msg, box);
- };
- channel.BasicConsume(
- queue: queueName,
- noAck: true,
- consumer: consumer);
- }
- catch (Exception ex)
- {
- MessageBox.Show(ex.ToString());
- }
- }
- private void OnSetText(string text, TextBox box)
- {
- box.Text += string.Format("{0}\r\n", text);
- }
- }
- }
界面:
大概流程:
生产者发送一条消息通过exchange交换机绑定到2个队列上,两个队列上都会有这一条消息,消费者1,2向队列取出消息并做处理
测试结果:
WinForm实现Rabbitmq官网6个案例-Publishe/Subscribe的更多相关文章
- WinForm实现Rabbitmq官网6个案例-RPC
获取源码 客户端代码: namespace RabbitMQDemo { public partial class RPC : Form { private readonly static RPC _ ...
- WinForm实现Rabbitmq官网6个案例-Work Queues
代码: namespace RabbitMQDemo { public partial class WorkQueues : Form { private string queueName = &qu ...
- WinForm实现Rabbitmq官网6个案例-Hello World
先上代码 namespace RabbitMQDemo { public partial class HelloWorld : Form { string queueName1 = "hel ...
- WinForm实现Rabbitmq官网6个案例-Topics
代码: namespace RabbitMQDemo { public partial class Topics : Form { private string exchangeName = &quo ...
- WinForm实现Rabbitmq官网6个案例-Routing
代码: namespace RabbitMQDemo { public partial class Routing : Form { private string exchangeName = &qu ...
- 官网英文版学习——RabbitMQ学习笔记(一)认识RabbitMQ
鉴于目前中文的RabbitMQ教程很缺,本博主虽然买了一本rabbitMQ的书,遗憾的是该书的代码用的不是java语言,看起来也有些不爽,且网友们不同人学习所写不同,本博主看的有些地方不太理想,为此本 ...
- 2022年官网下安装RabbitMQ最全版与官网查阅方法
目录 一.Erlang环境部署 1.百度搜索"Erlang",或者访问网址:https://www.erlang.org/,找到DOWNLOAD双击进入. 2.找到支持的windo ...
- Yeoman 官网教学案例:使用 Yeoman 构建 WebApp
STEP 1:设置开发环境 与yeoman的所有交互都是通过命令行.Mac系统使用terminal.app,Linux系统使用shell,windows系统可以使用cmder/PowerShell/c ...
- MXNet官网案例分析--Train MLP on MNIST
本文是MXNet的官网案例: Train MLP on MNIST. MXNet所有的模块如下图所示: 第一步: 准备数据 从下面程序可以看出,MXNet里面的数据是一个4维NDArray. impo ...
随机推荐
- Spring AOP 概述
1. AOP的概念 AOP 是Aspect-Oriented Programming(面向方面编程或者面向切面)的简称,维基百科对其解释如下: Aspect是一种新的模块化机制,用来描述分散在对象.类 ...
- Web安全篇之SQL注入攻击
在网上找了一篇关于sql注入的解释文章,还有很多技术,走马观花吧 文章来源:http://www.2cto.com/article/201310/250877.html ps:直接copy,格式有点问 ...
- Luogu P1342 请柬 题解
差不多是Dijkstra的裸题吧... 这道题可以分为来回两个阶段. 去的时候很简单,直接用一次Dijkstra,然后统计答案. 回来的时候就有些巧妙了,虽然表面上是每个点回到起点,但是何尝不可将其看 ...
- python 进程与线程(理论部分)
一.理论部分 一 什么是进程 进程:正在进行的一个过程或者说一个任务.而负责执行任务则是cpu. 举例(单核+多道,实现多个进程的并发执行): egon在一个时间段内有很多任务要做:python备课的 ...
- 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 ...
- Idea查看代码相关技巧
(1)查看类中的属性与方法快捷键 Alt+7 (2)查看方法被调用 在方法上右键find usages (3)查看方法说明 Ctrl+Q
- 使用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: ...
- 转载:怎么用eclipse开发C++程序(以后备用,待实现),使用CDT
一:准备工作:需下载以下三个软件包 a).Eclipse 3.1 官方站点: http://www.eclipse.org 工具下载地址:http://www.eclipse.org/download ...
- jQuery插件开发之boxScroll与marquee
BoxScroll 常见图片轮播效果的简单实现.可以数字列表控制或者左右按键控制.逻辑很简单,下面的Marquee形成环,这个到了尽头得往回跑,看看注释就知道了. 图片轮播GitHub:https:/ ...
- 设置主外键时 ORA-02298: 无法验证 - 未找到父项关键字 --NOVALIDATE;
主要原因是: 在添加CONSTRAINT的时候,默认是需要VALIDATE表中的已有数据的. 你要插入的表A里,有外键连接到另一个表B的主键,你在表A的外键列插入的值,在表B的主键列找不到就不能插入. ...