ActiveMQ消息队列的配置和使用操作

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qq_15038565/article/details/102771838

ActiveMQ消息队列在SSM项目开发中的具体详细使用,本次演示的是在SSM架构中使用消息队列ActiveMQ

1,消息中间件

百度百科解释:
消息中间件利用高效可靠的消息传递机制进行平台无关的数据交流,并基于数据通信来进行分布式系统的集成。通过提供消息传递和消息排队模型,它可以在分布式环境下扩展进程间的通信。
关键点:关注于数据的发送和接受,利用高效可靠的异步消息机制传递机制集成分布式系统。
在这里插入图片描述
在这里插入图片描述

2,ActiveMQ

ActiveMQ 是Apache出品,最流行的,能力强劲的开源消息总线。ActiveMQ 是一个完全支持JMS1.1和J2EE 1.4规范的 JMS Provider实现,尽管JMS规范出台已经是很久的事情了,但是JMS在当今的J2EE应用中间仍然扮演着特殊的地位。
主要特点:

  1. 多种语言和协议编写客户端。语言: Java, C, C++, C#, Ruby, Perl, Python, PHP。应用协议: OpenWire,Stomp REST,WS Notification,XMPP,AMQP
  2. 完全支持JMS1.1和J2EE 1.4规范 (持久化,XA消息,事务)
  3. 对Spring的支持,ActiveMQ可以很容易内嵌到使用Spring的系统里面去,而且也支持Spring2.0的特性
  4. 通过了常见J2EE服务器(如 Geronimo,JBoss 4, GlassFish,WebLogic)的测试,其中通过JCA 1.5 resource adaptors的配置,可以让ActiveMQ可以自动的部署到任何兼容J2EE 1.4 商业服务器上
  5. 支持多种传送协议:in-VM,TCP,SSL,NIO,UDP,JGroups,JXTA
  6. 支持通过JDBC和journal提供高速的消息持久化
  7. 从设计上保证了高性能的集群,客户端-服务器,点对点
  8. 支持Ajax
  9. 支持与Axis的整合
  10. 可以很容易得调用内嵌JMS provider,进行测试

3,ActiveMQ的消息形式

对于消息的传递有两种类型:
一种是点对点的,即一个生产者和一个消费者一一对应;
另一种是发布/订阅模式,即一个生产者产生消息并进行发送后,可以由多个消费者进行接收。
JMS定义了五种不同的消息正文格式,以及调用的消息类型,允许你发送并接收以一些不同形式的数据,提供现有消息格式的一些级别的兼容性。
  · StreamMessage – Java原始值的数据流
  · MapMessage–一套名称-值对
  · TextMessage–一个字符串对象
  · ObjectMessage–一个序列化的 Java对象
  · BytesMessage–一个字节的数据流

4,ActiveMQ的安装

4.1,官网下载linux版本的,第2个

进入http://activemq.apache.org/下载ActiveMQ
在这里插入图片描述

4.2,安装环境

1、需要jdk
2、安装Linux系统。生产环境都是Linux系统。

4.3,安装步骤(这边我使用的是云服务器,和linux同操作)

第一步: 把ActiveMQ 的压缩包上传到Linux系统。
在这里插入图片描述
第二步:解压缩。
在这里插入图片描述
第三步:启动。
在这里插入图片描述

使用bin目录下的activemq命令启动:
[root@localhost bin]# ./activemq start
关闭:
[root@localhost bin]# ./activemq stop
查看状态:
[root@localhost bin]# ./activemq status

第四步:进入管理后台:
http://111.111.111.111:8161/admin
用户名:admin
密码:admin
在这里插入图片描述
启动成功
这边说明一个问题:
active里面的jar包的使用注意事项:
在这里插入图片描述
如果单纯的使用active消息队列,那就把这个jar包导入你的项目中进行使用,如果是在spring容器中使用消息队列,就不要导入,因为这个包里面封装了一些和spring相同名称的类,会混淆spring开发,报错还找不到哪里出错了,这个时候就要使用版本5.11.2,这个5.11.2版本没有包含spring同名方法,推荐使用!需要请留言。
解决405问题,
修改host文件,配置机器名和127.0.0.1的映射关系
机器名:/etc/sysconfig/network文件中定义了机器名
然后重新启动activeMQ服务

