现在的mq消息中间件非常的多,但基本都是基于JMS或者AMQP协议或规范,所以需要很好的了解JMS。
一、JMS基本概念
JMS(Java Message Service)是Java平台中的面向消息服务的中间件API,用于在两个应程序之间或者分布式消息系统中的消息发送和异步通信。JMS是一个与平台无关的API,大多数MOM(Message Oriented Middleware,面向消息中间件)提供商对JMS提供支持。类似于数据库,Java提供规范而各种数据(如mysql、oracle)实现规范,可以查看Java SPI机制。
ActiceMQ是基于JMS消息协议实现的,其他基于JMS实现的还有JbossMq(jboss4)、Jboss message(jboss5)、joram、ubermq、mantamq、openjms等。
二、JMS模型
1、消息传递域(消息模型)
1、Point-toPoint Message Demain(点对点)
1、每个消息发送只能有一个消费者
2、消息的生产者和消费者没事时间上的相关性,无论消费者在生产者的发送消息时是否处于运行状态,都能获取到消息
2、Publish/Subscribe Message Demain(发布/订阅)
1、每个消息可以有多个消费者
2、消息的生产者和消费者之间存在时间上的相关性,消费者订阅一个主题后只能获取订阅后发布的消息,但JMS规范允许消费者创建持久化
2、JMS API
ConnectionFactory // 连接工厂
Connection // 封装客户端与JMSProvider之前的连接
Session // 会话
Destination // 消息发送和消息接收的目的地
MessageProducer // 消息生产者
MessageConsumer // 消息消费者
具体可以参见activemq的不使用spring的demo,进行理解。
3、消息组成
1、消息头
包含消息的识别信息和路由信息,即javax.jms.Message类下的set、get的属性字段,如消息id、优先级等
void setJMSMessageID(String id) throws JMSException;
void setJMSTimestamp(long timestamp) throws JMSException;
void setJMSCorrelationIDAsBytes(byte[] correlationID) throws JMSException;
void setJMSCorrelationID(String correlationID) throws JMSException;
void setJMSReplyTo(Destination replyTo) throws JMSException;
void setJMSDestination(Destination destination) throws JMSException;
void setJMSDeliveryMode(int deliveryMode) throws JMSException;
void setJMSRedelivered(boolean redelivered) throws JMSException;
void setJMSType(String type) throws JMSException;
void setJMSExpiration(long expiration) throws JMSException;
void setJMSPriority(int priority) throws JMSException;
2、消息体
TextMessage
MapMessage
BytesMessage
StreamMessage
ObjectMessage
3、属性
特殊业务需求需要设置一些单独的属性信息,如:
void setBooleanProperty(String name, boolean value) throws JMSException;
void setByteProperty(String name, byte value) throws JMSException;
void setShortProperty(String name, short value) throws JMSException;
void setIntProperty(String name, int value) throws JMSException;
void setLongProperty(String name, long value) throws JMSException;
void setFloatProperty(String name, float value) throws JMSException;
void setDoubleProperty(String name, double value) throws JMSException;
void setStringProperty(String name, String value) throws JMSException;
void setObjectProperty(String name, Object value) throws JMSException;