《商城项目06》--用ActiveMQ实现消息的发送和接收

一, 使用场景

对商品信息进行操作的同时, 将数据同步到solr库, 实现该需求有以下几种方式:

方式1: 在e3-manager-service添加商品信息的实现类中直接写将数据添加到solr库; <弊端: 负责商品信息操作的开发人员不一定对solr熟悉, 所以得分离出来写, 这里可以直接调用写好的solr接口>

方式2: 单独写一solr服务 e3-xxx-service, 实现将商品信息数据同步到solr库; <弊端: 服务之间的调用耦合性太强, 如果两服务存在互相调用关系, 则应用启动时, 必定因找不到调用的服务而报错! > 

方式3: 用ActiveMQ消息队列中间件, 解除服务之间调用的耦合性;

 

二,ActiveMQ的下载安装(windows环境下)

1, 资源下载

链接:https://pan.baidu.com/s/1ZtHxbtfNOnngpYd4Dhpgww 
提取码:z0ta 
 

2, 解压使用

2.1 解压, 自定义 存放路径

2.2  启动MQ

直接双击启动会有点问题, 不清楚什么原因出现闪退

所以这里采用cmd命令方式启动:

cmd --> cd xxx\apache-activemq-5.12.0\bin -->activemq.bat start  -->回车

2.3 测试是否启动成功

