ActiveMQ简介
ActiveMQ是Apache研发的消息中间件,支持JMS1.1和J2EE1.4规范的JMS Provider实现
主要应用于分布式系统架构中,帮助构建高可用,高性能,可伸缩的企业级面向消息服务的系统
ActiveMQ应用场景
1.异步发送消息
2.应用间解耦
3.流量削锋
ActiveMQ安装
tar -zxvf **.tar.gz
./activemq start 启动服务
访问页面 ip:port
注意 此版本需要jdk1.8及以上
JMS基本概念
java message service 是java平台中关于面向消息中间件的API,用于两个应用程序之间,或者分布式系统中发送消息,进行异步通信 。
类似JDBC,由厂商去实现
JMS是一个与具体平台无关的API,绝大多数MOM(message oriented middleware)面向消息中间件提供商都对JMS提供了支持。
下图就是MOM的模型
MOM:面向消息的中间件,使用消息传送提供者来协调消息传输操作。 MOM需要提供API和管理工具。 客户端调用api。 把消息发送到消息传送提供者指定的目的地
在消息发送之后,客户端会技术执行其他的工作。并且在接收方收到这个消息确认之前。提供者一直保留该消息
JMS规范
消息传递域:
* 点对点 p2p
1.每个消息只能被消费一次,也就是只能有一个消费者
2.消息的生产者和消费者没有时间上的相关性,无论消费者在生产者发送消息的时候是否是运行状态,都可以提取消息。
* 发布定于 pub/sub
1.每个消息可以有多个消费者
2.消息的生产者和消费者之间存在时间上的相关性,订阅一个主题的消费者只能消费自它订阅之后发布的消息。JMS规范允许提供客户端创建持久订阅
简单的例子:
<dependency> <groupId>org.apache.activemq</groupId> <artifactId>activemq-all</artifactId> <version>5.15.0</version> </dependency>
package org.maple.producer; import org.apache.activemq.ActiveMQConnectionFactory; import javax.jms.*; /** * @author mapleins * @Date 2018-12-20 19:46 * @Desc 生产者 **/ public class Producer { public static void main(String[] args) { //创建连接工厂 ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://192.168.0.110:61616"); //创建连接 Connection connection = null; try { //建立连接 connection = connectionFactory.createConnection(); connection.start(); //通过连接创建会话 Session session = connection.createSession(Boolean.TRUE, Session.AUTO_ACKNOWLEDGE); //通过Session创建队列,如果存在则不会再创建 //destination是目的地 Destination destination = session.createQueue("first queue"); //创建消息发送者 MessageProducer producer =session.createProducer(destination); //创建消息 TextMessage textMessage = session.createTextMessage("hello , activemq"); producer.send(textMessage); //提交会话 session.commit(); //关闭会话 session.close(); } catch (JMSException e) { e.printStackTrace(); } finally { if(connection!=null){ try { connection.close(); } catch (JMSException e) { e.printStackTrace(); } } } } }
package org.maple.consumer; import org.apache.activemq.ActiveMQConnectionFactory; import org.apache.activemq.ActiveMQMessageConsumer; import javax.jms.*; import javax.xml.soap.Text; /** * @author mapleins * @Date 2018-12-20 19:54 * @Desc 消费者 **/ public class Consumer { public static void main(String[] args) { //创建连接工厂 ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://192.168.0.110:61616"); //创建连接 Connection connection = null; try { //建立连接 connection = connectionFactory.createConnection(); connection.start(); //通过连接创建会话 Session session = connection.createSession(Boolean.TRUE, Session.AUTO_ACKNOWLEDGE); //通过Session创建队列,如果存在则不会再创建 //destination是目的地 Destination destination = session.createQueue("first queue"); //创建消费者 MessageConsumer consumer = session.createConsumer(destination); //接收消息 TextMessage message = (TextMessage) consumer.receive(); System.out.println(message.getText()); //提交会话 session.commit(); //关闭会话 session.close(); } catch (JMSException e) { e.printStackTrace(); } finally { if(connection!=null){ try { connection.close(); } catch (JMSException e) { e.printStackTrace(); } } } } }
JMS API
ConnectionFactory 连接工厂
Connection 封装客户端与JMS provider之间的一个虚拟的连接
Session 生产和消费消息的一个单线程上下文; 用于创建producer、consumer、message、queue..
Destination 消息发送或者消息接收的目的地
MessageProducer/consumer 消息生产者/消费者
消息组成
消息头
包含消息的识别信息和路由信息
消息体
TextMessage
MapMessage
BytesMessage
StreamMessage 输入输出流
ObjectMessage 可序列化对象