三个方面保证消息的可靠性

  1.消息的持久

  2.事物

  3.签收

一:PERSISTENT:持久性

    参数说明:1.持久

         2.非持久

  Java里面设置持久化和非持久

  持久:

    将持久性设置为持久

    宕机前,数据正常,未被消费

    服务器恢复后,数据仍然存在,未被消费的消息为3  

  非持久

    设置为非持久

    宕机前

    服务器恢复后,消息全部丢失

  上面例子指定了持久化和非持久化,如果不指定的话默认为持久化

  以上是针对队列模式(queue)

   主题模式(Topic)

    主题模式的持久化是针对订阅者,因为订阅模式下生产者将消息发送出去就啥也不管了,如果没有订阅者,消息就等于是废消息,一点意义也没有,所以应该在消费者端进行持久化

    实验:

       1.首先消费者先订阅:如图一个订阅者(在线)

    代码:

package com.steak.activemq.test;

import org.apache.activemq.ActiveMQConnectionFactory;

import javax.jms.*;

import java.io.IOException;

public class Consumer {

private static final StringACTIVE_URL ="tcp://127.0.0.1:61616";

    private static final StringQUEUE ="topic_persist";

    public static void main(String[] args)throws JMSException, IOException {

//创建连接工厂

        ActiveMQConnectionFactory activeMQConnectionFactory =new ActiveMQConnectionFactory(ACTIVE_URL);

        //通过连接工厂,获得连接

        Connection connection = activeMQConnectionFactory.createConnection();

        connection.setClientID("刘牌");//订阅者

        //创建session,第一个参数叫事物,第二个叫签收

        Session session = connection.createSession(false,Session.AUTO_ACKNOWLEDGE);

        //创建目的地

        Topic topic = session.createTopic(QUEUE);

        //持久订阅者

        TopicSubscriber topicSubscriber = session.createDurableSubscriber(topic,"remark");

        connection.start();

        Message message = topicSubscriber.receive();

        while (null != message){

TextMessage textMessage = (TextMessage) message;

            System.out.println("topic持久化的消息  "+textMessage.getText());

            //如果1秒钟以后收不到消息,自动断开,相当于取关

            message = topicSubscriber.receive(1000L);

        }

session.close();

        connection.close();

    }

}

     2.然后启动生产者(发布者):此时发布了三条,订阅者收到了三条

  代码:

package com.steak.activemq.test;

import org.apache.activemq.ActiveMQConnectionFactory;

import javax.jms.*;

public class Producer {

private static final StringACTIVE_URL ="tcp://127.0.0.1:61616";

    private static final StringQUEUE ="topic_persist";

    public static void main(String[] args)throws JMSException {

//创建连接工厂

        ActiveMQConnectionFactory activeMQConnectionFactory =new ActiveMQConnectionFactory(ACTIVE_URL);

        //通过连接工厂,获得连接

        Connection connection = activeMQConnectionFactory.createConnection();

        //创建session

        Session session = connection.createSession(false,Session.AUTO_ACKNOWLEDGE);

        //创建目的地

        Topic topic = session.createTopic(QUEUE);

        //创建消息的生产者

        MessageProducer messageProducer = session.createProducer(topic);

            connection.start();

        //通过使用messageProducer生产消息发送到MQ队列里

        for (int i =0 ; i <3 ; i++){

//创建消息

            TextMessage textMessage = session.createTextMessage("消息 "+i);

            //通过messageProducer发送消息

            messageProducer.send(textMessage);

        }

//关闭资源

        messageProducer.close();

        session.close();

        connection.close();

        System.out.println("消息发送完成");

    }

}

  因为我们设置了1秒钟过后如果收不到消息就断开连接,所以消费者从在线变为离线

    如果设置为receive(),则一直监听(相当于微信公众号一直都关注,一直都能收到消息)

  无论消费者是否在线,都会接收到,不在线的话,下次连接的时候,会把没有收到的消息都接收过来(相当于我取关了,不能收到消息,但是我再此关注,我也能把我取关的这段时间的消息都收到),前提时注册过一次,第一注册以前的消息肯定是收不到

  

