代码:

namespace RabbitMQDemo
{
public partial class Routing : Form
{
private string exchangeName = "direct_logs";
private string exchangeType = ExchangeType.Direct;//垂直交换机
private readonly static Routing _Routing;
Action<string, TextBox> SetText;
static Routing()
{
_Routing = new Routing();
}
/// <summary>
/// 单例模式
/// </summary>
public static Routing SingleForm { get { return _Routing; } }
private Routing()
{
CheckForIllegalCrossThreadCalls = false;
InitializeComponent();
ReceiveMsg(txtConsumer1);
ReceiveMsg(txtConsumer2);
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 routingKey = cbBoxLevel.SelectedValue; var body = Encoding.UTF8.GetBytes(message);
channel.BasicPublish(exchange: exchangeName,
routingKey: routingKey.ToString(),
basicProperties: null,
body: body);
}
} 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); var queueName = channel.QueueDeclare().QueueName; if (box.Name == "txtConsumer1")
{//消费者1能接受info和error的消息
channel.QueueBind(queue: queueName,
exchange: exchangeName,
routingKey: "info");
channel.QueueBind(queue: queueName,
exchange: exchangeName,
routingKey: "error");
}
else if (box.Name == "txtConsumer2")
{//消费者2能接受debug和error的消息
channel.QueueBind(queue: queueName,
exchange: exchangeName,
routingKey: "debug");
channel.QueueBind(queue: queueName,
exchange: exchangeName,
routingKey: "error");
} var consumer = new EventingBasicConsumer(channel);
consumer.Received += (model, ea) =>
{
var msg = Encoding.UTF8.GetString(ea.Body); box.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)
{
var split_Result = text.Split(':');
if (split_Result.Length >= )
text = split_Result[];
box.Text += string.Format("{0}\r\n", text);
} private void Routing_Load(object sender, EventArgs e)
{
List<Receiver> lst = new List<Receiver>();
lst.Add(new Receiver("消费者1", "info"));
lst.Add(new Receiver("消费者2", "debug"));
lst.Add(new Receiver("消费者1,消费者2", "error")); cbBoxLevel.DataSource = lst;
cbBoxLevel.DisplayMember = "DisplayMember";
cbBoxLevel.ValueMember = "ValueMember";
cbBoxLevel.DropDownStyle = ComboBoxStyle.DropDownList;
} private class Receiver
{
public Receiver(string displayMember, string valueMember)
{
DisplayMember = displayMember;
ValueMember = valueMember;
}
public string DisplayMember { get; set; }
public string ValueMember { get; set; }
}
}
}

界面:

大概流程:

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

测试结果:

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

  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个案例-Topics

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

  6. WebApi2官网学习记录---Attribute Routing

    从WebApi 1迁移到WebAPI 2要改变配置代码如下: WebApi 1: protected void Application_Start() { // WARNING - Not compa ...

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

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

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

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

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

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

随机推荐

  1. iOS 时区获取问题

    时区缩写 UTC, CST, GMT, CEST 以及转换 UTC是协调世界时(Universal Time Coordinated)英文缩写,是由国际无线电咨询委员会规定和推荐,并由国际时间局(BI ...

  2. 架构师养成记--29.redis开篇

    主要有从下几点讲解 NOSQL(Redis) 简介.redis安装与部署 Redis基础事件类型详解 Redis高级命令 Redis与java的使用 Redis集群搭建 Redis集群与spring的 ...

  3. day1: python3.5学习

    1. 基础知识 变量:用于存储信息,方便后面的调用 常量:python中是没有常量这一概念的,若想定义一个常量,需要将变量名大写 举例:name = "Helen"   #定义一个 ...

  4. 根据域名获取ip地址gethostbyname

    #include <sys/socket.h> #include <stdio.h> #include <netdb.h> int main(int argc, c ...

  5. SpringBoot 整合 中国移动 MAS HTTP1.0 实现短信发送服务

    因为客户需要,本身使用的 阿里云的短信服务改为了中国移动MAS HTTP 1.0  短信通知,因为看到网络上关于此类的博客知识很少,再趟完坑后特地写下这篇博客,提醒后来人. 特别感谢 中国移动MAS ...

  6. Node.js环境搭建&&npm安装

    Node.js环境搭建 什么使Node.js呢?我们知道JavaScript开始作为客户端语言,但早已在浏览器端一统江湖,这时,野心越来越大,它就想向服务器端拓展了,于是Node.js就是这样的,我们 ...

  7. VMware Workstation中虚拟机的克隆

    1 克隆虚拟机 首先需要准备好一个安装好的系统,这里以linux为例进行演示. 在需要克隆的机器上右键选择管理==>克隆 选择需要克隆的虚拟机的状态,如果你想要的就是当前的状态,就直接选择虚拟机 ...

  8. You have not concluded your merge. (MERGE_HEAD exists)。(转)

    自己简直就是一个git小白,碰到问题,一点点的解决吧,可能不太系统,但也只能勤能补拙了 Git本地有修改如何强制更新 本地有修改和提交,如何强制用远程的库更新更新.我尝试过用git pull -f,总 ...

  9. Ubuntu 16.04安装测试MQTT Mosquitto

    环境:Ubuntu 16.04 介绍MQTT MQTT是一种机器到机器的消息传递协议,旨在为“物联网”设备提供轻量级的发布/订阅通信.它通常用于地理跟踪车队,家庭自动化,环境传感器网络和公用事业规模数 ...

  10. Paypal如何实现循环扣款(订阅)?

    起因 业务需求要集成Paypal,实现循环扣款功能,然而百度和GOOGLE了一圈,除官网外,没找到相关开发教程,只好在Paypal上看,花了两天后集成成功,这里对如何使用Paypal的支付接口做下总结 ...