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. Shell 命令行快捷键

    在shell命令终端中.Ctrl+n相当于方向向下的方向键,Ctrl+p相当于方向向上的方向键. 在命令终端中通过它们或者方向键能够实现对历史命令的高速查找.这也是高速输入命令的技巧. 在命令终端中能 ...

  2. ibatis.net:第六天,QueryForList

    xml <statement id="FindOrdersByCustomer" parameterClass="string" resultClass= ...

  3. mysql 比较函数和操作符

    MYSQL之中的比较函数和操作符: 1.[NOT] BETWEEN ... AND ...  Check whether a value is within a range of values 说明: ...

  4. [Android Pro] AndroidStudio IDE界面插件开发(Hello World篇)

    转载请注明出处:[huachao1001的专栏:http://blog.csdn.net/huachao1001/article/details/53856916] 工欲善其事必先利其器,自打从Ecl ...

  5. caffe 生成检测框并绘图

    Step 1 使用训练好的模型检测图片: build/examples/ssd/ssd_detect.bin models/VGGNet/VOC0712/SSD_300x300/deploy.prot ...

  6. SKU与SPU

    首先,搞清楚商品与单品的区别.例如,iphone是一个单品,但是在淘宝上当很多商家同时出售这个产品的时候,iphone就是一个商品了. 商品:淘宝叫item,京东叫product,商品特指与商家有关的 ...

  7. [转]PHP与Shell交互

    From : http://blog.csdn.net/houqd2012/article/details/8219199 最近想使用PHP与Sheel进行交互.PHP控制显示和高层的逻辑结构.She ...

  8. 远程连接Oracle数据库

    ylbtech-Oracle:远程连接Oracle数据库  所谓远程连接Oracle数据库,是指Oracle数据库服务器和Oracle客户端分别安装在2台电脑上,我们使用Oracle客户端来连接在另一 ...

  9. AS 注解处理器 APT Processor MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  10. Cookie常用的优化方式

    我们知道,对于每一个http请求,无论是动态的网页aspx,还是jsp,还是/user/add这种MVC模式的URL,还是CSS或者JS文件,每一个http请求都会带着在硬盘上存有的跟这个域相关存有的 ...