上一讲我们一起学习了如何使用ActiveMQ来发送点对点消息,这一讲我们就来学习下如何接收消息。

首先,我们在itheima-activemq工程中新建一个类,并在该类中添加一个测试方法,如下图所示。

activemq 发送消息测试程序_java


为了方便大家复制,现将以上QueueCustomer类的代码贴出,如下所示。

package com.itheima.activemq.queue;

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;
import org.junit.Test;

public class QueueCustomer {
	@Test
	public void recieve() throws Exception {
		// 1. 创建一个连接工厂,即ConnectionFactory
		ConnectionFactory factory = new ActiveMQConnectionFactory("tcp://192.168.81.135:61616");
		// 2. 通过工厂获取连接对象
		Connection connection = factory.createConnection();
		// 3. 开启连接
		connection.start();
		// 4. 创建一个Session对象,提供接收消息等方法
		/*
		 * 第一个参数:表示是否开启分布式事务(JTA),一般不开启,即设置为false
		 * 第二个参数:就是设置消息的应答模式,如果第一个参数为false时,那么第二个参数的设置才有意义,一般用的是自动应答
		 */
		Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
		// 5. 创建接收消息的一个目的地
		Queue queue = session.createQueue("queue-test");
		// 6. 创建一个消费者,来接收消息
		MessageConsumer consumer = session.createConsumer(queue);
		// 7. 接收消息并打印,接收消息一共有两种方式
		// 第一种方式
		// 如果在这个时间内,只是调用receive方法,那么它只接收了一次,接收了一次,那么其他人就接收不了了,所以这个时候我们就要弄一个循环
		/*
		while (true) {
			Message message = consumer.receive(1000000); // 设置接收消息的超时时间(毫秒),在这个时间内,如果有消息发送过来,那么都能接收到,超过这个时间就断了
			
			// 如果接收的消息为null,即没有接收到消息,就跳出循环
			if (message == null) {
				break;
			}
			if (message instanceof TextMessage) {
				TextMessage message2 = (TextMessage) message;
				System.out.println("接收的消息为:" + message2.getText());
			}
		}
		*/
		
		// 第二种方式,在生产环境中,一般是不用第一种方式的,因为用这种方式,就必须得一直等着。
		// System.out.println("start");
		// 设置一个监听器
		// 这里其实是开辟了一个新的线程,其实它就是一个子线程(涉及到了多线程的应用)
		consumer.setMessageListener(new MessageListener() {
			
			// 当有消息的时候,就会执行以下的逻辑
			@Override
			public void onMessage(Message message) {
				if (message instanceof TextMessage) {
					TextMessage message2 = (TextMessage) message;
					try {
						System.out.println("接收的消息为:" + message2.getText());
					} catch (JMSException e) {
						e.printStackTrace();
					}
				}
			}
		});
		// System.out.println("end");
		Thread.sleep(199999); // 让主线程一直等待,一直监听,只要这个主线程没挂,它就一直可以监听到消息的发送
		
		// 8. 关闭资源
		consumer.close();
		session.close();
		connection.close();
	}
}

执行上面的测试方法,执行成功之后,可以看到正确输出了我们上文发送的消息,如下图所示,这时程序并没有结束(下图中还有一个红色运行标志)。

activemq 发送消息测试程序_java_02


我们再发送两条不同的消息,看看是不是能马上接收到新的消息,如下图所示,发现只要一发送消息,接收端便立刻会显示出发送的消息。

activemq 发送消息测试程序_java_03


如果我们想结束接收消息,那么在Console控制台直接点击红色运行标志即可,如下图所示。

activemq 发送消息测试程序_测试方法_04


我们再来看下ActiveMQ的管理后台,这时点击Queues,便可以看到如下图所示界面,我们发送了3条消息,消费了3条消息,因此当前待发送消息数量为0,向队列中添加了3条信息,又取出了3条信息,最后消费者被我们关闭了,因此当前消费者数量为0。

activemq 发送消息测试程序_淘淘商城_05


至此,点对点发送与接收消息,我已讲完。有任何疑问,可以找我讨论。