5,ActiveMQ的使用方法

在这里插入图片描述

5.1,Queue

点对点(point-to-point,简称PTP)Queue消息传递模型:
生产者:生产消息,发送端。
把jar包添加到工程中。使用5.11.2版本的jar包。

	@Test
	public void testQueueProduce() throws Exception{
		//创建一个连接工厂对象,需要指定服务的ip和端口
		ConnectionFactory connectionFactory=new ActiveMQConnectionFactory("tcp://119.23.43.244:61616");
		//根据生产对象创建一个connection对象
		Connection createConnection = connectionFactory.createConnection();
		//开启连接,使用start开启
		createConnection.start();
		/*
		 * 创建一个session对象,第一个参数是是否开启事务,开启则第二个参数将无意义,默认不开启
		 * 第二个参数是应答模式,常用2种,自动和手动,建议默认自动
		 */
		javax.jms.Session createSession = createConnection.createSession(false, javax.jms.Session.AUTO_ACKNOWLEDGE);
		//使用session对象创建一个Destination对象,2种形式queue,topic
		Queue createQueue = createSession.createQueue("test-queue");//本次连接传输数据的name
		//使用session对象创建一个producer对象
		MessageProducer createProducer = createSession.createProducer(createQueue);
		//创建一个message对象,可以使用Testmessage
		TextMessage createTextMessage = createSession.createTextMessage("hello activeMQ");
		createProducer.send(createTextMessage);
		//关闭资源
		createProducer.close();
		createSession.close();
		createConnection.close();
	}

在这里插入图片描述
消费者:接收消息。

@Test
public void testActiveMQConsumer() throws Exception{
	//创建连接工厂对象
	ConnectionFactory connectionFactory=new ActiveMQConnectionFactory("tcp://119.23.43.244:61616");
	//创建连接
	Connection createConnection = connectionFactory.createConnection();
	//开启连接
	createConnection.start();
	//创建session
	javax.jms.Session createSession = createConnection.createSession(false, javax.jms.Session.AUTO_ACKNOWLEDGE);		
	//创建一个Destination对象
	Queue createQueue = createSession.createQueue("test-queue");
	//创建消费者
	MessageConsumer createConsumer = createSession.createConsumer(createQueue );
	//接受消息
	createConsumer.setMessageListener(new MessageListener() {
		@Override
		public void onMessage(Message message) {
			TextMessage textMessage=(TextMessage) message;
			String text;
			try {
				text=textMessage.getText();
				System.out.println(text);
			} catch (JMSException e) {
			}
		}
	});
	//等待接受消息
	System.in.read();
	//关闭资源
	createConsumer.close();
	createSession.close();
	createConnection.close();
}

在这里插入图片描述
消息接收完毕之后ActiveMQ就清除了等待接受的消息
在这里插入图片描述

5.2,Topic

发布/订阅(publish/subscribe,简称pub/sub)Topic消息传递模型:
生产者和消费者的逻辑和Queue差不多,只有创建Destination对象需要改变

//使用session对象创建一个Destination对象,2种形式queue,topic
Topic createTopic = createSession.createTopic("test-topic");//本次连接传输数据的name
//使用session对象创建一个producer对象
MessageProducer createProducer = createSession.createProducer(createTopic);

5.3,Queue和Topic的区别

1:
queue生产者发送消息后会把消息存到ActiveMQ服务器中,等待消费者接收。
Topic生产者发送消息后ActiveMQ如果没有消费者正在接收,会清除当前发送的消息,不会存到服务端存储。(Topic也可以实现持久化,配置持久化客户机到服务器即可,具体可查资料)

2:
Queue模式只允许一个消费者进行接收,默认选择最先开启的消费者进行接收。
Topic模式允许多个消费者进行接收,当生产者把消息发送到activeMQ的时候,当前等待接受的消费者有几个,就把当前消息分别发送给他们。
在这里插入图片描述
图片来自于@博客猴子哥哥1024

猜你喜欢

转载自blog.csdn.net/qq_15038565/article/details/102771838