ActiveMQ消息可靠性-持久性的更多相关文章

  1. ActiveMQ消息可靠性-签收

    非事务模式下消费者签收 动签收就像快递到达时,快递寄送点给你签收了,不用你自己去签收,而手动签收就是必须我本人签收, 自动签收(默认为自动签收) 手动签收:能够避免消息的重复消费 当设置为手动签收时, ...

  2. ActiveMQ消息可靠性-事物

    事物偏生产者,签收偏消费者 设置为true,需要手动提交    设置为false,自动提交   使用手动提交的好处就是可以回滚,当整个事物提交时,里面的某条失败了,可以事物回滚,于是保证了数据的一致性 ...

  3. ActiveMQ消息的可靠性机制(转)

    文章转自:http://www.linuxidc.com/Linux/2013-02/79664.htm 1.JMS消息确认机制 JMS消息只有在被确认之后,才认为已经被成功地消费了.消息的成功消费通 ...

  4. 消息中间件-activemq消息机制和持久化介绍(三)

    前面一节简单学习了activemq的使用,我们知道activemq的使用方式非常简单有如下几个步骤: 创建连接工厂 创建连接 创建会话 创建目的地 创建生产者或消费者 生产或消费消息 关闭生产或消费者 ...

  5. 转载:ActiveMQ的可靠性机制

    1.JMS消息确认机制 JMS消息只有在被确认之后,才认为已经被成功地消费了.消息的成功消费通常包含三个阶段:客户接收消息.客户处理消息和消息被确认.在事务性会话中,当一个事务被提交的时候,确认自动发 ...

  6. 深入浅出 JMS(三) - ActiveMQ 消息传输

    深入浅出 JMS(三) - ActiveMQ 消息传输 一.消息协商器(Message Broker) broke:消息的交换器,就是对消息进行管理的容器.ActiveMQ 可以创建多个 Broker ...

  7. RabbitMQ 和 Kafka 的消息可靠性对比

    RabbitMQ和Kafka都提供持久的消息保证.两者都提供至少一次和至多一次的保证,另外,Kafka在某些限定情况下可以提供精确的一次(exactly-once)保证. 让我们首先理解一下上述术语的 ...

  8. RabbitMQ高级之如何保证消息可靠性?

    人生终将是场单人旅途,孤独之前是迷茫,孤独过后是成长. 楔子 本篇是消息队列RabbitMQ的第四弹. RabbitMQ我已经写了三篇了,基础的收发消息和基础的概念我都已经写了,学任何东西都是这样,先 ...

  9. 2015年12月10日 spring初级知识讲解(三)Spring消息之activeMQ消息队列

    基础 JMS消息 一.下载ActiveMQ并安装 地址:http://activemq.apache.org/ 最新版本:5.13.0 下载完后解压缩到本地硬盘中,解压目录中activemq-core ...

随机推荐

  1. java web开发入门五(ssh整合)基于intellig idea

    SSH整合 1.引入jar包 Struts 核心jar Hibernate 核心jar Spring Core  核心功能 Web  对web模块支持 Aop   aop支持 Orm   对hiber ...

  2. App启动时间分析

    iOS应用的启动可分为pre-main阶段和main()阶段. 1.pre-main阶段 可以通过配置Scheme,设置DYLD_PRINT_STATISTICS为1,来打印pre-main阶段的时间 ...

  3. Music模块

    micro:bit中,MicroPython提供一个Music模块,提供播放音乐的方法,但值得注意的是,控制板上并没有蜂鸣器,所以要外接蜂鸣器,才能听到效果 ,一般接到pin0端口,和gnd地,rob ...

  4. Dubbo简介与使用

    1:Dubbo是什么 阿里生产的一种rpc 实现框架  Dubbo 是一个分布式服务框架,是阿里巴巴开源项目 ,被国内电商及互联网项目中使用. Dubbo 致力于提供高性能和透明化的RPC远程服务调用 ...

  5. UML类图记忆口诀

    UML类图在设计模式书籍中用的比较多,经常忘记,口诀挺重要的,比如我们从小到大,除了乘法口诀.元素周期表等口诀形式的知识,其它的知识都基本忘记了, 所以编写口诀如下 1.三级石 2.见关一 3.零足迹 ...

  6. python网络爬虫(1)——安装scrapy框架的常见问题及其解决方法

    Scrapy是为了爬取网站数据而编写的一款应用框架,出名,强大.所谓的框架其实就是一个集成了相应的功能且具有很强通用性的项目模板. 其实在Linux和 Mac安装,就简单的pip命令即可: pip i ...

  7. json工具类(二)——google包

    package com.ruoyi.common.utils.json; import java.util.List; import com.google.gson.Gson; import com. ...

  8. RAID(独立磁盘冗余阵列)简介

    RAID(独立磁盘冗余阵列) 在大数据技术出现之前,人们就需要面对这些关于存储的问题,对应的解决方案就是RAID技术. RAID(独立磁盘冗余阵列)技术主要是为了改善磁盘的存储容量,读写速度,增强磁盘 ...

  9. JavaScript 加减危机——为什么会出现这样的结果?

    在日常工作计算中,我们如履薄冰,但是 JavaScript 总能给我们这样那样的 surprise~ 0.1 + 0.2 = ? 1 - 0.9 = ? 如果小伙伴给出内心的结果: 0.1 + 0.2 ...

  10. python爬取豆瓣电影首页超链接

    什么是爬虫?  我们可以把互联网比作一张大网,而爬虫(即网络爬虫)便是在网上爬行的蜘蛛.把网的节点比作一个个网页,爬虫爬到这就相当于访问了该页面,获取了其信息.可以把节点间的连线比作网页与网页之间的链 ...