1.声明
当前内容用于本人学习和复习之用,内容主要包括Connections的使用
当前内容主要来源:RabbitMQ官方文档
2.官方Connections介绍
AMQP 0-9-1 connections are typically long-lived. AMQP 0-9-1 is an application level protocol that uses TCP for reliable delivery. Connections use authentication and can be protected using TLS. When an application no longer needs to be connected to the server, it should gracefully close its AMQP 0-9-1 connection instead of abruptly closing the underlying TCP connection.
AMQP 0-9-1 连接都是长连接。AMQP 0-9-1通过TCP来实现程序协议传递的。连接使用认证,通常使用TLS保护。当一个程序不再需要连接到这个服务时候,他应该关闭AMQP 0-9-1连接而不是突然关闭TCP连接
分析上文:Connection通常都是采用TCP方式的长连接,该连接使用TLS来实现认证方式,当不再使用连接的时候应该关闭AMQP的连接而不是TCP连接
3.通过官方查看Connections的生命周期
-
In order for a client to interact with RabbitMQ it must first open a connection. This process involves a number of steps:
1.1 Application configures the client library it uses to use a certain connection endpoint (e.g. hostname and port)
1.2 The library resolves the hostname to one or more IP addresses
1.3 The library opens a TCP connection to the target IP address and port
1.4 After the server has accepted the TCP connection, protocol-specific negotiation procedure is performed
1.5 The server then authenticates the client
1.6 The client now can perform operations, each of which involves an authorisation check by the server.
This flow doesn’t change significantly from protocol to protocol but there are minor differences.
客户端为了和RabbitMQ进行交互通常需要打开一个连接。这个是处理的步骤:
- 程序为当前的客户端连接配置一个连接点(主机和端口)
- 该库将会解析主机位一个或者多个ip地址
- 该库将会打开一个tcp连接到目标ip地址和端口
- 服务器已经接收tcp连接,那么就会执行协议协商
- 服务器然后将认证该客户端
- 这个(已认证)客户端现在就允许执行操作了,每次操作服务都会启用认证
这个协议的流程对于不同的的版本是没有太多的变化
4.查看连接和状态
1.通过上面分析如果客户端连接到RabbitMQ服务的时候就会开启一个TCP协议,进行认证操作,认证成功就会客户端就可以操作RabbitMQ服务了(但是每次都会认证)
2.启动客户端连接当前的sever
3.通过ui界面查看connection
4.查看这个连接
从上面发现了一个Connection连接为62207,但是它可以连接到5672(句柄),所以一个连接可以打开多个Channel
5.通过控制台查看连接状况
发现5672和62207建立连接:使用ESABLISHED(表示正在通信)
62207与5672建立连接:使用ESABLISHED(表示正在通信)
这说明这个通信是双向通信的
5.测试从ui界面关闭连接
编写代码处理连接关闭的消费者
public class PrefetchingMessages3Test {
public static void main(String[] args) throws Exception {
RabbitMqUtils mqUtils = new RabbitMqUtils();
Connection connection = mqUtils.getConnection();
Channel channel = connection.createChannel();
connection.addShutdownListener(x -> {
System.out.println("connection 关闭原因===>"+x.getReason());
try {
connection.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
});
channel.addShutdownListener(x -> {
System.out.println("channel 关闭原因===>"+x.getReason());
try {
channel.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (TimeoutException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
});
// 开启自动确认
channel.basicConsume("hello", false, new DefaultConsumer(channel) {
@Override
public void handleDelivery(String consumerTag, Envelope envelope, BasicProperties properties, byte[] body)
throws IOException {
// 限定消费的条数
System.out.println("消费者3开始处理消息====>" + new String(body, "utf-8"));
channel.basicAck(envelope.getDeliveryTag(), false);
}
});
}
}
直接为当前Connection添加关闭监听:addShutdownListener,该监听就是用于关闭connection的
直接为当前的Channel添加关闭监听:addShutdownListener,该监听就是用于关闭channel的
首先运行客户端,然后直接在ui界面执行关闭连接操作,此时控制台结果为:
等待数秒后控制台自动关闭
6.总结
1.一个Connection可以开启多个Channel,并且是双向通信的
2.程序中可以为Connection和Channel都添加addShutdownListener监听事件,从而实现关闭Connection和Channel的目的
3.一个客户端连接到RabbitMQ Server的时候,需要首先被分配端口并注册,然后认证,最后才能访问,并且每次访问都需要认证
以上纯属个人见解,如有问题请联系本人!
转载:https://blog.csdn.net/weixin_45492007/article/details/106155545