- 下载安装及基本使用
搜索Apache ActiveMQ官网,下载Apache ActiveMQ。
本例子下载的版本为apache-activemq-5.14.5。安装的为window版本的ActiveMQ。建议分别下载windows版本和Linux版本。方便随后部署。前置条件为jdk1.7。
下载完成后解压缩apache-activemq-5.14.5-bin.zip,到自己电脑。然后进入bin目录,根据自己操作系统版本进入win32或win64目录。双击activemq.bat启动Apache ActiveMQ。
启动成功的效果如下图:
访问http://本机ip:8161登录ActiveMQ控制台。
出现如上图界面说明Apache ActiveMQ安装启动成功。具体管理操作由于可以自行详细学习。
安装成功的同时根据实际需要可以查看ActiveMQ对各种类型协议支撑时监听的端口号,详细的如下图所示:
从上到下分别为:
1.TCP协议监听端口号61616
2.AMQP协议监听端口号5672
3.STOMP协议监听端口号61613
4.MQTT协议监听端口号1883
5.WS协议监听端口号61614
本文网页端例子使用的是WS协议,本文java例子使用的是TCP协议。官方提供样例apache-activemq-5.14.5\examples文件夹下,可以自行学习。 - 网页端例子
直接参照apache-activemq-5.14.5\examples\mqtt\websocket实现自己需要功能。
- java例子
前置条件jdk版本1.7,引入入jar包activemq-all-5.14.5.jar。jdk自行下载安装,activemq-all-5.14.5.jar包在下载的Apache ActiveMQ的安装包的根目录可以找到。
测试项目目录结构如下图:
Mqtt.java代码如下:
package mqtt;
import org.apache.activemq.ActiveMQConnectionFactory;
import org.apache.activemq.command.ActiveMQTextMessage;
import javax.jms.*;
/**
* 消息中间件ActiveMQ测试
* Author: wzl
* Date: 2019/8/15
* Description:
*/
public class Mqtt {
/*
* 消息发送步骤:
* 1、创建一个连接工厂对象,使用ActiveMQ服务的ip和端口号构建(端口号为:61616,且协议固定为tcp)
* 2、使用工厂对象获取连接对象
* 3、使用连接对象开启连接
* 4、使用连接对象创建Session对象,并设置是否开启事务、应答方式
* |- 应答方式有三种,分别为:
* 5、使用Session对象创建一个Destination对象。有两种消息形式:Queue和Topic
* 6、使用Session对象创建一个消息生产者对象。(接收消息时,则创建消息消费者对象)
* 7、创建消息对象。(接收消息)
* 8、发送消息。(接收消息时,无此步骤)
* 9、关闭资源
*/
public Connection mqttConn(){
Connection connection = null;
try {
//创建连接工厂对象
ConnectionFactory connFactory =
new ActiveMQConnectionFactory("tcp://172.16.5.219:61616");
//获取连接对象
connection = connFactory.createConnection();
} catch (JMSException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return connection;
}
/**
* Queue消息发送
* Author: wzl
* Date: 2019/8/15
* Description:
*/
public void queueProducer(String queueName,String queueContent) throws Exception {
//开启连接
Connection connection = mqttConn();
connection.start();
//使用连接对象获取Session对象,并设置参数
/*
* 参数介绍
* 第一个参数(参数类型boolean):是否开启事务。(一般不开启事务:false)
* 第二个参数(参数类型int):应答模式。(一般设置为自动应答:AUTO_ACKNOWLEDGE)
* 应答模式分为三种:
* AUTO_ACKNOWLEDGE(自动应答)
* CLIENT_ACKNOWLEDGE(手动应答)
* DUPS_OK_ACKNOWLEDGE
*
* 注意:当开启事务的时候,第二个参数值设置哪一种都一样,即第二个参数无意义。
*/
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
//使用Session对象创建Destination对象,其中参数为:消息队列的名称
Queue queue = session.createQueue(queueName);
//使用session创建消息生产者对象
MessageProducer producer = session.createProducer(queue);
//创建消息对象
TextMessage message = new ActiveMQTextMessage();
message.setText(queueContent);
//发送消息
producer.send(message);
//关闭资源
producer.close();
session.close();
connection.close();
}
/**
* Queue消息接收
* Author: wzl
* Date: 2019/8/15
* Description:
*/
public void queueConsumer(String queueName) {
//创建连接工厂对象
Connection connection = mqttConn();
try {
connection.start();
//使用连接对象获取Session对象,并设置参数
Session session =
connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
//使用Session对象创建Destination对象,其中参数为:消息队列的名称
Queue queue = session.createQueue(queueName);
//创建消息消费者对象
MessageConsumer consumer = session.createConsumer(queue);
//接收消息
while(true) {
consumer.setMessageListener(new MqttListener());
}
} catch (JMSException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
try {
if (null != connection) {
connection.close();
}
} catch (JMSException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
/**
* Topic消息发送
* Author: wzl
* Date: 2019/8/15
* Description:
*/
public void topicProducer(String topicName,String topicContent) throws Exception{
//创建连接工厂对象
Connection connection = mqttConn();
connection.start();
//使用连接对象获取Session对象,并设置参数
Session session =
connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
//使用Session对象创建Destination对象,其中参数为:消息队列的名称
Topic topic = session.createTopic(topicName);
//使用session创建消息生产者对象
MessageProducer producer = session.createProducer(topic);
//创建消息对象
TextMessage message = new ActiveMQTextMessage();
message.setText(topicContent);
//发送消息
producer.send(message);
//关闭资源
producer.close();
session.close();
connection.close();
}
/**
* Topic消息接收
* Author: wzl
* Date: 2019/8/15
* Description:
*/
public void topicConsumer(String topicName) {
//创建连接工厂对象
Connection connection = mqttConn();
try {
connection.start();
//使用连接对象获取Session对象,并设置参数
Session session =
connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
//使用Session对象创建Destination对象,其中参数为:消息队列的名称
Topic topic = session.createTopic(topicName);
//创建消息消费者对象
MessageConsumer consumer = session.createConsumer(topic);
//接收消息
while(true) {
consumer.setMessageListener(new MqttListener());
}
} catch (JMSException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} finally {
try {
if (null != connection) {
connection.close();
}
} catch (JMSException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
MqttListener.java代码如下:
package mqtt;
import javax.jms.*;
public class MqttListener implements MessageListener{
@Override
public void onMessage(Message message) {
try {
// TextMessage
if (message instanceof TextMessage) {
TextMessage textMessage1 = (TextMessage) message;
System.out.println(textMessage1.getText());
}
// MapMessage
if (message instanceof MapMessage) {
MapMessage mapMessage = (MapMessage) message;
System.out.println(mapMessage.toString());
}
// ObjectMessage
if (message instanceof ObjectMessage) {
ObjectMessage objectMessage = (ObjectMessage) message;
System.out.println(objectMessage.toString());
}
// BytesMessage
if (message instanceof BytesMessage) {
byte[] b = new byte[1024];
int len = -1;
BytesMessage bm = (BytesMessage) message;
while ((len = bm.readBytes(b)) != -1) {
System.out.println(new String(b, 0, len));
}
}
// StreamMessage
if (message instanceof StreamMessage) {
StreamMessage sm = (StreamMessage) message;
System.out.println(sm.readString());
System.out.println(sm.readInt());
}
} catch (JMSException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
QueueText.java代码如下:
package mqtt;
public class QueueText {
public static void main(String[] args) {
// TODO Auto-generated method stub
try {
Mqtt mqtt = new Mqtt();
mqtt.queueProducer("wzl", "hello");
mqtt.queueConsumer("wzl");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
TopicText.java代码如下:
package mqtt;
public class TopicText {
public static void main(String[] args) {
// TODO Auto-generated method stub
try {
Mqtt mqtt = new Mqtt();
mqtt.topicProducer("sh", "hello");
mqtt.topicConsumer("fh");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
- Apache ActiveMQ 各个版本所依赖的JDK版本
Apache ActiveMQ 各个版本所依赖的JDK版本