ActiveMQ 知识点
消息队列高可用
持久化,事务,签收,zookeeper+replicated-leveldb-store的主从集群
异步发送
同步发送:
- 明确指定同步发送
- 未使用事务的前提下,发送持久化消息(会使用同步发送,且会阻塞producer直到broker返回一个确认,表示消息已持久化。会阻塞客户端带来延时)
异步发送:提高发送效率,但会增加broker性能消耗,且不能有效确保消息发送成功。
开启方式http://activemq.apache.org/async-sends
ActiveMQ默认使用异步发送:非持久化消息、事务内的消息均采用异步发送;对于持久化消息,则采用同步发送。
如果指定了useAsyncSend=true,都将采用异步发送,包括PERSISTENT类型的消息,也将使用异步发送。在useAsyncSend的情况下,客户端需要容忍消息丢失的可能。
正确的异步发送方法:接收回调
接收回执,由客户端再次判断是否发送成功
ActiveMQMessageProducer producer = (ActiveMQMessageProducer) session.createProducer(queue);
producer.setDeliveryMode(DeliveryMode.PERSISTENT);
TextMessage message = null;
for (int i = 0; i < count; i++) {
message = session.createTextMessage("Hello-"+i)
message.setJMSmessageID(UUID.randomUUID().toString());
String msgID = message.getJMSmessageID();
producer.send(message , new AsyncCallback() {
@Override
public void onSuccess() {
System.out.println(msgID+"成功");
}
@Override
public void onException(JMSException exception) {
System.out.println(msgID+"失败");
exception.printStackTrace();
}
});
}
1. 同步调用
是指从请求的发起一直到最终的处理完成期间,请求的调用方一直在同步阻塞等待调用的处理完成。
ClientCode在send发出请求后,就一直都阻塞在这里,调用Service以后,Service会调用Adapter这样一个类来进行处理,
而这个类会调用远程的一个服务等待最终调用结果的返回,是成功还是失败。
因为这个过程是阻塞等待的,所以这个过程也就是同步调用。
2.异步调用
是指在请求发起的处理过程中,客户端的代码已经返回了,
它可以继续进行自己的后续操作,而不需要等待调用处理完成,这就叫做异步调用。
异步调用过程,用户Clientcode在send发出请求后,调用Service以后,Service会把这个调用请求发送给消息队列,然后就立即返回了。
Clientcode收到返回以后继续向下处理,不会继续阻塞等待。
在这个过程中,客户端的调用,也就是应用程序的调用,和业务逻辑真正发送邮件的操作是不同步的。
延时 定时投递
官方配置http://activemq.apache.org/delay-and-schedule-message-delivery
默认不开启:Xml配置中将broker的schedulerSupport属性设置为true来启用它
MessageProducer producer = session.createProducer(destination);
TextMessage message = session.createTextMessage("test msg");
long delay = 30 * 1000; //首次延时时间
long period = 10 * 1000; //每次间隔时间
int repeat = 9; //重复
message.setLongProperty(ScheduledMessage.AMQ_SCHEDULED_DELAY, delay);
message.setLongProperty(ScheduledMessage.AMQ_SCHEDULED_PERIOD, period);
message.setIntProperty(ScheduledMessage.AMQ_SCHEDULED_REPEAT, repeat);
producer.send(message);
消息重发
消息重发官方介绍http://activemq.apache.org/redelivery-policy
起因:
- 事务调用了
rollback() - 事务没有
commit() - 签收模式
CLIENT_ACKNOWLEDGE,session调用了recover()
重发默认间隔1秒,最多6次:超过次数将不会重发,进入DLQ(死信队列)
java配置
RedeliveryPolicy topicPolicy = new RedeliveryPolicy();
topicPolicy.setInitialRedeliveryDelay(0); //最初的重新传递延迟
topicPolicy.setRedeliveryDelay(1000); //间隔
topicPolicy.setMaximumRedeliveries(3); //设置重发3次
Spring配置:
定义一个bean:RedeliveryPolicy,并且设置属性
引用:ActiveMQConnectionFactory 的 bean 中引用 redeliveryPolicy 属性
死信队列http://activemq.apache.org/message-redelivery-and-dlq-handling
防止消息重复消费
- 如果消息是数据库的插入操作:数据库设置唯一主键
- 给消息设置全局ID,消费该消息时,先查询redis,没有就消费,并且将消息存入redis
ActiveMQ 知识点的更多相关文章
- ActiveMQ (一) 介绍与安装
ActiveMQ是消息中间件的一种 ActiveMQ 是Apache出品,最流行的,能力强劲的开源消息总线.ActiveMQ 是一个完全支持JMS1.1和J2EE 1.4规范的 JMS Provide ...
- ActiveMQ下载与安装(消息中间件JMS)
下载 官方网站下载:http://activemq.apache.org/ 1.3.2安装(Linux) (1)将apache-activemq-5.12.0-bin.tar.gz 上传至服务器 (2 ...
- 消息中间件解决方案JMS
1. JMS入门 1.1消息中间件 1.1.1品优购系统模块调用关系分析 我们现在讲品优购已经完成的功能模块梳理如下: 我们已经完成了5个web模块和4个服务模块.其中运营商后台的调用关系最多,用到了 ...
- 消息中间件JMS(一)
1.JMS入门 1.1消息中间件 模块之间的依赖也称之为耦合.而耦合越多,之后的维护工作就越困难.那么如果改善系统模块调用关系.减少模块之间的耦合呢?我们接下来就介绍一种解决方案----消息中间件. ...
- 消息中间件 JMS入门
1. JMS入门 1.1消息中间件 什么是消息中间件 消息中间件利用高效可靠的消息传递机制进行平台无关的数据交流,并基于数据通信来进行分布式系统的集成.通过提供消息传递和消息排队模型,它可以在分布式环 ...
- 成小胖学习ActiveMQ·基础篇
过了个春节,回到公司的成小胖变成了成大胖.但是你们千万别以为他那个大肚子里面装的都是肥肉,里面的墨水也多了不少嘞,毕竟成小胖利用春节的半个月时间专心学习并研究了 ActiveMQ,嘿嘿……这不,为了检 ...
- ActiveMQ进阶学习
本文主要讲述ActiveMQ与spring整合的方案.介绍知识点包括spring,jms,activemq基于配置文件模式管理消息,消息监听器类型,消息转换类介绍,spring对JMS事物管理. 1. ...
- 10分钟详解Spring全家桶7大知识点
Spring框架自2002年诞生以来一直备受开发者青睐,它包括SpringMVC.SpringBoot.Spring Cloud.Spring Cloud Dataflow等解决方案.有人亲切的称之为 ...
- ActiveMQ嵌入Tomcat
在一些项目中,单独开启一个ActiveMQ,对于项目实施来说有时略显繁琐.所以我们将ActiveMQ内嵌到Tomcat,Tomcat启动同时就顺带启动了ActiveMQ.由此我们需要掌握三个个重要的知 ...
随机推荐
- hive表操作(转)
转载于:http://blog.csdn.net/lovelovelovelovelo/article/details/52234971 数据类型 基本数据类型 集合类型,array.map.stru ...
- hexo next主题深度优化(九),给博客加入主题,护眼主题,护眼色。
文章目录 背景 效果 码 _layout.swig custom.styl eye.js 引用eye.js 直接引用 main.js pjax的函数中重写 个人博客:https://mmmmmm.me ...
- day 89 DjangoRestFramework学习三之认证组件、权限组件、频率组件、url注册器、响应器、分页组件
DjangoRestFramework学习三之认证组件.权限组件.频率组件.url注册器.响应器.分页组件 本节目录 一 认证组件 二 权限组件 三 频率组件 四 URL注册器 五 响应器 六 分 ...
- mybatis 处理枚举类型
MyBatis支持持久化enum类型属性.假设t_user表中有一列gender(性别)类型为 varchar2(10),存储 MALE 或者 FEMALE 两种值.并且,User对象有一个enum类 ...
- sklearn中pipeline的用法和FeatureUnion
一.pipeline的用法 pipeline可以用于把多个estimators级联成一个estimator,这么 做的原因是考虑了数据处理过程中一系列前后相继的固定流程,比如feature selec ...
- 【python】collections的使用
老师布置了一个课后作业. 统计文本中字母出现的次数并找到最大的那一个 首先是读取文本吧.和c里的也差不多,打开,关闭,读取. path = f = f.close() 然后就用到了这个黑科技.coll ...
- StringBuilder 和 StringBuffer类
通常在涉及到StringBuilder和StringBuffer时中任何一个时,都应该想到另外一个并且在脑海中问自己是否用另外一个更加合适. 为什么这么说,请继续往下看,当然如果你已经对二者烂熟于胸自 ...
- 2019-8-16-调试时限制程序使用-CPU-核心数模拟低端设备
title author date CreateTime categories 调试时限制程序使用 CPU 核心数模拟低端设备 lindexi 2019-08-16 16:11:32 +0800 20 ...
- RAKsmart服务器受消费者青睐的原因
随着互联网的快速发展,网站建设变得越来越重要,现在很多做外贸网站的都会选择美国服务器来建设网站,近年来RAKsmart服务器受到广大站长的欢迎,那RAKsmart服务器受消费者青睐的关键是什么呢. 1 ...
- css---文本新增样式
opacity属性指定了一个元素的透明度 默认值:1.0 不可继承 兼容性不是太好 兼容性写法 opacity{ opacity:0.5; filter:alpha(opacity=); //f ...