Rabbit 通过方式获取消息:订阅方式事实上是向queue注冊consumer,通过rpc向queue server发送注冊consumer的消息。rabbitMQ Server在收到消息后,依据消息的内容类型推断这是一个订阅消息。这样当MQ 中queue有消息时,会自己主动把消息通过该socket(长连接)通道发送出去。

能够通过

channel.basicQos(1); 

设置RabbitMQ调度分发消息的方式。也就是告诉RabbitMQ每次仅仅给消费者处理一条消息。也就是等待消费者处理完而且已经对刚才处理的消息进行确认之后, 才发送下一条消息。防止消费者太过于忙碌。例如以下图所看到的:

整理代码例如以下:

Produce

public class RabbitMQProduce {
public static void main(String[] args) throws IOException, InterruptedException {
ConnectionFactory factory =new ConnectionFactory();
String routingKey="test";
String exchange="test";
factory.setHost("localhost");
Connection conn = factory.newConnection();
Channel channel =conn.createChannel(); //发送消息
for(int i=0;i<8000;i++){
if(i%5==0){
Thread.sleep(200);
}
byte[] messageBodyBytes =(i+"").getBytes();
//假设将队列设置为持久化之后,还须要将消息也设为可持久化的。MessageProperties.PERSISTENT_TEXT_PLAIN
//也就是将队列设置为持久化之后。还须要将发送的消息也要设置为持久化才干保证队列和消息一直存在
//消费者在声明时也要做持久化声明
channel.basicPublish(exchange, routingKey, null, messageBodyBytes);
System.out.println("发送.."+i);
}
channel.close();
conn.close();
}
}

Customer

public class RabbitMqCustomer {
private static ConnectionFactory factory;
private static String QueryName="test";
private static Connection conn;
private static Channel channel;
private static String exchange="test";
private static String routingKey="test";
public static void main(String[] args) throws Exception {
start();
/**
* 採用订阅的方式获取消息
*/
channel.basicConsume(QueryName, false, new DefaultConsumer(channel){
@Override
public void handleShutdownSignal(String consumerTag,
ShutdownSignalException sig) {
System.out.println("==="+consumerTag+"====="+sig.getMessage());
boolean isOpenConnect = conn!=null&&conn.isOpen();
boolean isOpenChannel = channel != null && channel.isOpen();
while(!isOpenChannel||!isOpenConnect){
try {
System.out.println("连接失败重连接....");
start();
Thread.sleep(3000);
} catch (Exception e) {
e.printStackTrace();
}
}
} @Override
public void handleDelivery(String consumerTag, Envelope envelope,
BasicProperties properties, byte[] body) throws IOException {
//消息序号
long deliveryTag = envelope.getDeliveryTag();
String mes = new String(body,"UTF-8");
System.out.println("接受到消息:"+mes);
//确认收到,消息回执
channel.basicAck(deliveryTag, true);
}
});
} public static void start() throws IOException {
factory = new ConnectionFactory();
factory.setHost("localhost");
factory.setUsername("test");
factory.setPassword("test");
conn = factory.newConnection();
channel = conn.createChannel();
channel.exchangeDeclare(exchange, "topic");
channel.queueDeclare(QueryName, false, false, false, null);//声明消息队列,且为可持久化的
channel.queueBind(QueryName, exchange, routingKey);
channel.basicQos(1); //消息分发处理
}
}