(URL:  http://localhost:8161/admin/)

登录: admin/admin

能正确显示出以下页面即为ok

 

三, ActiveMQ的测试使用

1, 导包 (activemq-all-5.11.2.jar)

2, 具体测试方法

2.1  Queue模式(一对一)

    //新建服务提供者Queue, 进行消息发送	
    @Test
	public void testQueueProducer() throws Exception {
		// 第一步:创建ConnectionFactory对象,需要指定服务端ip及端口号。
		//brokerURL服务器的ip及端口号
		ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://localhost:61616");
		// 第二步:使用ConnectionFactory对象创建一个Connection对象。
		Connection connection = connectionFactory.createConnection();
		// 第三步:开启连接,调用Connection对象的start方法。
		connection.start();
		// 第四步:使用Connection对象创建一个Session对象。
		//第一个参数:是否开启事务。true:开启事务,第二个参数忽略。
		//第二个参数:当第一个参数为false时,才有意义。消息的应答模式。1、自动应答 2、手动应答。一般是自动应答。
		Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
		// 第五步:使用Session对象创建一个Destination对象(topic、queue),此处创建一个Queue对象。
		//参数:队列的名称。
		//Queue queue = session.createQueue("test-queue");
		Queue queue = session.createQueue("spring-queue");
		// 第六步:使用Session对象创建一个Producer对象。
		MessageProducer producer = session.createProducer(queue);
		// 第七步:创建一个Message对象,创建一个TextMessage对象。
		/*TextMessage message = new ActiveMQTextMessage();
		message.setText("hello activeMq,this is my first test.");*/
		TextMessage textMessage = session.createTextMessage("hello activeMq, this is my first test.");
		// 第八步:使用Producer对象发送消息。
		producer.send(textMessage);
		// 第九步:关闭资源。
		producer.close();
		session.close();
		connection.close();
	}

 

    //新建服务消费者Consunmer, 对消息进行接收
    @Test
	public void testQueueConsumer() throws Exception {
		// 第一步:创建一个ConnectionFactory对象。
		ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://localhost:61616");
		// 第二步:从ConnectionFactory对象中获得一个Connection对象。
		Connection connection = connectionFactory.createConnection();
		// 第三步:开启连接。调用Connection对象的start方法。
		connection.start();
		// 第四步:使用Connection对象创建一个Session对象。
		Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
		// 第五步:使用Session对象创建一个Destination对象。和发送端保持一致queue,并且队列的名称一致。
		//Queue queue = session.createQueue("test-queue");
		Queue queue = session.createQueue("spring-queue");
		// 第六步:使用Session对象创建一个Consumer对象。
		MessageConsumer consumer = session.createConsumer(queue);
		// 第七步:接收消息。
		consumer.setMessageListener(new MessageListener() {
			@Override
			public void onMessage(Message message) {
				try {
					TextMessage textMessage = (TextMessage) message;
					String text = null;
					//取消息的内容
					text = textMessage.getText();
					// 第八步:打印消息。
					System.out.println(text);
				} catch (JMSException e) {
					e.printStackTrace();
				}
			}
		});
		//等待键盘输入
		System.in.read();
		// 第九步:关闭资源
		consumer.close();
		session.close();
		connection.close();
	}

 

2.2 Topic广播模式(一对多 )

    //新建服务提供者TopicProducer, 进行消息广播式发送
	@Test
	public void testTopicProducer() throws Exception {
		// 第一步:创建ConnectionFactory对象,需要指定服务端ip及端口号。
		// brokerURL服务器的ip及端口号
		ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://localhost:61616");
		// 第二步:使用ConnectionFactory对象创建一个Connection对象。
		Connection connection = connectionFactory.createConnection();
		// 第三步:开启连接,调用Connection对象的start方法。
		connection.start();
		// 第四步:使用Connection对象创建一个Session对象。
		// 第一个参数:是否开启事务。true:开启事务,第二个参数忽略。
		// 第二个参数:当第一个参数为false时,才有意义。消息的应答模式。1、自动应答2、手动应答。一般是自动应答。
		Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
		// 第五步:使用Session对象创建一个Destination对象(topic、queue),此处创建一个topic对象。
		// 参数:话题的名称。
		Topic topic = session.createTopic("test-topic");
		// 第六步:使用Session对象创建一个Producer对象。
		MessageProducer producer = session.createProducer(topic);
		// 第七步:创建一个Message对象,创建一个TextMessage对象。
		/*
		 * TextMessage message = new ActiveMQTextMessage(); message.setText(
		 * "hello activeMq,this is my first test.");
		 */
		TextMessage textMessage = session.createTextMessage("hello activeMq,this is my topic test");
		// 第八步:使用Producer对象发送消息。
		producer.send(textMessage);
		// 第九步:关闭资源。
		producer.close();
		session.close();
		connection.close();
	}
    //新建服务消费者Consunmer,对消息进行接收,该方法可以并行启动多次,相当于同时有多个消息接收者
    @Test
	public void testTopicConsumer() throws Exception {
		// 第一步:创建一个ConnectionFactory对象。
		ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://localhost:61616");
		// 第二步:从ConnectionFactory对象中获得一个Connection对象。
		Connection connection = connectionFactory.createConnection();
		// 第三步:开启连接。调用Connection对象的start方法。
		connection.start();
		// 第四步:使用Connection对象创建一个Session对象。
		Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
		// 第五步:使用Session对象创建一个Destination对象。和发送端保持一致topic,并且话题的名称一致。
		Topic topic = session.createTopic("test-topic");
		// 第六步:使用Session对象创建一个Consumer对象。
		MessageConsumer consumer = session.createConsumer(topic);
		// 第七步:接收消息。
		consumer.setMessageListener(new MessageListener() {
			@Override
			public void onMessage(Message message) {
				try {
					TextMessage textMessage = (TextMessage) message;
					String text = null;
					// 取消息的内容
					text = textMessage.getText();
					// 第八步:打印消息。
					System.out.println(text);
				} catch (JMSException e) {
					e.printStackTrace();
				}
			}
		});
		System.out.println("topic的消费端01。。。。。");
//		System.out.println("topic的消费端02。。。。。");
		// 等待键盘输入
		System.in.read();
		// 第九步:关闭资源
		consumer.close();
		session.close();
		connection.close();
	}

备注: 

Topic广播模式需要在消息接收方法启动的状态下, 再进行消息发送才能被接收到; 如果没有消息接收者的情况下, 发送的消息会随即被销毁; 

猜你喜欢

转载自blog.csdn.net/weixin_39039342/article/details/84193491
今日推荐