其他分享
首页 > 其他分享> > 中间件

中间件

作者:互联网

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

                                       

 

 生产者:

 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