0.1 概述
0.2JMS的组成和特点
JMS provider:实现JMS接口和规范的消息中间件,也就是MQ服务器
JMS producter:消息生产者,创建和发送JMS消息的客户端应用
JMS consumer:消息消费者,接收和处理JMS消息的客户端应用
JMS message:
消息头:
JMSDestination:消息发送的目的地,主要是指Queue和Topic
JMSDeliveryMode:持久模式和非持久模式
一条持久性的消息:如果JMS提供者出现故障,该消息并不会丢失,它会在服务器恢复之后再次传递。
一条非持久性的消息:最多会发送一次,这意味着服务器出现故障,该消息将会永远丢失。
JMSExpiration:可以设置在一定时间后过期,默认是永不过期。
timeToLive值等于零,表示该消息永不过期
如果发送后,在消息过期时间之后消息还没有被发送到目的地,则该消息被清除。
JMSPriority:消息优先级,从0-9十个级别,0到4是普通消息,5到9是加急消息,默认4级。
JMS MessageID:唯一识别每个消息的标识由MQ产生。
消息体:封装具体的消息数据,有5种消息体格式,发送和接收的消息体类型必须一致对应。
TextMessage:普通字符串消息,包含一个string
MapMessage:一个Map类型的消息,key为string类型,而值为java的基本类型
BytesMessage:二进制数组消息,包含一个byte[]
StreamMessage:Java数据流消息,用标准流操作来顺序的填充和读取
ObjectMessage:对象消息,包含一个可序列化的Java对象
消息属性:如果需要消息头字段以外的值,那么可以使用消息属性,有识别/去重/重点标注等操作的方法。
是以属性名和属性值对的形式制定的。指定一些消息头没有包括的附加信息。
0.3JMS的可靠性
PERSLSTENT:持久性
producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);//非持久:生产者发送消息到mq上,mq宕机则消息丢失
producer.setDeliveryMode(DeliveryMode.PERSISTENT);//持久:生产者发送消息到mq上,mq宕机消息不会丢失。(队列默认)
//如果主题设置持久化那么生产者的connection.start要放在持久化设置的下面
主题设置持久化那么消费者就要订阅主题:
public static void main(String[] args) throws JMSException, IOException {
ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory("tcp://192.168.12.128:61616");//1.创建连接工厂,按照给定的url地址,采用默认的用户名和密码
Connection connection = activeMQConnectionFactory.createConnection();//2.通过连接工厂获得连接
connection.setClientID("zhangsan");//3.表示一个叫zhangsan的订阅了主题
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);//4.创建会话Session。参数1事务;参数2签收
Topic topic01 = session.createTopic("topic01");//5.创建目的地主题.参数为主题名称
TopicSubscriber topicSubscriber = session.createDurableSubscriber(topic01, "wo shi zhangsan");//6.订阅topic01主题;备注
connection.start();//7.启动
TextMessage textMessage = (TextMessage)topicSubscriber.receive();
System.out.println(textMessage.getText());
//8.关闭资源
topicSubscriber.close();
session.close();
connection.close();
//必须先运行消费者,向mq注册并订阅了主题,然后在运行生产者
//消费者如果离线了,下次连接的时候,会把没有收到的消息都接收下来
}
transaction:事务
生产者事务:
false:执行send()后就提交到队列中。
true:执行send()后,在session关闭之前执行commit(),消息才提交到队列中。也可以回滚。
消费者事务:
false:消息只接收一次,不会重复。
true:不提交的话,会认为你没有消费,接收的消息会重复。
Acknowledge:签收
非事务:
自动签收(默认):session.AUTO_ACKNOWLEDGE
手动签收:session.CLIENT_ACKNOWLEDGE
调用acknowledge方法手动签收,否则在MQ上会认为你没有消费,接收的消息会重复。
System.out.println("=====消费者接收到消息"+textMessage.getText());
textMessage.acknowledge();
允许重复消息:session.DUPS_OK_ACKNOWLEDGE
事务:开启事务后,只有commit才会把消息变为已消费,不管你是什么签收方式。
注意:事务偏生产者,签收偏消费者