4 Star 0 Fork 0

梦残 / 学习笔记

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
MQ.txt 8.43 KB
一键复制 编辑 原始数据 按行查看 历史
梦残 提交于 2017-10-26 14:42 . 重命名文件ActiveMQ.txt为MQ.txt
MQ:
1.java消息服务(JMS)定义了java中访问消息中间件的接口.JMS只是接口,并没有给予实现,实现JMS接口的消息中间件被称为JMS Provider,已有的MOM系统包括Apache的ActiveMq,以及阿里巴巴的RocketMq,IBM的MQSeries,Microsoft的MSMQ和BEA的MessageQ,RabbitMQ等,他们都遵循JMS规范.
2.JMS术语:
Provider:生产者
Consumer:消费者
PTP:point to point 点对点消息模型
Pub/Sub:publish/subscribe 即发布/订阅消息模型
Queue:队列目标
Topic:主题目标
ConnectionFactory:连接工厂,JMS用它常见连接
Connection:JMS客户端到JMS provider的连接
Destination: 消息的目的地
Session:会话,一个发送或者接受消息的线程
MessageConsumer接口:由会话创建的对象,用于接受发送到目标的消息,消费者可以同步地或者异步接受队列和主题类型的消息
MessageProducer接口:由会话创建的对象,用于发送消息到目标.用户可以创建某个目标发送者,也可以创建一个通用的发送者,在发送消息时指定目标.
Message接口:是在消费者和生产者之间传送的对象,也就是说从一个应用程序传送到另一个应用程序.
一个消息有三个部分组成:
消息头(必须):包含用于识别和为消息寻找路由的操作设置
一组消息属性(可选):包含额外的属性,支持其他提供者和用户兼容.也可以创建定制的字段和过滤器(消息选择器)
一个消息体(可选):允许用户创建五种类型的消息(文本,映射,字节,流,对象)
消息接口非常灵活,并提供了许多方式来定制消息内容
3.Session接口(会话)
表示一个单线程的上下文,用于发送和接受消息.由于会话是单线程的,所以消息是连续的,就是说消息时按照顺序一个个接受的.会话的好处是它支持事务.如果用户选择了事务支持,会话上下文将保存一组消息,知道事务被提交才发送这些消息.在事务提交之前,用户可以使用回滚操作取消这些消息.一个会话允许用户创建消息生产者来发送消息,创建消息消费者来接受消息
4.消息格式定义:
StreamMessage:java原始的数据流
MapMessage:一套名字-值对
TextMessage:一个字符串对象
ObjectMessage:一个为序列化的java对象
BytesMessage:一个未解释字节的数据流
5.ActiveMQ:
业务量不是很大的时候ActiveMQ够用了
JMS的一个基础
1.Connection
通常客户端只是用单一连接,根据JMS文档,Connection的目的是利用JMS提供者封装开放的连接,以及表示"客户端与提供者服务例程之间的开发TCp/IP套接字",该文档还指出Connection应该是进行客户端身份验证的地方等待.
Connection创建以后,传输模拟是关闭的,需要手动start,
一个connection可以创建一个或者多个session.
程序执行完以后必须关闭Connection,否则不能释放资源,关闭connection的时候也关闭了session,MessageProducer,MessageConsumer
2.Session
Session是一个发送或者接受消息的线程,可以使用Session创建MessageProducer,MessageConsumer,Message
Session可以被事务化,也可以不被事务化.
Session createSession(boolean trasacted,int acknowlegeMode);
acknowlegeMode为签收模式
当一个事务提交,消息被处理.如果事务中有一个步骤失败,事务就回滚,这个事务中已经执行的动作将被撤销.在发送消息最后也必须使用session.commit()提交事务
三种签收模式:
Session.Auto_ACKNOWLEDGE当客户端从receive或者onMessage成功返回时,Session自动签收客户端的这条消息的收条
Session.CLIENT_ACKNOWLEDGE客户端通过调用Message的ackowledge方法签收消息.这种情况下,签收发生在session层面:签收一个已消费的消息会自动的签收这个Session所有已经消费消息的收条
message.acknowlege(); //手动签收
Session.DUPS_OK_ACKNOWLEDGE此选项指示session不必确定传送消息的签收,它可能引起消息的重发,但是降低了session的开销,所以只要客户端能忍受重复,才使用
推荐是手动签收.避免签收时候异常
3.MessageProducer
由session创建用来发想destination发送消息
方法:
void send(destionation,message);
void send(destionation,message,deliveryMode,priority,timeToLive);
void send(message);
void send(message,deliveryMode,priority,timeToLive);
deliveryMode传输模式 int
PERSISTENT(默认)
NON_PERSISTENT
priority:优先级 int
0-4普通(默认4)
5-9加急
timeToLive:消息过去时间 long类型
默认永不过期,时间为毫秒
4.MessageConsumer
用来从destination接收消息
由Session创建
方法:
MessageConsumer createConsumer(Destination destionation);
MessageConsumer createConsumer(Destination destionation,String messageSelector);
MessageConsumer createConsumer(Destination destionation,Sting messageSelector,boolean noLocal);
TopicSubsriber createDurableSubscreiber(Topic topic,String name);
TopicSubsriber createDurableSubscreiber(Topic topic,String messageSelector,boolean noLocal);
其中messageSelector为消息选择器;
noLocal标志默认为false,设置为true的时候限制消费者只能接收和自己相同的连接(Connection)所发布的消息,此标志只适用于主题,不使用与队列;
name标识订阅主题所对应的订阅名称,持久订阅时需要设置此参数
public final String SELECTOR = "JMS_TYPE = 'MY_TAG1'";该选择器检查了传入消息的JMS_TYPE属性,并确定了这个属性的值是否等于MY_TAG1.如果等于则消息被消费;如果不等于,那么被忽略
只能过滤property属性的标签setStringProperty("name","zs");
消息的同步和异步接收:
消息的同步接收是指客户端主动的去接收消息,客户端采用MessageConsumer的receive方法接收下一个消息.
Message receive();
Message receive(long timeout);
Message receiveNoWait();
消息的异步接收是指当消息到达时,ActiveMQ主动通知客户端,可以通过注册一个实现MessageListener接口的对象到MessageConsumer.MessageListener只有一个必须实现的方法onMessage,它只接收一个参数,即Message,为每个发送到Destination的消息实现onMessage时,并调用该方法.
5.Message
JMS程序的最终目的是产生和消费的消息能被其他程序使用,JMS的Message是一个既简单又不乏灵活性的基本格式,运行创建不同平台上符合非JMS程序格式的消息.Message由以下几个部分组成.
消息头,属性,消息体
BlobMessage createBlobMessage(File file);
BlobMessage createBlobMessage(InputStream in);
BlobMessage createBlobMessage(URL url);
BlobMessage createBlobMessage(URL url,Boolean deletedByBroker);
.....
不推荐使用mq传输大文件
我们一般会在接收端通过instanceof方法来区别数据类型
6.TemporaryQueue
创建临时消息,这些目标持续到创建它的Connection关闭,只有创建临时的Connection所创建的客户端才可以从临时目标中接收消息,但是任何生产者都可以向临时目标中发送消息.如果关闭了创建此目标的Connection,那么临时目标被关闭,内容也将消失
TemporaryQueue createTemporaryQueue();
TemporaryTopic createTemporaryTopic();
7.P2P
点对点
8.publish-subsribe 发布订阅
消费者要先订阅,不然生产者之前发送的消息就会接收不到
9.与spring结合
百度
10.ActiveMQ+zookeeper实现高可用
http://wosyingjun.iteye.com/blog/2314683
6.RocketMQ
是一款分布式,队列模型的消息中间件,具有以下特点:
能够保证严格的消息顺序
提供丰富的消息拉去模式
高效的订阅水平扩展能力
实时的消息订阅机制
亿级消息堆积能力
Metaq3.0版本改名,产品改名为RocketMQ
选择理由:
强调集群无单点,可扩展,任意一点高可用,水平扩展.
海量消息堆积能力,消息堆积后,写入延迟低
支持上万个队列
消息失败重试机制
消息可查询
开源社区活跃
成熟度(经过双十一考验)
Java
1
https://gitee.com/mengcan/study-note.git
git@gitee.com:mengcan/study-note.git
mengcan
study-note
学习笔记
master

搜索帮助

53164aa7 5694891 3bd8fe86 5694891