淘淘商城42-使用java向ActiveMQ服务器发送Queue消息与Topic消息

版权声明:本文为博主原创文章,如有转载请注明出处,谢谢。 https://blog.csdn.net/pdsu161530247/article/details/82024281

目录

1.导入依赖

2.发收Queue消息

2.1消息生产者

2.2消息消费者

3.发收Topic消息

3.1消息生成者

3.2消息消费者

4.总结


1.导入依赖

首先导入maven依赖,也可以直接导入jar包

<dependency>
	<groupId>org.apache.activemq</groupId>
	<artifactId>activemq-all</artifactId>
	<version>5.13.0</version>
</dependency>
		

2.发收Queue消息

一个生产者和一个消费者一一对应

2.1消息生产者

生产者发送消息

package com.activemq.queue;

import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.MessageProducer;
import javax.jms.Queue;
import javax.jms.Session;
import javax.jms.TextMessage;

import org.apache.activemq.ActiveMQConnectionFactory;
import org.junit.Test;

public class QueueProducer {
	//生产者发送消息
	@Test
	public void send() throws Exception{
		//1.创建一个连接工厂 connectionfactory
		//参数:就是要连接的服务器的地址
		ConnectionFactory factory = new ActiveMQConnectionFactory("tcp://192.168.15.133:61616");
		//2.通过工厂获取连接对象 创建连接
		Connection connection = factory.createConnection();
		//3.开启连接
		connection.start();
		//4.创建一个session对象  提供发送消息等方法
		//第一个参数:表示是否开启分布式事务(JTA)  一般是false 不开启。
		//第二个参数:就是设置消息的应答模式   如果 第一个参数为false时,第二个参数设置才有意义。用的是自动应答
		Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
		//5.创建目的地 (destination)  queue  
		//参数:目的地的名称
		Queue queue = session.createQueue("queue-test");
		//6.创建个生产者
		MessageProducer producer = session.createProducer(queue);
		//7.构建消息的内容  
		TextMessage textMessage = session.createTextMessage("queue测试发送的消息");
		//8.发送消息
		producer.send(textMessage);
		//9.关闭资源
		producer.close();
		session.close();
		connection.close();
	}
}

  我们运行上面的测试方法,执行成功后,我们到activemq的后台管理系统,点击"Queues",可以看到我们刚才发送的那条消息"test-queue"。我们点击"test-queue"

我们会看到如下图所示界面,可以看到刚才发送的那条消息的ID信息,Persistence(持久化)为永久保存,Priorty(优先级)为4,Redelivered(是否重复投递消息)为false,即不重复投递消息。我们点击ID那一长串字符串。

