activemq和jms

最近,一位客户要求我仔细研究ActiveMQ的“持久”消息的实现,它如何应用于主题以及在存在非持久订户的故障转移方案中会发生什么。

我已经了解到,JMS语义规定,即使面对消息代理提供程序故障,也只能保证主题的持久订户以持久传递模式传递消息。 但是对于持久消息的非持久订户,该怎么说呢? 没有持久订阅者时发送“持久”消息有什么意义?

在查看规范的确切措辞后,我变得有点不确定。 因此,我查阅了Java消息服务书(Richards,Monson-Haefel和Chappell),以了解有关保证消息传递的更多讨论,并查看了ActiveMQ源代码,并与我的一些同事进行了咨询。

首先,让我们看一下规格说明:

根据JMS规范的第4.10节:

大多数客户应使用产生PERSISTENT消息的生产者。 这样可以确保从队列或持久订阅中传递的消息只有一次的消息传递。

很清楚吧? 使用持久消息传递可确保为队列或持久预订传递消息。

从第6.12节开始:

不可持久订户的未确认消息应该能够在该不可持久订户的生命周期中恢复。

因此,现在应该能够恢复非持久订户的未经确认的消息吗? 我猜是“在那个非持久订户的一生中”

但后来成为6.12的一部分:

只有持久订阅才能可靠地恢复未确认的消息。

和…

为了确保传递,TopicSubscriber应该建立持久订阅。

尽管规范非常清楚地表明(只有效果),只有队列和持久订户才能利用存储转发保证的交付,但是我猜我对“非持久订户应该能够在非耐用订户的整个生命周期内恢复”

  • 主题的持久性协议是否会根据其使用者而更改(在此消息中,只有当代理保留了消息并向生产者发送确认后,消息才被视为代理的责任)?
  • 这是否意味着即使发生经纪人失败? 还是考虑了经纪人的失败以及非耐久潜艇的订购期限?
  • 当存在用于持久性,非持久性主题的代理网络时,ActiveMQ会发生什么? 如果网络中的代理失败,消息会丢失吗?
  • 向具有非持久订阅者的主题发送消息“持久”与“非持久”之间的确切区别是什么?

这是保证交付讨论中必须考虑的两个部分。 发布者向代理发送消息的位置,以及消费者从代理接收消息的时间。 对于持久性消息,该协议仅在将消息持久化到商店之后才由发送方发送消息,并且代理由协议确认。 另一方面,消费者必须在经纪人传递消息后确认该消息,说“嘿,我现在要对此消息负责”。 只有这样,经纪人才会放弃责任并将其从其商店中删除。  

协议是否根据主题的使用者而改变?

因此,对于发送到某个主题的持久消息(目前未考虑任何消费者),规范是否说明在代理发回其确认之前是否应该存储该消息? 不,不是。 它由有关的JMS代理的实现者来决定。 对于ActiveMQ,如果某个主题上只有非持久订阅,它将不会保留该消息。

协议的同步性质不会改变,即,如果消息是持久发送的,则会话将认为与代理的交换是同步的,并且它将在继续之前等待代理的响应,但代理不会实际保留消息。 在ActiveMQ中,如果至少有一个持久订户,则这种情况会改变。 然后,代理将保留消息(按照JMS规范)。  

这是否意味着即使发生经纪人失败?

如果代理失败,则非持久订阅的生存期确实会中断。 因此,如果代理发生故障(或该非持久子项的任何其他终止),则即使将消息持久发送,也不会将其传递给该非持久订户。 此外,面对代理的非持久订阅失败,将不会重新发送消息。  

在经纪人网络中会发生什么?

消息确实可能丢失。 考虑这个经纪人网络,其中A-> B-> C和订阅是从C-> B-> A转发的。因此,如果我们在A处有一个生产者,生产的主题为“ topic.foo”,而一个非耐用的消费者如果代理B在代理C上从“ topic.foo”中消费,则如果代理B发生故障,此后发送到A的消息将被丢弃。 据A所知,订阅的生存期已终止。

最后,  

向具有非持久订阅者的主题发送消息“持久”与“非持久”之间的确切区别是什么?

根据JMS规范:

出版方式 非持久订户 耐用的订户
非持久 最多一次(如果不活动则丢失) 最多一次
持久性 一次仅一次(如果不活动则丢失) 一次只有一次

因此,对于非持久性订户,非持久性消息将“​​最多”传递一次,但如果处于非活动状态(或代理失败)则将丢失。

对于非持久性订户,持久消息将“仅一次发送”,但如果不活动则丢失。 规范的“非活动”部分实际上意味着,如果没有持久的主题订阅者,则消息可能会丢失,并且无论消息是持久发送还是非持久发送,都无法保证传递。

