每个人的人生里都会遇见一场措手不及的大雨
若你身陷雨中
愿有人为你撑伞
如果没有
也愿你有听雨的心情
文章目录
ActiveMQ消息队列在SSM项目开发中的具体详细使用,本次演示的是在SSM架构中使用消息队列ActiveMQ
1,消息中间件
百度百科解释:
消息中间件利用高效可靠的消息传递机制进行平台无关的数据交流,并基于数据通信来进行分布式系统的集成。通过提供消息传递和消息排队模型,它可以在分布式环境下扩展进程间的通信。
关键点:关注于数据的发送和接受,利用高效可靠的异步消息机制传递机制集成分布式系统。
2,ActiveMQ
ActiveMQ 是Apache出品,最流行的,能力强劲的开源消息总线。ActiveMQ 是一个完全支持JMS1.1和J2EE 1.4规范的 JMS Provider实现,尽管JMS规范出台已经是很久的事情了,但是JMS在当今的J2EE应用中间仍然扮演着特殊的地位。
主要特点:
- 多种语言和协议编写客户端。语言: Java, C, C++, C#, Ruby, Perl, Python, PHP。应用协议: OpenWire,Stomp REST,WS Notification,XMPP,AMQP
- 完全支持JMS1.1和J2EE 1.4规范 (持久化,XA消息,事务)
- 对Spring的支持,ActiveMQ可以很容易内嵌到使用Spring的系统里面去,而且也支持Spring2.0的特性
- 通过了常见J2EE服务器(如 Geronimo,JBoss 4, GlassFish,WebLogic)的测试,其中通过JCA 1.5 resource adaptors的配置,可以让ActiveMQ可以自动的部署到任何兼容J2EE 1.4 商业服务器上
- 支持多种传送协议:in-VM,TCP,SSL,NIO,UDP,JGroups,JXTA
- 支持通过JDBC和journal提供高速的消息持久化
- 从设计上保证了高性能的集群,客户端-服务器,点对点
- 支持Ajax
- 支持与Axis的整合
- 可以很容易得调用内嵌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的时候,当前等待接受的消费者有几个,就把当前消息分别发送给他们。
文章持续更新,可以微信搜索「 绅堂Style 」第一时间阅读,回复【资料】有我准备的面试题笔记。
GitHub https://github.com/dtt11111/Nodes 有总结面试完整考点、资料以及我的系列文章。欢迎Star。