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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/353624.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JAVA分代收集机制详解

Java堆中是JVM管理的最大一块内存空间。主要存放对象实例。在JAVA中堆被分为两块区域:新生代(young)、老年代(old)。堆大小新生代老年代;(新生代占堆空间的1/3、老年代占堆空间2/3)新…

FizzBu​​zz Kata与Java流

在柔道练习仅几周之后,我的儿子感到无聊。 他抱怨说自己没有学任何东西,因为他一遍又一遍地做着同样的事情。 混淆学习和做新事物的不仅仅是幼儿。 例如,有多少软件开发人员通过执行kata或参加dojos来进行刻意练习的麻烦? 重复您…

高可用架构

转载于:https://www.cnblogs.com/138026310/p/9088341.html

vc6.0快捷键

2010-09-14 17:46 F1 显示帮助,如果光标停在代码的某个字符上,显示MSDN中相应的帮助内容(需要安装MSDN才能使用) F2 书签功能: CtrlF2 --在某行设置一个书签(再按一次是取消) F2 --跳到下一个书签位置 ShiftF2 --跳到上一个书签位置 CtrlShiftF2 --删除…

ES6 各浏览器支持情况

http://kangax.github.io/compat-table/es6/转载于:https://www.cnblogs.com/likwin/p/9091008.html

MFC删除类的小窍门

VC 并没有提供删除一个类的简洁方法,我们需要手工删除,但过程并不复杂。例如,我们有一个 CMyButton 的类,对应的文件为 MyButton.h 和 MyButton.cpp ,我们先到工程目录中删除这两个文件,此时该类信息自动从…

ios plist 国际化_Java与iOS对话:Java对象与Apple plist序列化

ios plist 国际化我很高兴地宣布我的第一个开源项目java-plist-serializer可以帮助您将Java(尤其是基于Spring的应用程序)与iOS应用程序集成在一起。 背景 我正在将Java webapp作为后端并且客户端是iOS设备的项目。 最近,我收到了创建Web服务…

vtk环境搭建(windowsXP/win7,vtk6.0.0+cmake2.8+vs2010)

1. 安装vs2010(默认方式) 2. 安装cmake2.8(默认方式) 3. 新建文件夹作为vtk文件根目录(例如"E:\vtk6.0"),解压vtk-6.0.0.zip到根目录,将VTK6.0.0改名为vtk;解…

P1993 小K的农场 (差分约束)

题目描述 小K在MC里面建立很多很多的农场,总共n个,以至于他自己都忘记了每个农场中种植作物的具体数量了,他只记得一些含糊的信息(共m个),以下列三种形式描述: 农场a比农场b至少多种植了c个单位…

将Quartz与Spring集成

在Java应用程序中调度作业时,Quartz是第一个考虑的工具。 Quartz是由最流行的RDBMS支持的作业调度程序。 这真的很方便,并且很容易与spring集成。 为了创建石英模式,您必须下载石英发行版并解压缩位于crystal-2.2.3 / docs / dbTables /中的…

linux下md5sum的使用

在linux或Unix上,md5sum是用来计算和校验文件报文摘要的工具程序。一般来说,安装了Linux后,就会有md5sum这个工具,直接在命令行终端直接运行。1、使用md5sum来产生指纹(报文摘要)命令如下:md5su…

深入理解Python中的元类(metaclass)

注:本文原稿来自stackoverflow,原文链接,目前已收获5k高赞。 一、类也是对象 在理解元类之前,你需要先掌握Python中的类。Python中类的概念借鉴于Smalltalk,这显得有些奇特。在大多数编程语言中,类就是一组…

6个步骤卸载wine

今天在ubuntu下装了个wine,感觉界面很难看,跟ubuntu风格不协调。所以我把它卸载了。 根据网上找的资料,我是按如下步骤卸载: 1.终端运行sudo apt-get remove wine,运行发现系统还有wine的图标残留,于是 2…

OpenStack基础知识-virtualenv工具详解

1、virtualenv介绍 virtualenv通过创建一个单独的虚拟化python运行环境,将我们所需的依赖安装进去,不同项目之间相互不干扰,从而解决不同的项目之间依赖不同,造成的冲突问题 2、安装virtualenv 通过pip命令,安装virtua…

java中的五种排序方法_用Java排序的五种有用方法

java中的五种排序方法Java排序快速概述: 正常的列表: private static List VEGETABLES Arrays.asList("apple", "cocumbers", "blackberry");Collections.sort(VEGETABLES);output: apple, blackberry, cocumbers反向排…

压缩vmware中的ubuntu系统(虚拟机瘦身大法)

压缩vmware中的ubuntu系统&#xff08;虚拟机瘦身大法&#xff09; 前提:你的虚拟机大小 < 你放置虚拟机的磁盘的剩余空间 1.在Termial(终端)里 运行"sudo vmware-toolbox"(需要root权限) 2.选择“shrink”选项卡 3.选中“/”&#xff0c;点击“shrink”按钮 4.完…

P2619 [国家集训队2]Tree I

P2619 [国家集训队2]Tree I 链接 分析&#xff1a; 为了确定白边选入的数量&#xff0c;所以给白边加一个权值&#xff0c;二分这个值&#xff0c;然后最小生成树。可以发现白边的数量虽这个值的增大而减小&#xff0c;满足单调性。 有一个问题&#xff1a;如果在二分过程中给白…

程序化JCMD访问

在线提出的问题表明&#xff0c;开发人员偶尔希望通过其Java应用程序访问通常从针对该应用程序外部运行JConsole &#xff0c; VisualVM或JDK命令行工具获得的信息类型。 以下是这类问题的一些示例&#xff1a; 如何以编程方式获取jmap直方图&#xff1f; 以编程方式从Java应…

Ubuntu瘦身与扩容运动

Ubuntu瘦身与扩容运动 2009-11-26 18:18:24| 分类&#xff1a; 计算机 | 标签&#xff1a; |字号大中小 订阅 Ubuntu瘦身与扩容运动 2009年08月14日 星期五 12:25大家都知道系统用久了就会慢慢变得臃肿,速度当然也就会有一些影响,所以当那些加速系统的方法不在奏效的时候…

认识jQuery

一、JavaScript库 把一些浏览器兼容性的代码或者需要常用的函数装在一个js文件里,封装了很多js代码的一个js文件就是一个库 二、jQuery 是一个JavaScript库&#xff0c;免费开源的&#xff0c;体积小&#xff0c;链式编程&#xff0c;隐式迭代&#xff0c;很多优点jQuery 的功能…