参考: Christian Posta软件博客上来自JCG合作伙伴 Christian Posta的主题,JMS规范和ActiveMQ的有保证的消息传递 。

翻译自: https://www.javacodegeeks.com/2012/08/guaranteed-messaging-for-topics-jms.html

activemq和jms

activemq和jms_保证主题,JMS规范和ActiveMQ的消息传递相关推荐

  1. 保证主题,JMS规范和ActiveMQ的消息传递

    最近,一个客户要求我仔细研究ActiveMQ的"持久"消息的实现,它如何应用于主题以及在存在非持久订阅者的故障转移方案中会发生什么. 我已经了解到,JMS语义规定,即使面对消息代理 ...

  2. 基于JMS规范的ActiveMQ

    为什么80%的码农都做不了架构师?>>>    基于JMS规范的ActiveMQ JMS即Java消息服务(Java Message Service)应用程序接口,是一个Java平台 ...

  3. JMS规范、ActiveMQ Broker和ActiveMQ传输协议

    Java实现ActiveMQ通讯(构建过程) 编写pom.xml配置文件 <!-- https://mvnrepository.com/artifact/org.apache.activemq/ ...

  4. jms规范以及activeMq相关介绍

    jms 提出的指在统一各种MOM(Message-Oriented Middleware )系统接口的规范,只是接口,不包含实现,实现JMS 接口的消息中间件称为JMS Provider.active ...

  5. 【ActiveMQ】一头扎进 JMS 之 ActiveMQ 视频教程

    <一头扎进 JMS 之 ActiveMQ 视频教程> 第一章 JMS 及 ActiveMQ 简介 第一节:JMS 规范简介 第二节:ActiveMQ 简介 第三节:ActiveMQ 开发包 ...

  6. JMS学习(2):ActiveMQ简单介绍以及安装

    现实的企业中,对于消息通信的应用一直都非常的火热,而且在J2EE的企业应用中扮演着特殊的角色,所以对于它研究是非常有必要的. 上篇博文深入浅出JMS(一)–JMS基本概念,我们介绍了消息通信的规范JM ...

  7. JMS规范和AMQP协议

    1.JMS经典模式详解 JMS即Java消息服务(Java Message Service)应用程序接口,是一个Java平台中关于面向消息中间件(MOM,Message oriented Middle ...

  8. MOM 系统介绍,带你了解 JMS 规范

    什么是MOM MOM(Message Oriented Middleware)是面向消息的中间件,使用消息传送提供者来协调消息传送操作.MOM 需要提供 API 和管理工具.客户端使用 API 调用, ...

  9. MQ学习(一)----JMS规范(转发整合)

    最近进行ActiveMQ的学习,总结下已被不时之需. JMS规范: JMS即Java消息服务(Java Message Service)应用程序接口是一个Java平台中关于面向消息中间件(MOM)的A ...

最新文章

  1. topcoder srm 691 div1 -3
  2. 网鼎杯2020 朱雀部分writeup
  3. 【 CodeForces - 1060B 】Maximum Sum of Digits(思维,构造)
  4. 原来你是这样的Promise
  5. 12096 - The SetStack Computer
  6. selenium webdriver学习(八)------------如何操作select下拉框(转)
  7. Python黑客编程入门教程
  8. linux——18数据库SQLite3
  9. UBUNTU快速回到桌面
  10. 如何将已有图片做成透明水印_如何用Photoshop在图片上添加透明水印?
  11. Visio工具的跨线解决问题
  12. Java实现生产者消费者案例
  13. 微软宣布 WinUI 的重心在于 Win32,而 UWP 还有未来吗?
  14. 处理器架构 (三) 架构指令集微架构ISA 等概念
  15. 美团(美食)类全网数据分析
  16. 给玩家看贷款、黄色小说广告——不只《羊了个羊》,游戏行业的ESG踩雷有多频繁?
  17. Allegro学习笔记之——导出Gerber文件和钻孔数据文件
  18. estore案例的一些工具类
  19. 「镁客·请讲」BeanVR秦凯:VR体验太孤独?我们要做娱乐性的社交产品
  20. U3D模拟暗黑泰瑞尔翅膀物理运动效果

热门文章

  1. 如何实现省市关联的下拉列表
  2. 通过反射获取方法返回的类型
  3. oracle10g ty_str_split,Oracle split(分隔字符串函数)
  4. 去掉字符串后面所有的0 去掉字符串前面或后面的0;
  5. 计算机视觉论文doc,嘉炬-计算机视觉论文资料.doc
  6. php如何直接使用iview,iview安装使用
  7. 前端wxml取后台js变量值_这些鲜为人知的前端冷知识,你都GET了吗?
  8. 如何导出数据到Excel表格
  9. apache.camel_Apache Camel 2.21发布–新增功能
  10. 提取javadoc_使用JavaParser从源文件中提取JavaDoc文档