目录
1、创建一个消息生产者,并发送消息到ActiveMQ topic
一、为什么要使用消息中间件ActiveMQ
原因有以下三点:
1、解耦
2、异步请求
3、流量削峰
二、activemq的安装与使用
请参见: https://www.cnblogs.com/jaycekon/p/6225058.html
说明:activemq有两种模式:ptp(queue消息队列)、发布/订阅(topic主题)
现在分别记录这两张模式的用法:
准备:创建一个springboot项目,添加activemq的maven依赖:
<!--activemq消息中间件依赖-->
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-all</artifactId>
<version>5.15.5</version>
</dependency>
三、ptp(点对点模式)
1.创建一个消息生产者,并发送消息到ActiveMQ.
package com.jiangcx.activemq1.provider;
import org.apache.activemq.ActiveMQConnection;
import org.apache.activemq.ActiveMQConnectionFactory;
import javax.jms.*;
public class ActiveProvider {
public static void main(String[] args) throws Exception{
// 创建mq的连接工厂 ConnectionFactory,JMS用它来创建连接
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(
ActiveMQConnection.DEFAULT_USER,ActiveMQConnection.DEFAULT_PASSWORD,
"tcp://192.168.1.102:61616");
// 获得一个连接 客户端到JMS provider 的连接
Connection connection = connectionFactory.createConnection();
// 开启连接
connection.start();
// 创建一个session 参数说明 是否开启事务模式、签收模式
Session session = connection.createSession(false,
Session.AUTO_ACKNOWLEDGE);
// 创建一个名为myQueue的消息队列
Queue myQueue= session.createQueue("myQueue");
// 创建消息生产者 MessageProducer
MessageProducer producer = session.createProducer(myQueue);
// 设置为不用持久化
producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
// 创建一条消息
TextMessage message = session.createTextMessage("消息内容为:你好activemq");
//发送消息
producer.send(message);
//关闭资源
producer.close();
session.close();
connection.close();
}
}
运行后访问:http://192.168.1.102:8161/admin,可看到mq中有名为myQuene的消息。
2.创建一个消息消费者,从ActiveMQ获取消息
package com.jiangcx.activemq1.consumer;
import org.apache.activemq.ActiveMQConnection;
import org.apache.activemq.ActiveMQConnectionFactory;
import javax.jms.*;
public class ActiveConsumer {
public static void main(String[] args) throws JMSException {
// 创建mq的连接工厂 ConnectionFactory,JMS用它来创建连接
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(
ActiveMQConnection.DEFAULT_USER,ActiveMQConnection.DEFAULT_PASSWORD,
"tcp://192.168.1.102:61616");
// 获得一个连接 客户端到JMS provider 的连接
Connection connection = connectionFactory.createConnection();
// 开启连接
connection.start();
// 创建一个session 参数说明 是否开启事务模式、签收模式
Session session = connection.createSession(false,
Session.AUTO_ACKNOWLEDGE);
// 创建一个名为myQueue的消息队列
Queue myQueue= session.createQueue("myQueue");
// 创建消息消费者
MessageConsumer consumer = session.createConsumer(myQueue);
//接收消息
TextMessage message = (TextMessage) consumer.receive();
String msg = message.getText();
System.out.println("消费者接收到的数据为:" + msg);
//关闭资源
consumer.close();
session.close();
connection.close();
}
}
四、发布/订阅(topic)
用一个生产者,两个消费者进行模拟
1、创建一个消息生产者,并发送消息到ActiveMQ topic
package com.jiangcx.activemq2.provider;
import org.apache.activemq.ActiveMQConnection;
import org.apache.activemq.ActiveMQConnectionFactory;
import javax.jms.*;
public class ActiveProvider {
public static void main(String[] args) throws Exception{
// 创建mq的连接工厂 ConnectionFactory,JMS用它来创建连接
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(
ActiveMQConnection.DEFAULT_USER,ActiveMQConnection.DEFAULT_PASSWORD,
"tcp://192.168.1.102:61616");
// 获得一个连接 客户端到JMS provider 的连接
Connection connection = connectionFactory.createConnection();
// 开启连接
connection.start();
// 创建一个session 参数说明 是否开启事务模式、签收模式
Session session = connection.createSession(false,
Session.AUTO_ACKNOWLEDGE);
// 创建一个名为myTopic的主题
Topic myTopic = session.createTopic("myTopic");
// 创建消息生产者 MessageProducer
MessageProducer producer = session.createProducer(myTopic);
// 设置为不用持久化
producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
// 创建一条消息
TextMessage message = session.createTextMessage("消息内容为:你好activemq topic");
//发送消息
producer.send(message);
//关闭资源
producer.close();
session.close();
connection.close();
}
}
2、创建两个消费者
package com.jiangcx.activemq2.consumer;
import org.apache.activemq.ActiveMQConnection;
import org.apache.activemq.ActiveMQConnectionFactory;
import javax.jms.*;
/**
* 发布/订阅 模式
*/
public class ActiveConsumer1 {
public static void main(String[] args) throws JMSException {
// 创建mq的连接工厂 ConnectionFactory,JMS用它来创建连接
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(
ActiveMQConnection.DEFAULT_USER,ActiveMQConnection.DEFAULT_PASSWORD,
"tcp://192.168.1.102:61616");
// 获得一个连接 客户端到JMS provider 的连接
Connection connection = connectionFactory.createConnection();
//持久订阅的时候需要一个id来标识
connection.setClientID("my_client01");
// 开启连接
connection.start();
// 创建一个session 参数说明 是否开启事务模式、签收模式
Session session = connection.createSession(false,
Session.AUTO_ACKNOWLEDGE);
// 创建一个名为myTopic的主题
Topic mytopic = session.createTopic("myTopic");
// 创建消息消费者
MessageConsumer consumer = session.createConsumer(mytopic);
//接收消息
TextMessage message = (TextMessage) consumer.receive();
String msg = message.getText();
System.out.println("消费者接收到的数据为:" + msg);
//关闭资源
consumer.close();
session.close();
connection.close();
}
}
package com.jiangcx.activemq2.consumer;
import org.apache.activemq.ActiveMQConnection;
import org.apache.activemq.ActiveMQConnectionFactory;
import javax.jms.*;
/**
* 发布/订阅 模式
*/
public class ActiveConsumer2 {
public static void main(String[] args) throws JMSException {
// 创建mq的连接工厂 ConnectionFactory,JMS用它来创建连接
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(
ActiveMQConnection.DEFAULT_USER,ActiveMQConnection.DEFAULT_PASSWORD,
"tcp://192.168.1.102:61616");
// 获得一个连接 客户端到JMS provider 的连接
Connection connection = connectionFactory.createConnection();
//持久订阅的时候需要一个id来标识
connection.setClientID("my_client02");
// 开启连接
connection.start();
// 创建一个session 参数说明 是否开启事务模式、签收模式
Session session = connection.createSession(false,
Session.AUTO_ACKNOWLEDGE);
// 创建一个名为myTopic的主题
Topic mytopic = session.createTopic("myTopic");
// 创建消息消费者
MessageConsumer consumer = session.createConsumer(mytopic);
//接收消息
TextMessage message = (TextMessage) consumer.receive();
String msg = message.getText();
System.out.println("消费者接收到的数据为:" + msg);
//关闭资源
consumer.close();
session.close();
connection.close();
}
}
五、修改activeMQ默认的端口号
在linux环境下(windows路径类似):
ActiveMQ5.x版本默认启动时,启动了内置的jetty服务器,提供一个demo应用和用于监控ActiveMQ的admin应用。
访问:http://192.168.1.102:8161/admin/ 用户名和密码同为 admin
注:activemq启动后会占用两个端口,一个是负责收发消息的tcp端口:61616,一个是web负责用户界面化管理的端口:8161,这个两个端口分别可以在conf下面的activemq.xml和jetty.xml中找到。
#cd /usr/local/activeMQ/apache-activemq-5.15.9/conf
#vim activemq.xml
可以发现,activemq的端口号是配置在jetty.xml中的。于是打开jetty.xml
#vim jetty.xml
默认为8161,在此修改保持后退出,重启即可。