MessageConsumer
MessageConsumer是一个由Session创建的对象,用来从Destination接收消息。MessageConsumer createConsumer(Destination destination);
MessageConsumer createConsumer(Destination destination, String messageSelector);
MessageConsumer createConsumer(Destination destination, String messageSelector, boolean noLocal);
TopicSubscriber createDurableSubscriber(Topic topic, String name);
TopicSubscriber createDurableSubscriber(Topic topic, String name, String messageSelector, boolean noLocal);
其中messageSelector为消息选择器; noLocal标志默认为false,当设置为true时限制消费者只能接收和自己相同的连接(Connection)所发布的消息,此标志只适用于主题,不适用于队列; name标识订阅主题所对应的订阅名称,持久订阅时需要设置此参数。
public final String SELECTOR =“JMS_TYPE=‘MY_TAG1’”;该选择器检查了传入消息的JMS_TYPE属性,并确定了这个属性的值是否等于MY_TAG1。如果相等,则消息被消费;如果不相等,那么消息会被忽略。
public class producer {
//单例模式
//1连按工厂
private connectionFactory connectionractory ;
//2连接对象
private connection connection;
//3session对象
private session session;
//生产者
private MessageProducer messageProcpublic Producer() {
try {
this.connectionFactory = new ActiveMoconnectionFactory(
//ActiveMgconnectionFactory . DEPAULT_USER,
//ActiveMgconnectionFactory . DEPA0LT PAsswORD,
‘’bhz”,”bhz’”
"tep: / /1ocalhost: 61616");
this.connection = this.connectionractory.createconnection();
this.connection.start();
//非事务自动签收
this.session=this.connection.createSession(Boolean.FALSE,Session.AUT0_ACKNVOWIEEDGE);
this.messageProducer = this.session.createProducer(null);
) catch (JMSException e){
e. printstackTrace();
}
public session getsession(){
return this.session;
}
pub1ic vold send1 (/*String QueueName, Message message*/) {
try {
Destination destination = this. session. creategueue ("first");
MapMessage msg1 = this . session. crea teMapMessage() ;
msg1. setstring("name",“张三");
msg1. setstring("age", "23");
//标红部分是messageSelector能获取到的属性
msg1. setstringProperty ("color", "bIue");
msg1. setIn tProperty("sal", 2200);
MapMessage msg2 = this . session. crea teMapMessage() ;
msg2. setstring("name", "李四");
msg2. setstring("age", "26");
msg2. setstringProperty ("color", "red") ;
msg2. setIn tProperty("sal", 1300) ;
MapMessage msg3 = this. session. crea teMapMessage() ;
msg3. setString("name", "王五");
msg3. setstring("age", "28") ;
msg3. setstringProperty("color", "green");
msg3. setIn tProperty("sal", 1500) ;
MapMessage msg4 = this. session. crea teMapMessage() ;
msg4. setstring("name", "赵六");
msg4. setstring("age", "30");
msg4. setstringProperty ("color", "blue");
msg4. setIntProperty("sal", 1800) ;
}catch (JMSException e){
e.printstackTrace () ;
}
}
public void send2(/*string QueueName,Message message*/){
try {
Destination destination = this.session.createQueue ("first");
TextMessage msg = this.session.createTextMessage(”我是一个字符串内容");
this.messageProducer.send(destination,msg,DeliveryMode.NON_PERSTSTENT,9,1000*60*10L) ;
}catch (JMSException e){
e.printstackTrace () ;
}
}
public static void main (string[]args) {
Producer p = new Producer();
p.send1();
//p.senc2();
}
}
public class Consumer {
public final string SELECTOR 1 = "color = 'blue'";
//"JMSType = 'car' AND weight > 2500") ;
public final string SELECTOR 2 = "color = 'blue' AND sal > 2000";
public final String SELECTOR 3 = "receiver = 'A'";
//public final string SELECTOR 4 = "receiver = 'B!";
// 1连接工厂
private ConnectionFactory connectionFactory ;
// 2连接对象
private Connection connection;
// 3 session对象
private Session session;
//4消费者
private MessageConsumer messageConsumer;
// 5目标地址
private Destination des tination;
public Consumer () {
this . connectionFactory = new ActiveMQConnectionFactory (
"bhz", //ActiveMQConnectionFac tory. DEFAULT USER,
"bhz",//ActiveMQConnectionFactory. DEFAULT PASSWORD,
"tcp://localhost: 61616");
this. connection = this. connectionFactory. createConnection () ;
this . connection.start() ;
this.session = this. connection. createsession (Boolean . False, Session . AUTO ACKNOWLEDGE) ;
this. destination = this. session. createQueue ("first");
this . messageConsumer = this . sesslon . createConsumer (this . des tination, SELECTOR 3) ;
} catch (JMSException e) {
e.printstackTrace () ;
}
pub1ic void receiver() {
try {
this . messageConsumer . setMessageListener (new Listener ());
} catch (JMSException e) {
e.printstackTrace() ;
)
}
class Listener implements MessageLi stener {
@override
public void onMessage (Message message) {
try {
if (message instanceof TextMessage) {
}
if (message instanceof MapMessage) {
MapMessage ret = (MapMessage) message;
sys tem. out . println (ret. tostring());
Sys tem. out. printIn (ret. ge tstring ("name"));
System. out.printIn (ret. getstring("age"));
}
} catch
(JMSException e) {
e .printstackTrace();
}
I
}
}
public static void main (string[]args) {
Consumer c = new Consumer ();
c.receiver();
}
}
消息的同步和异步接收:
消息的同步接收是指客户端主动去接收消息,客户端可以采用MessageConsumer的receive方法去接收下一个消息。
Message receive()
Message receive(long timeout)
Message receiveNoWait()
消息的异步接收是指当消息到达时,ActiveMQ主动通知客户端,可以通过注册一个实现MessageListener接口的对象到MessageConsumer。 MessageListener只有一个必须实现的方法—— onMessage,它只接收一个参数,即Message。在为每个发送到Destination的消息实现onMessage时,将调用该方法。