消息队列高可用

持久化事务签收zookeeper+replicated-leveldb-store的主从集群

异步发送

同步发送:

  1. 明确指定同步发送
  2. 未使用事务的前提下,发送持久化消息(会使用同步发送,且会阻塞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配置中将brokerschedulerSupport属性设置为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

起因:

  1. 事务调用了rollback()
  2. 事务没有commit()
  3. 签收模式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

防止消息重复消费

  1. 如果消息是数据库的插入操作:数据库设置唯一主键
  2. 给消息设置全局ID,消费该消息时,先查询redis,没有就消费,并且将消息存入redis

ActiveMQ 知识点的更多相关文章

  1. ActiveMQ (一) 介绍与安装

    ActiveMQ是消息中间件的一种 ActiveMQ 是Apache出品,最流行的,能力强劲的开源消息总线.ActiveMQ 是一个完全支持JMS1.1和J2EE 1.4规范的 JMS Provide ...

  2. ActiveMQ下载与安装(消息中间件JMS)

    下载 官方网站下载:http://activemq.apache.org/ 1.3.2安装(Linux) (1)将apache-activemq-5.12.0-bin.tar.gz 上传至服务器 (2 ...

  3. 消息中间件解决方案JMS

    1. JMS入门 1.1消息中间件 1.1.1品优购系统模块调用关系分析 我们现在讲品优购已经完成的功能模块梳理如下: 我们已经完成了5个web模块和4个服务模块.其中运营商后台的调用关系最多,用到了 ...

  4. 消息中间件JMS(一)

    1.JMS入门 1.1消息中间件 模块之间的依赖也称之为耦合.而耦合越多,之后的维护工作就越困难.那么如果改善系统模块调用关系.减少模块之间的耦合呢?我们接下来就介绍一种解决方案----消息中间件. ...

  5. 消息中间件 JMS入门

    1. JMS入门 1.1消息中间件 什么是消息中间件 消息中间件利用高效可靠的消息传递机制进行平台无关的数据交流,并基于数据通信来进行分布式系统的集成.通过提供消息传递和消息排队模型,它可以在分布式环 ...

  6. 成小胖学习ActiveMQ·基础篇

    过了个春节,回到公司的成小胖变成了成大胖.但是你们千万别以为他那个大肚子里面装的都是肥肉,里面的墨水也多了不少嘞,毕竟成小胖利用春节的半个月时间专心学习并研究了 ActiveMQ,嘿嘿……这不,为了检 ...

  7. ActiveMQ进阶学习

    本文主要讲述ActiveMQ与spring整合的方案.介绍知识点包括spring,jms,activemq基于配置文件模式管理消息,消息监听器类型,消息转换类介绍,spring对JMS事物管理. 1. ...

  8. 10分钟详解Spring全家桶7大知识点

    Spring框架自2002年诞生以来一直备受开发者青睐,它包括SpringMVC.SpringBoot.Spring Cloud.Spring Cloud Dataflow等解决方案.有人亲切的称之为 ...

  9. ActiveMQ嵌入Tomcat

    在一些项目中,单独开启一个ActiveMQ,对于项目实施来说有时略显繁琐.所以我们将ActiveMQ内嵌到Tomcat,Tomcat启动同时就顺带启动了ActiveMQ.由此我们需要掌握三个个重要的知 ...

随机推荐

  1. iOS开发UITouch触摸API简介

    1.UITouch简介 当用户触摸屏幕时,会创建一个UITouch对象: UITouch的作用保存着触摸相关的信息,比如触摸的位置.时间.阶段等: 当从开始到结束,系统会更新UITouch对象,结束时 ...

  2. 基于Netty的RPC架构学习笔记(一):NIO

    文章目录 传统的socket分析 举个

  3. Python匹马行天下之面向对象

    概述 面向过程:根据业务逻辑从上到下写垒代码 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 面向对象:对函数进行分类和封装,让开发“更快更好更强...” 面向过程编程最易被初学 ...

  4. USACO 2007 November Silver Best Cow Line /// oj21653

    题目大意: 输入n 接下来n行字母 在队头和队尾中选出较小的放入新的队列 Sample Input 6ACDBCB Sample Output ABCBCD   注意相同的情况 先判断内层的大小 输出 ...

  5. 【POJ】3278 Catch That Cow

    题目链接:http://poj.org/problem?id=3278 题意:有一头奶牛跑到了K的位置,农夫在N的位置,求最短抓到奶牛的时间. 农夫有两种移动方式. 1.步行:一分钟内从x->x ...

  6. iOS开发系列-Foundation与CoreFoundation内存管理

    概述 对于初学者来说,可能仅只能将ARC用在objective-c对象上(也即继承自NSObject的对象),但是如果涉及到较为底层的东西,比如Core Foundation中的malloc()或者f ...

  7. item字母问题

    解决方法:复写toString方法 @Override public String toString() { return this.getBookTypeName(); } 将对象的toString ...

  8. 常见的arp欺骗

    三.常见ARP欺骗形式 1.假冒ARP reply包(单播) XXX,I have IP YYY and my MAC is ZZZ! 2.假冒ARP reply包(广播) Hello everyon ...

  9. mysql出现You can’t specify target table for update in FROM clause

    在mysql执行下面语句时报错: You can’t specify target table for update in FROM clause UPDATE edu_grade_hgm_1 ' W ...

  10. jquery选择器中中>和空格的区别

    空格:$('parent childchild')表示获取parent下的所有的childchild节点 大于号:$('parent > childchild')表示获取parent下的所有下一 ...