Rabbit mq订阅方式获取消息并可设置持久化的更多相关文章

  1. Spring Boot and Rabbit MQ 异常的时候消息的状态

    我们有一个处理消息的方法. 在处理消息的时候出现了异常,那出现异常后这个消息会怎么处理呢. 根据我们的实际情况的观察,如果出现了异常. 但是你没有捕获或者处理异常,这个消息会一直存在,并且你的系统会持 ...

  2. rabbit MQ 消息队列

    为什么会需要消息队列(MQ)? 一.消息队列概述消息队列中间件是分布式系统中重要的组件,主要解决应用解耦,异步消息,流量削锋等问题,实现高性能,高可用,可伸缩和最终一致性架构.目前使用较多的消息队列有 ...

  3. Rabbit MQ 消息确认和持久化机制

    一:确认种类 RabbitMQ的消息确认有两种.一种是消息发送确认,用来确认生产者将消息发送给交换器,交换器传递给队列的过程中消息是否成功投递.发送确认分为两步,一是确认是否到达交换器,二是确认是否到 ...

  4. 在 Windows 上安装Rabbit MQ 指南

    rabbitMQ是一个在AMQP协议标准基础上完整的,可服用的企业消息系统.他遵循Mozilla Public License开源协议.采用 Erlang 实现的工业级的消息队列(MQ)服务器. Ra ...

  5. (转)在 Windows 上安装Rabbit MQ 指南

    rabbitMQ是一个在AMQP协议标准基础上完整的,可服用的企业消息系统.他遵循Mozilla Public License开源协议.采用 Erlang 实现的工业级的消息队列(MQ)服务器. Ra ...

  6. Rabbit MQ 入门指南

    rabbitMQ是一个在AMQP协议标准基础上完整的,可服用的企业消息系统.他遵循Mozilla Public License开源协议.采用 Erlang 实现的工业级的消息队列(MQ)服务器. Ra ...

  7. Rabbit MQ 面试题相关

    项目中的MQ: #rabbitmq spring.rabbitmq.host=127.0.0.1 主机 spring.rabbitmq.port=5672 端口 spring.rabbitmq.use ...

  8. Spring boot集成Rabbit MQ使用初体验

    Spring boot集成Rabbit MQ使用初体验 1.rabbit mq基本特性 首先介绍一下rabbitMQ的几个特性 Asynchronous Messaging Supports mult ...

  9. JMS学习(八)-ActiveMQ Consumer 使用 push 还是 pull 获取消息

    ActiveMQ是一个消息中间件,对于消费者而言有两种方式从消息中间件获取消息: ①Push方式:由消息中间件主动地将消息推送给消费者:②Pull方式:由消费者主动向消息中间件拉取消息.看一段官网对P ...

随机推荐

  1. CSS:如何学习 CSS?

    马上该转战互联网领域了,在此总结一下 CSS 学习的思路. 理解 CSS 的基本语法. 理解盒子模型. 理解文档流和定位. 理解浮动和清除. 理解各种 CSS 样式. 目前发现的最好的资源是:http ...

  2. jquery 图片文件转base64 显示

    <!DOCTYPE html> <html> <head> <meta name="viewport" content="wid ...

  3. 在EditText中限制输入,自定义样式,监听输入的字符,自动换行

    自动获取焦点 <!-- 添加:<requestFocus /> 会自动获取焦点 --> <EditText android:layout_width="matc ...

  4. Java中的Future模式原理自定义实现

    摘要:Future模式类似于js中的ajax等,是一个异步获取数据的机制,这里我把自己的一些形象理解通过代码实现了一下.该机制可以形象的理解为:调用获取数据的方法,首先获得一个没有装数据的空箱子(这个 ...

  5. [转]RSA,DSA等加解密算法介绍

    From : http://blog.sina.com.cn/s/blog_a9303fd90101cgw4.html 1)      MD5/SHA MessageDigest是一个数据的数字指纹. ...

  6. springmvc学习笔记(13)-springmvc注解开发之集合类型參数绑定

    springmvc学习笔记(13)-springmvc注解开发之集合类型參数绑定 标签: springmvc springmvc学习笔记13-springmvc注解开发之集合类型參数绑定 数组绑定 需 ...

  7. 试用ArcGIS Server 10.1 X64 for windows

    ArcGIS 10.1 发布已经很久了,其Server只支持x64,为此我还专门下载安装了windows Server 2003 x64,进行安装测试. 我测试了集群功能,比起10.0 ,没有使用域控 ...

  8. Sutherland-Hodgeman多边形裁剪

    原文地址:http://course.cug.edu.cn/cugFirst/computer_graphics/class/course/3-3-1-a.htm

  9. SQL SERVER CXPACKET-Parallelism Wait Type 的惯用解决方案

    最近我的两个库出现,出现较多的CXPACKET等待,在网上找了一下资料.其中有篇一个SQL Server专栏作家的文章不错,也解决了我的一些疑问,就翻译在这里. 翻译整理仅用于传播资讯之目的. 原文出 ...

  10. Python 中parse.quote类似JavaScript encodeURI() 函数

    from urllib import parse jsRet = 'roleO%2f'print(parse.unquote(jsRet))print(parse.quote(jsRet))输出: r ...