RabbitMQ学习之HelloWorld(1)
RabbitMQ就是一个消息代理(message broker),可以用来接收和发送消息。
消息队列有一些黑话,我们来看下:
- Producer : 发送message的程序
 
- Queue : 可以用来存储message
 
- Consumer : 接收message的程序
 
注意,producer 和 consumer 和 queue 可以在同一台主机,也可以不在同一台主机。通常不在
Hello World
如图,P表示producer , C 表示consumer . 中间的盒子表示queue

Sending

发送message的producer
Send.cs
using System;using RabbitMQ.Client;using System.Text;
class Send
{
public static void Main()
{
var factory = new ConnectionFactory() { HostName = "localhost" };
using(var connection = factory.CreateConnection()) //建立连接,如果我们想连接到一个不同机器的broker,我们可以指定一个名字或者ip
using(var channel = connection.CreateModel()) //建立通道,大多数api获取数据都在这里
{
channel.QueueDeclare(queue: "hello", //声明一个queue(用来把message发送过去)
durable: false,
exclusive: false,
autoDelete: false,
arguments: null); string message = "Hello World!";
var body = Encoding.UTF8.GetBytes(message); channel.BasicPublish(exchange: "", //实际发送的动作
routingKey: "hello",
basicProperties: null,
body: body);
Console.WriteLine(" [x] Sent {0}", message);
} Console.WriteLine(" Press [enter] to exit.");
Console.ReadLine();
}
}
如果你第一次使用RabbitMQ,并且发送message失败。那么有可能是the broker(代理:指RabbitMQ 或者说queue)启动的时候没有足够的硬盘空间(默认需要至少50M)因此拒绝接受请求。
你可以检查the broker 的日志文件来确认并且减少限制。详细 configuration file documentation
Receiving
对于consumer ,它用来从RabbitMQ监听message.所以,它会持续监听message.

Receive.cs
using RabbitMQ.Client;using RabbitMQ.Client.Events;using System;using System.Text;
class Receive
{
public static void Main()
{
var factory = new ConnectionFactory() { HostName = "localhost" };
using(var connection = factory.CreateConnection()) //建立连接
using(var channel = connection.CreateModel()) //建立通道
{
channel.QueueDeclare(queue: "hello", //声明queue
durable: false,
exclusive: false,
autoDelete: false,
arguments: null); var consumer = new EventingBasicConsumer(channel);
consumer.Received += (model, ea) => //回调函数
{
var body = ea.Body;
var message = Encoding.UTF8.GetString(body);
Console.WriteLine(" [x] Received {0}", message);
};
channel.BasicConsume(queue: "hello", //接受消息动作
autoAck: true,
consumer: consumer); Console.WriteLine(" Press [enter] to exit.");
Console.ReadLine();
}
}
}
注意,我们在这里也声明了queue.因为我们可能在启动publisher之前先启动consumer,所以我们在consume messages之前需要确保queue存在。
我们在接收queue中的message时是异步的,所以我们提供了一个回调函数。即 EventingBasicConsumer.Received
实际效果及代码改进
代码结构如下

本示例直接在一个解决方案中建立了两个控制台程序,用来send和receive 队列queue中的message.
代码使用上面讲述的代码,
效果如下:

上面的代码直接在程序启动后就发送了message.使看起来不是很直观,下面是对send.cs修改后的代码。
send.cs
public static void Main(string[] args)
{
var factory = new ConnectionFactory() { HostName = "localhost" };
using (var connection = factory.CreateConnection())
using (var channel = connection.CreateModel())
{
channel.QueueDeclare(queue: "hello",
durable: false,
exclusive: false,
autoDelete: false,
arguments: null); while (true)
{
var message = Console.ReadLine(); //string message = "Hello World!";
var body = Encoding.UTF8.GetBytes(message); channel.BasicPublish(exchange: "",
routingKey: "hello",
basicProperties: null,
body: body);
Console.WriteLine(" [x] Sent {0}", message); //Console.WriteLine(" Press [exit] to exit.");
}
} //Console.WriteLine(" Press [enter] to exit.");
//Console.ReadLine();
}
如上代码,使用while循环稍作修改,是可以持续手动输入message
效果如下

如上,可以看出,当想要持续发送时,我们在发送端加了while循环。
但是,接收端却不需要做任何修改,因为接收端本身是在持续监听queue里的message。
参考网址:RabbitMQ
RabbitMQ学习之HelloWorld(1)的更多相关文章
- RabbitMQ学习总结 第二篇:快速入门HelloWorld
		
目录 RabbitMQ学习总结 第一篇:理论篇 RabbitMQ学习总结 第二篇:快速入门HelloWorld RabbitMQ学习总结 第三篇:工作队列Work Queue RabbitMQ学习总结 ...
 - RabbitMQ学习总结 第三篇:工作队列Work Queue
		
