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. Linux学习4-阿里云服务器(CentOS)下使用 Tomcat安装 Jenkins

    前言 通常做自动化测试,需要用到jenkins来做持续集成,那么linux系统里面如何使用tomcat安装Jenkins环境呢? 前面一篇已经搭建好java和tomcat环境,接着直接下载jenkin ...

  2. node.js模块的坑

    在写一个工具的时候,需要将xml转为json方便处理,以前电脑上装的node.js的版本为0.8,结果我再安装node-xml2json时提示版本过低,然后我又重装安装了最新版本. 然后再次尝试安装, ...

  3. ScrollView滚动条的各种设置

    ScrollView滚动条不显示:android:scrollbars="none"ScrollView滚动条恒显示:android:fadeScrollbars="fa ...

  4. Tornado开发技巧,简单了解tornado

    tornado基础入门(一)——简单了解tornado 参考:http://demo.pythoner.com/itt2zh/ch1.html tornado是一个轻量级的web框架,是一个用pyth ...

  5. Java工程师成神之路~(2018修订版)

    针对本文,博主最近在写<成神之路系列文章> ,分章分节介绍所有知识点.欢迎关注. 主要版本 更新时间 备注 v1.0 2015-08-01 首次发布 v1.1 2018-03-12 增加新 ...

  6. 光流法(optical flow)

    光流分为稠密光流和稀疏光流 光流(optic flow)是什么呢?名字很专业,感觉很陌生,但本质上,我们是最熟悉不过的了.因为这种视觉现象我们每天都在经历.从本质上说,光流就是你在这个运动着的世界里感 ...

  7. Guava Enums

    概述 Enums提供了几个操作Enum的便利方法 常用方法 Field getField(Enum<?> enumValue): 返回变量名为enumValue变量值的Field < ...

  8. maskrcnn_benchmark代码分析(3)

    数据结构 数据加载 数据后处理

  9. C++ stringstream格式化输出输入探索

    - 最近在笔试时经常遇见各种输入问题,于是细心总结一波: - 首先string str; cin>>str;遇到空格结束: - 于是乎产生了getline(),可与得到一行字符串:空格自动 ...

  10. LeetCode 754. Reach a Number到达终点数字

    题目 在一根无限长的数轴上,你站在0的位置.终点在target的位置. 每次你可以选择向左或向右移动.第 n 次移动(从 1 开始),可以走 n 步. 返回到达终点需要的最小移动次数. 示例 1: 输 ...