一、ActiveMQ学习笔记(基础概念)

刚准备把使用ActiveMQ过程中遇到的问题,以及解决方法整理出来的时候,去看了下官网,发现ActiveMQ Artemis已经发布好久了。

1、JMS概念

  JMS即Java消息服务(Java Message Service)应用程序接口,是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。

  JMS是一种与厂商无关的 API,绝大多数MOM提供商都对JMS提供支持,用来访问收发系统消息,它类似于JDBC(Java Database Connectivity)。

2、JMS元素
  • 提供者(Provider):实现JMS的消息服务中间件服务器。常用的如:Apache ActiveMQ、IBM WebSphere MQ。
  • 客户端:发送或接受消息的应用。
  • 生产者(Producer):创建并发送消息的JMS客户。
  • 消费者(Consumer):接收并处理消息的JMS客户。
  • 消息(Message):应用程序之间传递的数据。
  • 队列(Queue):一个容纳那些被发送的等待阅读的消息的区域。与队列名字所暗示的意思不同,消息的接受顺序并不一定要与消息的发送顺序相同。一旦一个消息被阅读,该消息将被从队列中移走。
  • 主题(Topic):一种支持发送消息给多个订阅者的机制。

3、JMS对象

  • 连接工厂(ConnectionFactory):创建Connection对象的工厂。客户端使用JNDI查找连接工厂,然后利用连接工厂创建一个JMS连接。
  • 连接(Connection):客户端和服务器端之间的一个活动的连接,是由客户端通过调用连接工厂的方法建立的。
  • 会话(Session):表示客户与服务器之间的会话状态。会话建立在连接上,表示客户与服务器之间的一个会话线程。
  • 目的(Destination):消息生产者的消息发送目标或者说消息消费者的消息来源。
  • 生产者(Message Producer):消息生产者由Session创建,并用于将消息发送到Destination。消息生产者分两种类型:QueueSender和TopicPublisher,可以调用消息生产者的方法(send或publish方法)发送消息。
  • 消费者(Message Consumer):消息消费者由Session创建,用于接收被发送到Destination的消息。消息消费者分两种类型:QueueReceiver和TopicSubscriber。可分别通过session的createReceiver(Queue)或createSubscriber(Topic)来创建。当然,也可以session的creatDurableSubscriber方法来创建持久化的订阅者。

4、JMS消息模型

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

5、JMS传递方式

  • JMS规范定义了2种消息传输模式:持久传送模式(PERSISTENT)和非持久传输模式(NON_PERSISTENT)。
  • 标记为NON_PERSISTENT的消息最多投递一次。对于非持久的消息,JMS提供者不会将它存到文件/数据库等稳定的存储介质中。也就是说非持久消息驻留在内存中,如果JMS提供者宕机,那么内存中的非持久消息会丢失。
  • 标记为PERSISTENT的消息将使用暂存后再转送的机理投递。对于持久消息,JMS提供者会使用存储-转发机制,先将消息存储到稳定介质中,等消息发送成功后再删除。如果JMS提供者挂掉了,那么这些未送达的消息不会丢失;JMS提供者恢复正常后,会重新读取这些消息,并传送给对应的消费者。

   问题记录: 在ActiveMQ中,将broker的presistent设置为false后,如果消息未设置成nonPresistent,此时是什么效果,观察后发现是会影响数据传输效率的

6、JMS消息格式

  • StreamMessage:流消息 
  • ObjectMessage:对象消息
  • MapMessage:键值对消息

    ActiveMQ通过使用Session接口定义的工厂方法来创建:

MapMessage mapMessage = session.createMapMessage();   
mapMessage.setLong("name", "test");   
mapMessage.setDouble("age", new Int(20));   
  • TextMessage:文本消息

    ActiveMQ通过使用Session接口定义的工厂方法来创建:

TextMessage textMessage = session.createTextMessage("Hello!");
  • BytesMessage:字节消息  

     ActiveMQ通过使用Session接口定义的工厂方法来创建:

BytesMessage bytesMessage = session.createBytesMessage();   
bytesMessage.writeBytes("Hello!".getBytes());

 

posted @ 2019-09-07 22:27  Artemis6  阅读(940)  评论(0编辑  收藏  举报