学习分布式——ActiveMQ 消息中间件(五)

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.消息被消费后队列中不会在存储,所以消费者不会消费到已经被消费的消息。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值