- MQ主要的作用:削峰,异步,解耦
- JMS 的四大对象,(1)provider 实现规范的:activemq :服务器(2)producer 生产者 :客户端对象(3)consumer消费者:客户端对象(4)消息message :也是客户端 其中的关键就是消息,queue和topic不过是怎么传递,真正要用的是消息。
消息头
(1)目的地
(2)持久化(如果服务器宕机,消息可以被回复)
(3)过期时间(0 也就是永久有效。)是消息在有效时间内没有发送到目的地。就清除。
(4)优先级 0-4 普通 5-9 加急信息。默认是4, 其实就是两个级别。 高级别比低级的先。
(5)信息的id (最重要:唯一标识)
消息体
- Text 就是一个String的字符 ,就保存值
- Map key 就是String 类型,就是保存的是键值对
代码演示
发送
MapMessage mapMessage = session.createMapMessage();
mapMessage.setString("abc","uuuuuuu");
获取
String text = ((MapMessage) message).getString("abc");
System.out.println("text = " + text);
消息属性
- 归类使用吧 setStringProperty 这个主要是让获取消息的时候,多了一个判断条件。&& 和MapMessage一样,只是 后者是Message体。 用于识别 | 去重 | 过滤 等使用。
赋值
textMessage.setStringProperty("vip","woqu");
获取
String text1 = ((TextMessage) message).getStringProperty("vip");
System.out.println("text1 = " + text1);
消息的可靠性
topic的持久化 在创建消费者的时候代码不同了
producer.setDeliveryMode(DeliveryMode.PERSISTENT);
connection.start(); 这句话挪到下边来。
以上的这个是在生产者
TopicSubscriber topicSubscriber = session.createDurableSubscriber(topic, "remark");//以前是session.createConsumer(topic) 因为我们创建的是durable 的Subscriber 订阅者
connection.setClientID("home");
connection.start(); 放在后边
-
持久化 delivery 队列默认就是 持久化的。持久化的设置是在produce.setDeliveryMode(DeliveryMode.PERSISTENT) 如果是持久化。宕机后我们可以回复。 如果是非持久化。宕机后全部是0;用的是queue
- 持久化的topic ,也是要设置上面的持久化语句。然后在消费者中,session.createDurableSubscriber(topic, “remark…”); 创建的不是之前的消费者了,而是订阅者,我们要先启动这个订阅者,每一次的receive只是等一条消息。如果订阅者启动过了,然后退出,还是能收到主题的消息。
- 事务,其实主要是针对把数据放在队列中。 connection.createSession(false,Session.ACKNOWLEDGE) 第一个参数就是事务,如果我们开启事务,就需要session.commit()。这个是配合使用的才能生效。如果是生产者这边设置了事务,其实这是生产者自己这边有效。对于,使用者来说。如果没有commit就会造成消息的重复消费。
- 非事务 签收,默认我们是自动的签收,只能签收一次,如果你改成手动签收,但是没有签收,那么可以一直获取。也就是消息的重复消费。testMessage.acknowledge()手动签收消息,设置了模式,就是说怎么样生效。如果是
- 如果是事务true,生产者的签收就不重要了,因为不用,只不过这个是一个通用的方法,没事务的时候,签收才是重要的。消费者的签收也不重要了。也就是如果是true后边就不用看了