您的位置:首页 > 其它

RabbitMq 安装和 Hello World--.Net

2015-09-22 14:54 253 查看
RabbitMq 对比MSMQ

环境 win10 64位系统

首先 下载 rabbitMq 服务器安装包RabbitMq3.5.4官方下载.

如果你有早期版本的Erlang环境 ,要先卸载掉,然后再安装最新Erlang 虚拟机

先安装完 Erlang 环境后 再安装刚下载到的 RabbitMq 3.5.4

下载 RabbitMq 的.net 类库 有兴趣也可以下载源码阅读

创建Send 项目 代码如下

[csharp] view
plaincopyprint?

static void Main(string[] args)

{

var factory = new ConnectionFactory();

factory.UserName = "guest";

factory.Password = "guest";

factory.VirtualHost = "/";

factory.HostName = "127.0.0.1";

var conn = factory.CreateConnection();

var channel = conn.CreateModel();

channel.ExchangeDeclare("exchange", ExchangeType.Direct);

channel.QueueDeclare("myRabbit", false, false, false, null);

channel.QueueBind("myRabbit", "exchange", "123", null);

byte[] messageBodyBytes = Encoding.UTF8.GetBytes("Hello World!!");

channel.BasicPublish("exchange", "123", null, messageBodyBytes);

}

创建接收项目,代码如下

[csharp] view
plaincopyprint?

var factory = new ConnectionFactory();

//用户名

factory.UserName = "guest";

//密码

factory.Password = "guest";

//此连接访问的虚拟主机

factory.VirtualHost = "/";

//主机名

factory.HostName = "127.0.0.1";

//创建连接

using (IConnection conn = factory.CreateConnection())

{<pre name="code" class="csharp"> //创建通道

using (IModel channel = conn.CreateModel()) { //普通接收消息(主动请求) bool noAck = false; BasicGetResult result = channel.BasicGet("myRabbit", noAck); if (result == null) { // No message available at
this time. Console.WriteLine("没有"); } else { IBasicProperties props = result.BasicProperties; byte[] body = result.Body; var str = Encoding.UTF8.GetString(body); Console.WriteLine(str); channel.BasicAck(result.DeliveryTag, false); } } } Console.ReadKey();
}

接收方 可以使用简单的 主动读取消息来处理. 也可以使用订阅的方式来自动获取到消息,代码如下

[csharp] view
plaincopyprint?

private static void Main(string[] args)

{

var factory = new ConnectionFactory();

//用户名

factory.UserName = "guest";

//密码

factory.Password = "guest";

//此连接访问的虚拟主机

factory.VirtualHost = "/";

//主机名

factory.HostName = "127.0.0.1";

//创建连接

//创建通道

using (IConnection conn = factory.CreateConnection())

{

using (IModel channel = conn.CreateModel())

{

//普通接收消息(主动请求)

//bool noAck = false;

//BasicGetResult result = channel.BasicGet("myRabbit", noAck);

//if (result == null)

//{

// // No message available at this time.

// Console.WriteLine("没有");

//}

//else

//{

// IBasicProperties props = result.BasicProperties;

// byte[] body = result.Body;

// var str = Encoding.UTF8.GetString(body);

// Console.WriteLine(str);

// channel.BasicAck(result.DeliveryTag, false);

//}

//订阅模式 (有消息到达将被自动接收) 消费者

var consumer = new EventingBasicConsumer(channel);

//注册接收事件

consumer.Received += (ch, ea) =>

{

var body = ea.Body;

var str = Encoding.UTF8.GetString(body);

Console.WriteLine(str);

//((EventingBasicConsumer)ch).Model.BasicAck(ea.DeliveryTag, false);

};

//要释放的资源

String consumerTag = channel.BasicConsume("myRabbit", false, consumer);

//当不希望继续订阅时,取消订阅(消费者)

//channel.BasicCancel(consumerTag);

Console.ReadKey();

}

}

}

安装和 Hello world 搞定

连接(Connection),与RabbitMQ Server建立的一个连接,由ConnectionFactory创建,每个connection只与一个物理的Server进行连接,此连接是基于Socket进行连接的,AMQP一般使用TCP链接来保证消息传输的可靠性

通道 (Channel),在C#客户端里应该是叫Model,其他客户端基本都叫Channel。建立在Connection基础上的一个通道,相对于Connection来说,它是轻量级的。它就像是Hibernate里面的Session一样。Channel 主要进行相关定义,发送消息,获取消息,事务处理等。Channel可以在多线程中使用,但是在必须保证任何时候只有一个线程执行命令。一个Connection可以有多个Channel。客户端程序有时候会是一个多线程程序,每一个线程都想要和RabbitMQ进行连接,但是又不想共享一个连接,这种需求还是比较普遍的。因为一个Connection就是一个TCP链接,RabbitMQ在设计的时候不希望与每一个客户端保持多个TCP连接,但这确实是有些客户端的需求,所以在设计中引入了Channel的概念,每一个Channel之间没有任何联系,是完全分离的。多个Channel来共享一个Connection。

交换器(Exchange),是发送消息的实体

队列(Queue),这是接收消息的实体

绑定器(Bind),将交换器和队列连接起来,并且封装消息的路由信息
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: