JMS简介:http://blog.csdn.net/ka_ka314/article/details/79572214
一、ActiveMQ概述
ActiveMQ是一种开源的,实现了JMS规范的,面向消息(MOM)的中间件,为应用程序提供高效的、可扩展的、稳定的和安全的企业级消息通信。
ActiveMQ官网:http://activemq.apache.org/
二、ActiveMQ下载安装 --- Linux环境
2.1、下载
ActiveMQ下载地址:http://activemq.apache.org/download-archives.html
2.2、安装
(1) 将下载的安装包上传至Linux服务器
(2) 解压安装包
tar zxvf apache-activemq-xx.xx.xx-bin.tar.gz
解压后的目录如下:
- bin --- 存放的是脚本文件
- conf --- 存放的是基本配置文件
- data --- 存放的是日志文件
- docs --- 存放的是说明文档
- examples --- 存放的是简单的实例
- lib --- 存放的是activemq所需jar包
- webapps --- 用于存放项目的目录
(3) 为ActiveMQ授权 --- VM中
安装目录授权
chmod 777 apache-activemq-xx.xx.xx
进入bin目录,为activemq授权
chmod 755 activemq
注意:Linux授权三个数字的含义:
- 第一个数字表示文件所有者的权限
- 第二个数字表示与文件所有者同属一个用户组的其他用户的权限
- 第三个数字表示其它用户组的权限。
2.3、启动与停止
(1) 启动:
./activemq start
出现如下内容表示启动成功:
(2) 查看启动状态:
./activemq status
(3) 停止:
./activemq stop
2.4、ActiveMQ管理页面
(1) 启动完成后,可以访问ActiveMQ管理页面
http://192.168.25.130:8161/
(2) 点击Manage ActiveMQ broker进入管理页面,默认用户名/密码:admin/admin
(3) 点击Queues可以查看队列信息
Number Of Pending Messages --- 等待消费的消息 这个是当前未出队列的数量。
Number Of Consumers --- 消费者 这个是消费者端的消费者数量
Messages Enqueued --- 进入队列的消息 进入队列的总数量,包括出队列的。
Messages Dequeued --- 出了队列的消息 可以理解为是消费这消费掉的数量。
三、ActiveMQ快速入门
3.1 点对点模式 --- PTP
点对点的模式主要建立在一个队列上面,当连接一个列队的时候,发送端不需要知道接收端是否正在接收,可以直接向ActiveMQ发送消息,发送的消息,将会先进入队列中,如果有接收端在监听,则会发向接收端,如果没有接收端接收,则会保存在activemq服务器,直到接收端接收消息,点对点的消息模式可以有多个发送端,多个接收端,但是一条消息,只会被一个接收端给接收到,哪个接收端先连上ActiveMQ,则会先接收到,而后来的接收端则接收不到那条消息。
(1) Manven pom.xml配置,引入依赖
dependencies>
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-client</artifactId>
<version>5.13.4</version>
</dependency>
</dependencies>
(2) QueueProducer消息生成者
package cn.mq.activeMQ.demo;
import org.apache.activemq.ActiveMQConnectionFactory;
import javax.jms.*;
public class QueueProducer {
public static void main(String[] args) throws JMSException {
//1.创建连接工厂
ConnectionFactory connectionFactory=new ActiveMQConnectionFactory("tcp://192.168.25.130:61616");
//2.获取连接
Connection connection = connectionFactory.createConnection();
//3.启动连接
connection.start();
//4.获取session
// 参数1:是否启动事务,
// 参数2:消息确认模式
// AUTO_ACKNOWLEDGE = 1 自动确认
// CLIENT_ACKNOWLEDGE = 2 客户端手动确认
// DUPS_OK_ACKNOWLEDGE = 3 自动批量确认
// SESSION_TRANSACTED = 0 事务提交并确认
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
//5.创建队列对象
Queue queue = session.createQueue("test-queue");
//6.创建消息生产者
MessageProducer producer = session.createProducer(queue);
//7.创建消息
TextMessage textMessage = session.createTextMessage("ActiveMQ Queue Message");
//8.发送消息
producer.send(textMessage);
//9.关闭资源
producer.close();
session.close();
connection.close();
}
}
(3) QueueConsumer消息消费者
package cn.mq.activeMQ.demo;
import org.apache.activemq.ActiveMQConnectionFactory;
import javax.jms.*;
import java.io.IOException;
public class QueueConsumer {
public static void main(String[] args) throws JMSException, IOException {
//1.创建连接工厂
ConnectionFactory connectionFactory=new ActiveMQConnectionFactory("tcp://192.168.25.130:61616");
//2.获取连接
Connection connection = connectionFactory.createConnection();
//3.启动连接
connection.start();
//4.获取session
// 参数1:是否启动事务,
// 参数2:消息确认模式
// AUTO_ACKNOWLEDGE = 1 自动确认
// CLIENT_ACKNOWLEDGE = 2 客户端手动确认
// DUPS_OK_ACKNOWLEDGE = 3 自动批量确认
// SESSION_TRANSACTED = 0 事务提交并确认
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
//5.创建队列对象
Queue queue = session.createQueue("test-queue");
//6.创建消息消费
MessageConsumer consumer = session.createConsumer(queue);
//7.监听消息
consumer.setMessageListener(new MessageListener() {
public void onMessage(Message message) {
TextMessage textMessage=(TextMessage)message;
try {
System.out.println("接收到消息:"+textMessage.getText());
} catch (JMSException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
//8.等待键盘输入 --- 长连接
System.in.read();
//9.关闭资源
consumer.close();
session.close();
connection.close();
}
}
3.2 订阅模式 --- pub/sub
订阅/发布模式,同样可以有着多个发送端与多个接收端,但是接收端与发送端存在时间上的依赖,就是如果发送端发送消息的时候,接收端并没有监听消息,那么ActiveMQ将不会保存消息,将会认为消息已经发送,换一种说法,就是发送端发送消息的时候,接收端不在线,是接收不到消息的,哪怕以后监听消息,同样也是接收不到的。这个模式还有一个特点,那就是,发送端发送的消息,将会被所有的接收端给接收到,不类似点对点,一条消息只会被一个接收端给接收到。
(1) Manven pom.xml配置,引入依赖
dependencies>
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-client</artifactId>
<version>5.13.4</version>
</dependency>
</dependencies>
(2) TopicProducer消息生成者
package cn.mq.activeMQ.demo;
import org.apache.activemq.ActiveMQConnectionFactory;
import javax.jms.*;
public class TopicProducer {
public static void main(String[] args) throws JMSException {
//1.创建连接工厂
ConnectionFactory connectionFactory=new ActiveMQConnectionFactory("tcp://192.168.25.130:61616");
//2.获取连接
Connection connection = connectionFactory.createConnection();
//3.启动连接
connection.start();
//4.获取session (参数1:是否启动事务,参数2:消息确认模式)
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
//5.创建主题对象
Topic topic = session.createTopic("test-topic");
//6.创建消息生产者
MessageProducer producer = session.createProducer(topic);
//7.创建消息
TextMessage textMessage = session.createTextMessage("ActiveMQ Topic Message");
//8.发送消息
producer.send(textMessage);
//9.关闭资源
producer.close();
session.close();
connection.close();
}
}
(3) TopicConsumer消息消费者
package cn.mq.activeMQ.demo;
import org.apache.activemq.ActiveMQConnectionFactory;
import javax.jms.*;
import java.io.IOException;
public class TopicConsumer {
public static void main(String[] args) throws JMSException, IOException {
//1.创建连接工厂
ConnectionFactory connectionFactory=new ActiveMQConnectionFactory("tcp://192.168.25.130:61616");
//2.获取连接
Connection connection = connectionFactory.createConnection();
//3.启动连接
connection.start();
//4.获取session (参数1:是否启动事务,参数2:消息确认模式)
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
//5.创建主题对象
//Queue queue = session.createQueue("test-queue");
Topic topic = session.createTopic("test-topic");
//6.创建消息消费
MessageConsumer consumer = session.createConsumer(topic);
//7.监听消息
consumer.setMessageListener(new MessageListener() {
public void onMessage(Message message) {
TextMessage textMessage=(TextMessage)message;
try {
System.out.println("接收到消息:"+textMessage.getText());
} catch (JMSException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
//8.等待键盘输入
System.in.read();
//9.关闭资源
consumer.close();
session.close();
connection.close();
}
}