这两天在看activeMQ,之前用到过,但是没有很系统的去学习,今天看到里边有个消息过滤,之前不了解,这次记录下来,后续有其他的还会再补充。
1、发送消息放入特殊标志:
message.setStringProperty(name, value);
2、接收消息使用基于特殊标志的消息选择器:
MessageConsumer createConsumer(Destination destination, String messageSelector);
注:消息选择器是一个字符串,语法与数据库的SQL相似,相当于SQL语句where条件后面的内容;
直接看代码吧,生产者和消费者,这里用队列演示。
生产者:
package com.yuan.filter;
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.Message;
import javax.jms.MessageProducer;
import javax.jms.Queue;
import javax.jms.Session;
import org.apache.activemq.ActiveMQConnectionFactory;
import org.apache.activemq.command.ActiveMQQueue;
public class SenderQueue {
public static void main(String[] args) {
// 1.获取工厂 连接broker
ConnectionFactory cf = new ActiveMQConnectionFactory("tcp://192.168.126.128:61616");
Connection conn = null;
Session session = null;
MessageProducer producer = null;
try {
// 获得新连接
conn = cf.createConnection();
// 3.通过连接获取session
session = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);
// 4.通过session获取队列目的地
Destination destination = new ActiveMQQueue("yuanQueue");// 基于队列发送
// Queue createQueue = session.createQueue("yuanQueue");
// 5.通过session获取生产者,配置发送消息地址
producer = session.createProducer(destination);
for (int i = 0; i < 20; i++) {
// 6.通过session获取消息
Message message = session.createTextMessage("yuan" + i);
// 消息发送时,设置唯一标识
message.setIntProperty("flag", i);
// 7.发送
producer.send(message);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
try {
// 7.关闭连接,session,生产者
if (conn != null) {
conn.close();
}
if (session != null) {
session.close();
}
if (producer != null) {
producer.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
消费者:
package com.yuan.filter;
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.Message;
import javax.jms.MessageConsumer;
import javax.jms.Session;
import javax.jms.TextMessage;
import org.apache.activemq.ActiveMQConnectionFactory;
public class ReceiverQueue {
public static void main(String[] args) {
Connection connection = null;
Session session = null;
MessageConsumer consumer = null;
// 1.创建连接工厂
ConnectionFactory cf = new ActiveMQConnectionFactory("tcp://192.168.126.128:61616");
try {
// 2.创建连接
connection = cf.createConnection();
// 3.创建session 参数是是否开启事物
session = connection.createSession(Boolean.FALSE, Session.AUTO_ACKNOWLEDGE);
// 4.使用session创建消息的目的地
Destination destination = session.createQueue("yuanQueue");
// 写一个sql的where条件,但是where关键词要省略
//String messageSelector = "flag='abcd'";
String messageSelector = "flag >=10 and flag<=15";
// 5.使用session创建消息的消费者
consumer = session.createConsumer(destination, messageSelector);
// 接收消息之前,需要调用启动方法
connection.start();
while(true){
// 6.设置接收者接收消息的时间,为了便于测试,这里设定为100s
Message message = consumer.receive();
// 消息类型有五种
if (null != message && message instanceof TextMessage) {
System.out.println("收到文本消息队列" + ((TextMessage) message).getText());
}
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (connection != null) {
connection.close();
}
if (session != null) {
session.close();
}
if (consumer != null) {
consumer.close();
}
} catch (Throwable ignore) {
}
}
}
}