ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

中间件

2022-08-20 00:32:36  阅读:261  来源: 互联网

标签:connectionFactory 队列 中间件 connection null 连接 channel


 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

                                       

 

 生产者:

 1 package com.learn.rabbitmq.simple;
 2 
 3 import com.rabbitmq.client.Channel;
 4 import com.rabbitmq.client.Connection;
 5 import com.rabbitmq.client.ConnectionFactory;
 6 
 7 public class Producer {
 8     public static void main(String[] args) {
 9         // 1: 创建连接工厂
10         ConnectionFactory connectionFactory = new ConnectionFactory();
11         //2: 设置连接属性
12         connectionFactory.setHost("127.0.0.1");
13         connectionFactory.setPort(5672);
14         connectionFactory.setVirtualHost("/");
15         connectionFactory.setUsername("guest");
16         connectionFactory.setPassword("guest");
17         Connection connection = null;
18         Channel channel = null;
19         try {
20             // 3: 从连接工厂中获取连接
21             connection = connectionFactory.newConnection("生产者");
22             // 4: 从连接中获取通道channel
23             channel = connection.createChannel();
24             // 5: 申明队列queue存储消息
25             /*
26              *  如果队列不存在,则会创建
27              *  Rabbitmq不允许创建两个相同的队列名称,否则会报错。
28              *
29              *  @params1: queue 队列的名称
30              *  @params2: durable 队列是否持久化    false 非持久化,也会存盘,但是随着服务器重启,数据会丢失
31              *  @params3: exclusive 是否排他,即是否私有的,如果为true,会对当前队列加锁,其他的通道不能访问,并且连接自动关闭
32              *  @params4: autoDelete 是否自动删除,当最后一个消费者断开连接之后是否自动删除消息。
33              *  @params5: arguments 可以设置队列附加参数,设置队列的有效期,消息的最大长度,队列的消息生命周期等等。
34              * */
35             channel.queueDeclare("queueTest",false,false,false,null);
36             // 6: 准备发送消息的内容
37             String msg = "hello world!";
38             // 7: 发送消息给中间件rabbitmq-server
39             // @params1: 交换机exchange
40             // @params2: 队列名称/routing
41             // @params3: 属性配置
42             // @params4: 发送消息的内容
43             channel.basicPublish("","queueTest",null,msg.getBytes());
44             System.out.println("消息发送成功!");
45         } catch (Exception e) {
46             e.printStackTrace();
47             System.out.println("发送消息出现异常!");
48         }finally {
49             if (channel != null && channel.isOpen()){
50                 try {
51                     channel.close();
52                 } catch (Exception e) {
53                     e.printStackTrace();
54                 }
55             }
56             if (connection != null){
57                 try {
58                     connection.close();
59                 }catch (Exception e){
60                     e.printStackTrace();
61                 }
62             }
63         }
64     }
65 }

消费者

 1 package com.learn.rabbitmq.simple;
 2 
 3 import com.rabbitmq.client.*;
 4 
 5 import java.io.IOException;
 6 
 7 public class Customer {
 8     public static void main(String[] args) {
 9         // 1: 创建连接工厂
10         ConnectionFactory connectionFactory = new ConnectionFactory();
11         //2: 设置连接属性
12         connectionFactory.setHost("127.0.0.1");
13         connectionFactory.setPort(5672);
14         connectionFactory.setVirtualHost("/");
15         connectionFactory.setUsername("guest");
16         connectionFactory.setPassword("guest");
17         Connection connection = null;
18         Channel channel = null;
19         try {
20             // 3: 从连接工厂中获取连接
21             connection = connectionFactory.newConnection("消费者");
22             // 4: 从连接中获取通道channel
23             channel = connection.createChannel();
24             // 5: 创建交换机,声明队列,绑定关系,路由key,发视信息,接收信息
25             channel.basicConsume("queueTest", true, new DeliverCallback() {
26                 public void handle(String consumerTag, Delivery delivery) throws IOException {
27                     System.out.println("收到的信息是:" + new String(delivery.getBody(), "UTF-8"));
28                 }
29             }, new CancelCallback() {
30                 public void handle(String s) throws IOException {
31                     System.out.println("接收失败了!");
32                 }
33             });
34             System.out.println("开始接收信息!");
35             //阻断作用,不往下继续执行
36             System.in.read();
37         } catch (Exception e) {
38             e.printStackTrace();
39             System.out.println("发送消息出现异常!");
40         }finally {
41             if (channel != null && channel.isOpen()){
42                 try {
43                     channel.close();
44                 } catch (Exception e) {
45                     e.printStackTrace();
46                 }
47             }
48             if (connection != null){
49                 try {
50                     connection.close();
51                 }catch (Exception e){
52                     e.printStackTrace();
53                 }
54             }
55         }
56     }
57 }

面试题

为什么rabbitmq是基于通道处理而不是连接呢?   

因为连接需要结果三次握手,四次挥手,费时间,关闭,连接性能消耗大。所以通过长连接---------有很多个信道 channel  处理  所以性能高

 

 

 

 可靠消费机制

手动应答,代码和NACK确定,可靠消费,ACK机制 AutoAck  为true 正常应答,服务端就会将消息队列的信息移除,整个过程正常,为false,不应答,就会不停重试,直到消费为止,如果出现异常,就会可能无限重试,服务器资源消耗殆尽。消息队列被挂起,就会屏蔽生产者的消息接收。

 

 

 

 

 

 

 

 

 

 

 

 

 

标签:connectionFactory,队列,中间件,connection,null,连接,channel
来源: https://www.cnblogs.com/hs-note/p/16606975.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有