4:JMS组成结构与特点(四大元素) 4.1:JMS provider 实现JMS接口和规范的消息中间件,也就是MQ服务器(安装的MQ软件) 4.2:JMS producer 消息生产者,创建以及发送消息的客户端应用 4.3:JMS consumer 消息消费者,接收与处理消息的客户端 4.4:JMS message 4.4.1:消息头 4.4.1.1:JMSDestination //目的地 4.4.1.2:JMSDeliveryMode //持久化:持久化的模式保证了消息可靠性 persistent 持久 non_persistent 非持久 redis:rdb aof 4.4.1.3:JMSExpiration //过期时间:默认永不过期 4.4.1.4:JMSPririty //优先级(0-9 越大越优先,非绝对) 4.4.1.5:JMSMessageID //消息生成的唯一标识,也可以自己定义(分布式项目可以使用分布式id生成器) 4.4.2:消息体 4.4.2.1:TextMessage 常用 4.4.2.2:MapMessage 常用 4.4.2.3:BytesMessage 4.4.2.4:StreamMesage 4.4.2.5:ObjectMessage 4.4.3:消息属性(对消息体的进一步区分) 4.4.3.1:如果需要除消息头字段以外的值,那么可以使用消息属性 4.4.3.2:识别/去重/重点标注等操作非常有用的方法(找属性值为vip的) message.send()之前,对消息设置属性
消息头
@Test public void queueProduce() throws JMSException { ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory(userName, password, url); Connection connection = factory.createConnection(); connection.start(); Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); Destination queue = session.createQueue(queueName); //消息头 目的地 MessageProducer producer = session.createProducer(queue); producer.setDeliveryMode(DeliveryMode.PERSISTENT); //消息头 持久化 PERSISTENT持久化 NON_PERSISTENT非持久化(mq挂了后消息会丢失) producer.setPriority(9); //消息头 权重 越大越先执行(5-9加急 0-4普通;5加急的要比普通的先执行) for (int i = 1; i <= 10; i++) { String msg = "第" + i + "个msg"; TextMessage message = session.createTextMessage(msg); message.setStringProperty("source", "dingding"); message.setJMSExpiration(1000 * 60 * 60 * 24L); //消息头 过期时间 默认永不过期(0) message.setJMSMessageID("111111"); //消息头 消息id 可以解决消息消费的幂等性 producer.send(message); } }
消息体
TextMessage 常用 MapMessage 常用 BytesMessage StreamMesage ObjectMessage
消息属性
生产者业务判断,进一步标记消息;比如:用户为vip,需要特殊处理,可以使用 setStringProperty("idVip","y"); 在消费端,判断此属性为y时特殊处理