热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

RabbitMQ之队列与消息持久化

队列持久化在之前的例子中,我们所用的队列都是临时队列,当服务重启后之前创建的队列就都没有了。队列的持久化是在定义队列时的第二个参数决定的(false为队列不用持久化)channel.queueDecl
队列持久化

在之前的例子中,我们所用的队列都是临时队列,当服务重启后之前创建的队列就都没有了。

队列的持久化是在定义队列时的第二个参数决定的(false为队列不用持久化)

channel.queueDeclare(queueName, false, false,false,null);
     如果持久化标志设置为true,则代表是一个持久的队列,那么在服务重启后,也会存在。因为服务会把持久化的queue存放在硬盘上,当服务重启的时候,会重新申明之前被持久化的queue。队列是可以被持久化,但是里面的消息是否为持久化那还要看消息的持久化设置。也就是说,如果重启之前那个queue里面还有没有发出去的消息的话,重启之后那队列里面是不是还存在原来的消息,这个就要取决于发送者在发送消息时对消息的设置了。

消息持久化 如果要在重启后保持消息的持久化必须设置消息是持久化的标志
channel.basicPublish("", queueName, MessageProperties.PERSISTENT_TEXT_PLAIN, msg.getBytes());

示例代码
发送端:
import java.io.IOException;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.MessageProperties;

/**
* 消息持久化
* @author menghh
*
*/
public class Send04 {

public static void main(String[] args) throws IOException {
ConnectionFactory factory = new ConnectionFactory();
//RabbitMQ-Server安装在本机,所以直接用127.0.0.1
factory.setHost("127.0.0.1");
//创建一个连接
Connection cOnn= factory.newConnection();
//创建一个通信通道
Channel channel = conn.createChannel();
//定义Queue名称
String queueName = "queue01";
//为Channel定义queue的属性,queueName为queue名称
channel.queueDeclare(queueName, true, false,false,null);
String msg = "Hello World!";
//发送消息
/**
* 测试条件:1、在消息队列持久化的前提下2、接收消息方设置接收方式为手动接收,并不对接收消息进行确认
* 不采用消息持久化,重启RabbitMQ服务后,消息队列存在,消息接收不到
* 采用消息持久化,重启RabbitMQ服务后,消息队列存在,消息依然可以接收到消息,说明消息被持久化
*/
channel.basicPublish("", queueName, MessageProperties.PERSISTENT_TEXT_PLAIN, msg.getBytes());
//channel.basicPublish("", queueName, null, msg.getBytes());
System.out.println("send message["+msg+"] to "+queueName+"success!");
//关闭通道
channel.close();
//关闭连接
conn.close();
}
}


接收端(跟之前代码一样)
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.QueueingConsumer;
import com.rabbitmq.client.QueueingConsumer.Delivery;

/**
* 消息持久化
* @author menghh
*
*/
public class Recv04 {

public static void main(String[] args) throws Exception{
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("127.0.0.1");
Connection cOnn= factory.newConnection();
Channel channel = conn.createChannel();
String queueName = "queue01";
channel.queueDeclare(queueName, true, false, false, null);
//以上部分和sender一样
//配置好获取消息得方式
QueueingConsumer cOnsumer= new QueueingConsumer(channel);
channel.basicConsume(queueName, false,consumer);
//循环获取消息
while(true){
//获取消息,如果没有消息,这一步将会一直阻塞
Delivery delivery = consumer.nextDelivery();
String msg = new String(delivery.getBody());
//确认消息,已经收到
channel.basicAck(delivery.getEnvelope().getDeliveryTag(),false);
System.out.println("received message["+msg+"] from "+queueName);
}
}
}
测试结果:
运行程序后,队列存在,重启RabbitMQ Server后队列依然存在

消息持久化的测试方法 把消费者中确认接收消息的代码注释掉(前边提到过该操作),启动发送消息程序,重启RabbitMQ Server后消息依然可以接收到




推荐阅读
  • 本文详细介绍了如何使用 Python 编程语言中的 Scapy 库执行 DNS 欺骗攻击,包括必要的软件安装、攻击流程及代码示例。 ... [详细]
  • 1、编写一个Java程序在屏幕上输出“你好!”。programmenameHelloworld.javapublicclassHelloworld{publicst ... [详细]
  • Hadoop MapReduce 实战案例:手机流量使用统计分析
    本文通过一个具体的Hadoop MapReduce案例,详细介绍了如何利用MapReduce框架来统计和分析手机用户的流量使用情况,包括上行和下行流量的计算以及总流量的汇总。 ... [详细]
  • 本文旨在探讨Swift中的Closure与Objective-C中的Block之间的区别与联系,通过定义、使用方式以及外部变量捕获等方面的比较,帮助开发者更好地理解这两种机制的特点及应用场景。 ... [详细]
  • 深入理解线程池及其基本实现
    本文探讨了线程池的概念、优势及其在Java中的应用。通过实例分析不同类型的线程池,并指导如何构建一个简易的线程池。 ... [详细]
  • 本文详细解析 Skynet 的启动流程,包括配置文件的读取、环境变量的设置、主要线程的启动(如 timer、socket、monitor 和 worker 线程),以及消息队列的实现机制。 ... [详细]
  • 第1章选择流程控制语句1.1顺序结构的基本使用1.1.1顺序结构概述是程序中最简单最基本的流程控制,没有特定的语法结构,按照代码的先后顺序,依次执行,程序中大多数的代码都是这样执行 ... [详细]
  • 本文介绍了一个基本的同步Socket程序,演示了如何实现客户端与服务器之间的简单消息传递。此外,文章还概述了Socket的基本工作流程,并计划在未来探讨同步与异步Socket的区别。 ... [详细]
  • 本文介绍了一个将 Java 实体对象转换为 Map 的工具类,通过反射机制获取实体类的字段并将其值映射到 Map 中,适用于需要将对象数据结构化处理的场景。 ... [详细]
  • 本文介绍了如何利用Java编程语言中的正则表达式来验证字符串中的数字是否符合中国三大运营商(中国电信、中国联通、中国移动)的手机号码格式。文章提供了详细的代码示例和解析。 ... [详细]
  • SpringBoot底层注解用法及原理
    2.1、组件添加1、Configuration基本使用Full模式与Lite模式示例最佳实战配置类组件之间无依赖关系用Lite模式加速容器启动过程,减少判断配置类组 ... [详细]
  • 本文介绍了如何使用Java编程语言实现凯撒密码的加密与解密功能。凯撒密码是一种替换式密码,通过将字母表中的每个字母向前或向后移动固定数量的位置来实现加密。 ... [详细]
  • 编码unicode解决了语言不通的问题.但是.unicode又有一个新问题.由于unicode是万国码.把所有国家的文字都编进去了.这就导致一个unicode占用的空间会很大.原来 ... [详细]
  • 本文详细探讨了在Java中如何将图像对象转换为文件和字节数组(Byte[])的技术。虽然网络上存在大量相关资料,但实际操作时仍需注意细节。本文通过使用JMSL 4.0库中的图表对象作为示例,提供了一种实用的方法。 ... [详细]
  • 本文介绍了如何通过C#语言调用动态链接库(DLL)中的函数来实现IC卡的基本操作,包括初始化设备、设置密码模式、获取设备状态等,并详细展示了将TextBox中的数据写入IC卡的具体实现方法。 ... [详细]
author-avatar
萝莉吴文娟
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有