在Mq中connection以及Channel Exchange Queue 是什么样的关系,我们可以从下图可以可以进行了解,图片来自黑马公开课视频。我们不管作为消息的生产者(Producer)或者消费者(Consumer)都是作为客户端(Client)连接到MQ服务器(Blocker Node)上。在生产者和消费者与RabbitMQ-Server 之间都是通过Connection进行连接。在Connection中存在Channel。消息通过连接发送到服务器上首先接收到的为交换机(Exchange),交换机根据消息信息以及交换机绑定的队列信息,分发到相应的消息队列(Queue)上。最后通过消费端的连接发送到消费者客户端上。
在上一篇文章中我们讲解了RabbitMQ的安装介绍,最后我们启动后打开了一个RabbitMQ的一个控制台登录界面。接下来我们介绍一下登录控制台后的一些界面介绍。
当前Mq运行中的当前保持连接的连接信息,其中包含了连接的虚拟主机路径(virtual host),链接的主机及端口、那个用户连接的,状态等信息。在java代码中通过ConnectionFactory 的 newConnection() 后进行创建一个连接,此时通过当前页面便可以展示列出来。当使用connection.close()之后 连接将关闭。
//创建连接工厂
ConnectionFactory connectionFactory = new ConnectionFactory();
//设置主机地址
connectionFactory.setHost("172.18.255.186");
//设置连接端口
connectionFactory.setPort(5672);
//设置虚拟主机地址
connectionFactory.setVirtualHost("/myhost");
//设置链接用户名以及密码
connectionFactory.setUsername("xiaohui");
connectionFactory.setPassword("root");
//创建连接
Connection connection = connectionFactory.newConnection();
链接中的信道信息:Channel是在连接中存在的,一个Connection中可以有多个Channel。在Java代码中 通过连接来创建信道。当代码执行完 connection.createChannel(); 之后我们通过如下界面可以看到新创建的信道信息。
创建信道java代码如下(ConnectionUtils为自定义的一个工具类,其中getConnection方法实现代码为上面connections介绍中代码):
Connection connection = ConnectionUtils.getConnection();
//创建渠道
Channel channel = connection.createChannel();
Exchange作为消费的生产者和消息队列的一个中介,其将Producer生产的消息进行分发给消息队列。在没有使用交换机的简单模式中,实际上则使用的是默认的交换机(AMQP-Default)
在使用交换机前我们需要对交换机进行声明(declared ),声明之后我们还需要将消息队列进行绑定到交换机上。
//获取连接
Connection connection = ConnectionUtils.getConnection();
//创建信道
Channel channel = connection.createChannel();
//声明交换机
/**
* 参数一:交换机名称
* 参数二:交换机类型:fanout \topic \direct
*/
channel.exchangeDeclare(Producer.FANOUT_EXCHANGE, BuiltinExchangeType.FANOUT);
/**
* 声明队列
* durabe:持久化的消息,mq重启后消息仍在。
* exclusive :独占的,一个消息队列独占一个连接
*/
channel.queueDeclare(Producer.FANOUT_QUEUE_1,true,false,false,null);
channel.queueDeclare(Producer.FANOUT_QUEUE_2,true,false,false,null);
//队列绑定交换机
channel.queueBind(Producer.FANOUT_QUEUE_1,Producer.FANOUT_EXCHANGE,"");
channel.queueBind(Producer.FANOUT_QUEUE_2,Producer.FANOUT_EXCHANGE,"");
消息队列,在控制台页面中我们在queues页签中我们可以看到服务器端当前的消息队列信息。在java代码中我们需要先对消息队列进行声明后才可以使用。点击某一队列,在队列中我们也可以查看当前队列的消息信息。
Java 声明以及发送消息代码如下:
Connection connection = ConnectionUtils.getConnection();
//创建渠道
Channel channel = connection.createChannel();
//声明创建队列
channel.queueDeclare(QUEUE_NAME,true,false, false, null);
//发送消息
String msg = "再来一条hahahah。。。。";
channel.basicPublish("",QUEUE_NAME,null,msg.getBytes());
//释放资源(关闭渠道 以及连接)
channel.close();
connection.close();
在Admin的user下我们可以查询当前的MQ用户信息,以及新增用户信息并设置权限。
在Admin的Virtual Host下我们可以查看当前MQ的虚拟主机地址