如果出现错误一定要注意jdk版本与activeMQ版本是否对应(版本对应查看

我们在"Message Details"一栏,可以看到我们发送的消息信息。

2.2消息消费者

消费者接收消息,接收消息有两种方式一种是手动写循环接收消息,一种是使用监听器帮我们接收消息。

package com.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 factory = new ActiveMQConnectionFactory("tcp://192.168.25.133: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.接收消息 打印
			//第一种
		/*while(true){
			Message message = consumer.receive(1000000);//设置接收消息的超时时间
			//没有接收到消息就跳出循环
			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的管理后台,点击"Queues",可以看到如下图所示界面。说明我们面对面发送消息是没问题的。

3.发收Topic消息

一个生产者产生消息并进行发送后,可以由多个消费者进行接收。

3.1消息生成者

package com.activemq.topic;

import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.MessageProducer;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.jms.Topic;

import org.apache.activemq.ActiveMQConnectionFactory;
import org.junit.Test;

public class TopicProducer {

	// 发送topic
	@Test
	public void send() throws Exception {
		//1.创建连接工厂
		ConnectionFactory factory = new ActiveMQConnectionFactory("tcp://192.168.25.133:61616");
		//2.创建连接
		Connection connection = factory.createConnection();
		//3.开启连接
		connection.start();
		//4.创建session
		Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
		//5.创建目的地    topic
		Topic createTopic = session.createTopic("topic-test");
		//6.创建生成者
		MessageProducer producer = session.createProducer(createTopic);
		//7.构建消息对象
		TextMessage createTextMessage = session.createTextMessage("topic发送的消息123");
		//8.发送消息
		producer.send(createTextMessage);
		//9.关闭资源
		producer.close();
		session.close();
		connection.close();
	}
}

 运行上面的测试方法,运行成功后,我们访问activemq的管理后台页面,点击"Topics",可以看到有"test-topic"这一行,压入消息队列一条消息,但由于没有消费者,因此没有消费掉该消息。

我们点击上图的"test-topic",会看到如下图所示界面。我们发现刚才我们发送的消息并没有被保存。

3.2消息消费者

我们创建两个消费者

package com.activemq.topic;

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.Session;
import javax.jms.TextMessage;
import javax.jms.Topic;

import org.apache.activemq.ActiveMQConnectionFactory;
import org.junit.Test;

public class TopicCustomer1 {
	
	
	@Test
	public void reieve() throws Exception {
		// 1.创建连接的工厂 指定MQ服务器的地址
		ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://192.168.25.133:61616");
		// 2.获取连接
		Connection connection = connectionFactory.createConnection();
		// 3.开启连接
		connection.start();
		// 4.根据连接对象创建session (提供了操作activmq的方法)
		// 第一个参数:表示是否开启分布式事务(JTA) 一般就是false :表示不开启。 只有设置了false ,第二个参数才有意义。
		// 第二个参数:表示设置应答模式 自动应答和手动应答 。使用的是自动应答
		Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
		// 5.根据session创建目的地(destination)
		Topic topic = session.createTopic("topic-test");
		// 6.创建消费者;
		MessageConsumer consumer = session.createConsumer(topic);
		// 7.接收消息

		// 第一种接收消息.直接接收 只是测试的使用
		/*
		 * while(true){ //设置接收消息的超时时间 单位是毫秒 Message receive =
		 * consumer.receive(3000000);
		 * 
		 * if(receive==null){ break; }
		 * 
		 * //取消息 if(receive instanceof TextMessage){ TextMessage message =
		 * (TextMessage)receive; String text = message.getText();//获取消息的内容
		 * System.out.println(text); } }
		 */

		// 第二种接收消息.设置一个监听器 就是开启了一个新的线程
		consumer.setMessageListener(new MessageListener() {

			@Override
			public void onMessage(Message message) {
				if (message instanceof TextMessage) {
					TextMessage message2 = (TextMessage) message;
					String text = "";
					try {
						text = message2.getText();
					} catch (JMSException e) {
						e.printStackTrace();
					} // 获取消息的内容
					System.out.println(text);
				}
				System.out.println();
			}
		});
		// 睡眠
		Thread.sleep(10000000);

		// 9.关闭资源
		consumer.close();
		session.close();
		connection.close();
	}
}

我们运行其中一个消费者,会发现,接收不到消息。因为Topic消息,一发送出去,默认不会存储,只要没有人接收,消息就丢了。

需要先运行消费者的监听器,然后生产者发送消息,消费者才会接收到消息。

4.总结

queue 是点对点模式,只能是一个生产者产生一个消息,被一个消费者消费。

topic 是发布订阅模式,一个生产者可以一个消息,可以被多个消费者消费。

queue 默认是存在于MQ的服务器中的,发送消息之后,消费者随时取。但是一定是一个消费者取,消费完消息也就没有了。

topic 默认是不存在于MQ服务器中的,一旦发送之后,如果没有订阅,消息则丢失。

如果想要持久化topic消息

修改activeMQ/conf/activemq.xml文件,在<broker的末尾添加一句关于持久化的配置persistent="true"

猜你喜欢

转载自blog.csdn.net/pdsu161530247/article/details/82024281
今日推荐