一.新建2个控制台程序分别为发送和接受
发送端代码:.
using RabbitMQ.Client;
using System;
using System.Text;
namespace rabitmq.core.send
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Start");
IConnectionFactory conFactory = new ConnectionFactory//创建连接工厂对象
{
HostName = "192.168.1.100",//IP地址
Port = 5672,//端口号
UserName = "liee",//用户账号 guest
Password = "123456",//用户密码 guest
VirtualHost = "VHostPath", //设置你设置的虚拟路径 默认是"/"
AutomaticRecoveryEnabled = true //自动连接恢复
};
using (IConnection con = conFactory.CreateConnection())//创建连接对象
{
using (IModel channel = con.CreateModel())//创建连接会话对象
{
String queueName = String.Empty;
if (args.Length > 0)
{
queueName = args[0];
}
else
{
queueName = "queue1";
}
//声明一个队列
channel.QueueDeclare(
queue: queueName,//消息队列名称
durable: false,//是否缓存
exclusive: false,
autoDelete: false,
arguments: null
);
while (true)
{
Console.WriteLine("消息内容:");
String message = Console.ReadLine();
//消息内容
byte[] body = Encoding.UTF8.GetBytes(message);
//发送消息
channel.BasicPublish(exchange: "", routingKey: queueName, basicProperties: null, body: body);
Console.WriteLine("成功发送消息:" + message);
}
}
}
}
}
}
接收端代码:
using RabbitMQ.Client;
using RabbitMQ.Client.Events;
using System;
using System.Text;
namespace rabitmq.core.Receive
{
public class Program
{
static void Main(string[] args)
{
Console.WriteLine("Start");
IConnectionFactory connFactory = new ConnectionFactory//创建连接工厂对象
{
HostName = "192.168.1.100",//IP地址
Port = 5672,//端口号
UserName = "liee",//用户账号 guest
Password = "123456",//用户密码 guest
VirtualHost = "VHostPath", //设置你设置的虚拟路径 默认是"/"
AutomaticRecoveryEnabled = true //自动连接恢复
};
using (IConnection conn = connFactory.CreateConnection())
{
using (IModel channel = conn.CreateModel())
{
String queueName = String.Empty;
if (args.Length > 0)
queueName = args[0];
else
queueName = "queue1";
//声明一个队列
channel.QueueDeclare(
queue: queueName,//消息队列名称
durable: false,//是否缓存
exclusive: false,
autoDelete: false,
arguments: null
);
//创建消费者对象
var consumer = new EventingBasicConsumer(channel);
consumer.Received += (model, ea) =>
{
var bodyBytes = ea.Body;
var message = Encoding.UTF8.GetString(bodyBytes.ToArray());
Console.WriteLine("接收到信息为:" +message.ToString());
};
//消费者开启监听
channel.BasicConsume(queue: queueName, autoAck: true, consumer: consumer);
Console.ReadKey();
}
}
}
}
}
二. 问题解决
2.1 遇到异常解决方法
RabbitMQ.Client.Exceptions.BrokerUnreachableException:“None of the specified endpoints were reachabl
原因
如错误信息中所示:找不到 virtual host
通过 guest 只能本地访问 localhost:15672/,并不能实现远程访问,所以当远程访问时,需要添加新用户才能访问。
1、进入 RabbitMQ 的 sbin 目录,打开 cmd
2、输入 rabbitmqctl add_user liee 123456 创建一个叫 liee密码 123456 的用户
3、输入 rabbitmqctl set_user_tags liee administrator 设置用户为管理员
4、输入 rabbitmqctl add_vhost VHOST 创建一个叫 VHOST 的虚拟用户目录
5、rabbitmqctl set_permissions -p VPHOST liee ".*" ".*" ".*" 为用户设置权限
到这里,就可以通过 目标ip:15672/ 访问远程 rabbitmq 了,前提是从你这里的电脑到目标服务器中途的所有防火墙都允许15672端口的访问,如果是在阿里云上面的服务器,那么不仅需要打开服务器的端口,还需要打开阿里云的端口
6、如果是在程序代码里使用 rabbitmq,还需要打开所有防火墙的 5672端口,因为 rabbitmq 的默认监听端口是 5672,网页管理的端口是 15672,这两个端口不能混为一谈。
方案:
三.效果