ActiveMQ队列同步消费和异步消费
一、同步消费者
//监听消息
//一直处于阻塞状态
Message message = messageConsumer.receive();
//3秒没有收到消息就放弃
Message message = messageConsumer.receive(300);
二、异步消费者
使用异步线程进行监听
MessageListener:消息的监听器,当消息到达时会回调onMessage方法,在测试的时候不能让程序结束,所以加上了System.in.read();
package com.study.queue;
import java.io.IOException;
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageConsumer;
import javax.jms.MessageListener;
import javax.jms.Queue;
import javax.jms.Session;
import javax.jms.TextMessage;
import org.apache.activemq.ActiveMQConnectionFactory;
/*
* 创建队列消费者 异步方式
*/
public class TestQueueConsumerSync {
private static String brokerURL = "tcp://0.0.0.0:61616";
private static String queueName = "testQueue";
public static void main(String[] args) {
//1.创建ConnectionFactory 需要指定服务端ip和端口
ConnectionFactory factory = new ActiveMQConnectionFactory(brokerURL);
//2.使用ConnectionFactory创建connection对象
Connection connection;
try {
connection = factory.createConnection();
//3.开启连接,调用Connection对象的start方法。
connection.start();
//使用Connection对象创建session对象
//4.第一个参数是否开启事务,第二个参数是接收者的签收状态
Session session =connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
//5.使用session对象创建Destination对象 目标创建一个Queue对象
Queue queue = session.createQueue(queueName);
//6.使用session对象创建一个Consumer对象
MessageConsumer messageConsumer = session.createConsumer(queue);
//7.监听消息
messageConsumer.setMessageListener(new MessageListener() {
public void onMessage(Message message) {
if(message instanceof TextMessage){
TextMessage textMessage = (TextMessage) message;
try {
System.err.println("接收到的消息内容:"+textMessage.getText());
} catch (JMSException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
});
//不让程序结束
System.in.read();
//8.关闭资源
messageConsumer.close();
session.close();
connection.close();
System.out.println("消息接收成功!");
} catch (JMSException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
三、总结
1.每一个消息只能有一个消费者,是1对1的关系。
2.生产者和消费者没有时间上的相关性。无论消费者在生产者发送消息的时候是否处于运行状态,消费者都可以提取消息。
3.消息被消费后队列中不会在存储,所以消费者不会消费到已经被消费的消息。