ActiveMQ学习(一)了解JMS

前言

  越来发现自己太渣,难道这就是传说中的“知道的越多,不知道的越多”?不!我相信我是确实不知道的有很多……[捂脸]
  言归正传,最近使用到了ActiveMQ,发现这个玩意儿也是非常重要且有用!继Mongo专栏之后,计划以同样的style来从零开始学习一下ActiveMQ。
  顺便吐槽一下:别说,这Markdown还确实挺好用嘿!不过不支持排版缩进什么鬼啊???还得用  ,这让强迫症表示根本无法自拔好嘛……


1.JMS简介

学习ActiveMQ之前,先来学习一下JMS:

JMS(Java Messaging Service),即Java消息服务,是Java平台上关于面向消息中间件(MOM)的API,它便于应用程序之间,或分布式系统之间进行异步的消息交换,并且通过提供标准的产生、发送、接收消息的接口简化企业应用的开发。

JMS是Java消息服务的标准(或者叫规范),它使分布式通信耦合更低,消息服务更加可靠,这个标准在企业应用中十分的重要和广泛,所以开篇来重点学习一下它。好了,必要的概念大致就这么多,其他细节网上还有很多,不再赘述。

2.消息的模型

点对点队列模型:Point-to-Point(P2P)
发布订阅模型:Publish/Subscribe(Pub/Sub)

2.1 P2P模型

P2P

2.1.1 相关对象
  • 消息队列(Queue)
  • 发送者(Sender)
  • 接收者(Receiver)
2.1.2 过程

发送者将消息发送到一个特定的队列,接收者从队列中获取消息。队列保留着消息,直到他们被接收者消费或超时。

2.1.3 特点
  • 每个消息只有一个消费者(Consumer),消息一旦被消费就会从队列中移除
  • 发送者和接收者在时间上没有依赖性(异步),即发送者发送消息时接收者无需处于运行状态,同样接收者接收消息时发送者无需处于运行状态
  • 接收者接收消息之后需向队列应答成功

2.2 Pub/Sub模型

image

2.2.1 相关对象
  • 主题(Topic)
  • 发布者(Publisher)
  • 订阅者(Subscriber)
2.2.2 过程

发布者向一个特定的主题发布消息,0或多个订阅者可能对该特定主题的消息感兴趣并接收;这种模型下,发布者和订阅者彼此不知道对方。

2.2.3 特点
  • 每个消息可以有多个消费者
  • 发布者和订阅者之间有时间上的依赖性。订阅者必须保持持续的运行状态才能接收到消息
  • JMS提供了持久化订阅,这时候,订阅者未连接主题时(发布者)发布的消息,将在订阅者重新连接时进行重新发布,以便订阅者接收消息

3. 消息的消费

在JMS中,消息的产生和消息是异步的。对于消费来说,JMS的消息者可以通过两种方式来消费消息。

  • 同步:接收者或订阅者调用receive()方法来接收消息,消息到达(或超时)之前将一直阻塞。
  • 异步:接收者或订阅者可以注册为一个消息监听器,当消息到达之后,系统会自动调用监听器的onMessage方法。

4. 消息的组成

消息传递系统的中心就是消息,一条消息由三个部分组成:头、属性、主体

4.1 头(head)

每条JMS 消息都必须具有消息头。头字段包含用于路由和识别消息的值。可以通过多种方式来设置消息头的值:
1. 由JMS 提供者在生成或传送消息的过程中自动设置
2. 由生产者客户机通过在创建消息生产者时指定的设置进行设置
3. 由生产者客户机逐一对各条消息进行设置

4.2 属性(property)

消息可以包含称作属性的可选头字段。他们是以属性名和属性值对的形式制定的。可以将属性是为消息头得扩展,其中可以包括如下信息:创建数据的进程、数据的创建时间以及每条数据的结构。JMS提供者也可以添加影响消息处理的属性,如是否应压缩消息或如何在消息生命周期结束时废弃消息。

4.3 主体(body)

包含要发送的内容。每个消息接口特定于它所支持的内容类型。JMS为不同类型的内容提供了他们各自的消息类型,但是所有消息都派生自Message接口。

  • StreamMessage:一种主体中包含Java基元值流的消息。其填充和读取均按顺序进行。
  • MapMessage:一种主体中包含一组键–值对的消息。没有定义条目顺序。
  • TextMessage:一种主体中包含Java字符串的消息(例如,XML消息)。
  • ObjectMessage:一种主体中包含序列化Java对象的消息。
  • BytesMessage:一种主体中包含连续字节流的消息。

5. JMS编程模型

5.1 ConnectionFactory(连接工厂)

创建Connection对象的工厂,针对两种不同的jms消息模型,分别有QueueConnectionFactory和TopicConnectionFactory两种。可以通过JNDI来查找ConnectionFactory对象。

5.2 Destination(目标)

Destination的意思是消息生产者的消息发送目标或者说消息消费者的消息来源。对于消息生产者来说,它的Destination是某个队列(Queue)或某个主题(Topic);对于消息消费者来说,它的Destination也是某个队列或主题(即消息来源)。

所以,Destination实际上就是两种类型的对象:Queue、Topic可以通过JNDI来查找Destination。

5.3 Connection(连接)

Connection表示在客户端和JMS系统之间建立的链接(对TCP/IP socket的包装)。Connection可以产生一个或多个Session。跟ConnectionFactory一样,Connection也有两种类型:QueueConnection和TopicConnection。

5.4 Session(会话)

Session是我们操作消息的接口。可以通过session创建生产者、消费者、消息等。Session提供了事务的功能。当我们需要使用session发送/接收多个消息时,可以将这些发送/接收动作放到一个事务中。同样,也分QueueSession和TopicSession。

5.5 MessageProducer(消息生产者)

消息生产者由Session创建,并用于将消息发送到Destination。同样,消息生产者分两种类型:QueueSender和TopicPublisher。可以调用消息生产者的方法(send或publish方法)发送消息。

5.6 MessageConsumer(消息消费者)

消息消费者由Session创建,用于接收被发送到Destination的消息。两种类型:QueueReceiver和TopicSubscriber。可分别通过session的createReceiver(Queue)或createSubscriber(Topic)来创建。当然,也可以session的creatDurableSubscriber方法来创建持久化的订阅者。

5.7 Message(消息)

是在消费者和生产者之间传送的对象,也就是说从一个应用程序传送到另一个应用程序。

5.7 MessageListener

消息监听器。如果注册了消息监听器,一旦消息到达,将自动调用监听器的onMessage方法。







参考文章:

http://blog.csdn.net/jiuqiyuliang/article/details/46701559
https://baike.baidu.com/item/JMS/2836691?fr=aladdin
http://boy00fly.iteye.com/blog/1103586

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值