一、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());