目录 RabbitMQ学习总结 第一篇:理论篇 RabbitMQ学习总结 第二篇:快速入门HelloWorld RabbitMQ学习总结 第三篇:工作队列Work Queue RabbitMQ学习总结 ...
 - RabbitMQ学习总结 第一篇:理论篇
		
目录 RabbitMQ学习总结 第一篇:理论篇 RabbitMQ学习总结 第二篇:快速入门HelloWorld RabbitMQ学习总结 第三篇:工作队列Work Queue RabbitMQ学习总结 ...
 - RabbitMQ学习总结 第四篇:发布/订阅 Publish/Subscribe
		
目录 RabbitMQ学习总结 第一篇:理论篇 RabbitMQ学习总结 第二篇:快速入门HelloWorld RabbitMQ学习总结 第三篇:工作队列Work Queue RabbitMQ学习总结 ...
 - RabbitMQ学习总结 第五篇:路由Routing
		
目录 RabbitMQ学习总结 第一篇:理论篇 RabbitMQ学习总结 第二篇:快速入门HelloWorld RabbitMQ学习总结 第三篇:工作队列Work Queue RabbitMQ学习总结 ...
 - RabbitMQ学习总结 第六篇:Topic类型的exchange
		
目录 RabbitMQ学习总结 第一篇:理论篇 RabbitMQ学习总结 第二篇:快速入门HelloWorld RabbitMQ学习总结 第三篇:工作队列Work Queue RabbitMQ学习总结 ...
 - RabbitMQ学习之:(六)Direct Exchange (转贴+我的评论)
		
From: http://lostechies.com/derekgreer/2012/04/02/rabbitmq-for-windows-direct-exchanges/ RabbitMQ fo ...
 - RabbitMQ学习系列(四): 几种Exchange 模式
		
上一篇,讲了RabbitMQ的具体用法,可以看看这篇文章:RabbitMQ学习系列(三): C# 如何使用 RabbitMQ.今天说些理论的东西,Exchange 的几种模式. AMQP协议中的核心思 ...
 - RabbitMQ学习系列(三): C# 如何使用 RabbitMQ
		
上一篇已经讲了Rabbitmq如何在Windows平台安装,还不了解如何安装的朋友,请看我前面几篇文章:RabbitMQ学习系列一:windows下安装RabbitMQ服务 , 今天就来聊聊 C# 实 ...
 
随机推荐
- service  mesh架构
			
service mesh 系列文章 https://my.oschina.net/iamlipeng/blog/1631575 http://developer.51cto.com/art/2018 ...
 - 关于maven多个模块的build顺序 [INFO] Reactor Build Order
			
对于一个maven项目,如果有多个模块,那么它们的执行顺序是什么样的呢? 在执行mvn操作的时候,你可以看到如下信息,这个便是maven的build顺序 那么maven是如何决定顺序的呢?如下: 在多 ...
 - Scala入门到精通——第二十四节 高级类型 (三)
			
作者:摆摆少年梦 视频地址:http://blog.csdn.net/wsscy2004/article/details/38440247 本节主要内容 Type Specialization Man ...
 - hdu 3549 Flow Problem(最大流模板题)
			
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3549 Problem Description Network flow is a well-known ...
 - Android +NDK+eclipse+opengl ES2.0 开启深度測试
			
參考:https://www.opengl.org/discussion_boards/showthread.php/172736-OpenGL-ES-Depth-Buffer-Problem 环境: ...
 - 【转载】C# 装箱和拆箱[整理]
			
1. 装箱和拆箱是一个抽象的概念 2. 装箱是将值类型转换为引用类型 :拆箱是将引用类型转换为值类型 利用装箱和拆箱功能,可通过允许值类型的任何值与Object 类型的 ...
 - 修正iOS从照相机和相册中获取的图片 方向
			
修正iOS从照相机和相册中获取的图片 方向 修正iOS从照相机和相册中获取的图片 方向 使用系统相机拍照得到的图片的默认方向有时不是ImageOrientationDown,而是ImageOrie ...
 - EF Code-First 学习之旅 数据库初始化 (二)
			
Context类的基类构造函数有如下的参数 1.无参数 如果没有给基类构造函数添加参数,它会在local SQLEXPRESS server创建数据库,名为{Namespace}.{Context c ...
 - 在Android用ZXing.jar识别二维码的精简版(简化了配置和代码)
			
近期公司做了一款OTP令牌激活的产品,因为之前激活手机令牌须要输入非常多的激活信息才干进行激活. 经过一段使用后,发现易用性不是非常强,考虑假设添加二维码的的扫码功能岂不是大大添加了易 ...
 - (2)mac下安装MySql数据库软件
			
一,软件下载: https://dev.mysql.com/downloads/mysql/ 也可以从其他资源下载.不一定非要官方下载 二,安装 这个比较简单,之间双击开启安装程序,一直下一步就可以. ...