1、消息队列介绍
消息队列中间件是分布式系统中重要的组件,主要解决应用耦合,异步消息,流量削锋等问题
实现高性能,高可用,可伸缩和最终一致性架构
使用较多的消息队列有ActiveMQ,RabbitMQ,ZeroMQ,Kafka,MetaMQ,RocketMQ
消息队列的应用场景大致分为:
- 异步处理; 适用于串行消息 改为并行消息
- 应用解耦
- 流量削锋
- 日志处理
消息通讯
应用场景介绍建议参考 https://blog.youkuaiyun.com/cws1214/article/details/52922267
2、 消息队列使用
下载地址为:http://activemq.apache.org/download.html
解压后,可以看到MQ目录下有以下文件和目录
- activemq-all-5.5.0.jar:所有MQ JAR包的集合,用于用户系统调用
- bin:其中包含MQ的启动脚本
- conf:包含MQ的所有配置文件
- data:日志文件及持久性消息数据
- example:MQ的示例
- lib:MQ运行所需的所有Lib
- webapps:MQ的Web控制台及一些相关的DEMO
启动MQ:
双击bin目录下的activemq.bat文件即可启动MQ
后台管理界面地址:http://localhost:8161/admin/
引用ActiveMQ 依赖jar
<!-- activeMq 消息队列 -->
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-all</artifactId>
<version>5.2.0</version>
</dependency>
3、 创建点对点的消息队列模式
创建生产者
/**
* 消息生产者
* @author PL
*
*/
public class JMSProducer {
private static final String username = ActiveMQConnection.DEFAULT_USER;
private static final String password = ActiveMQConnection.DEFAULT_PASSWORD;
private static final String url = ActiveMQConnection.DEFAULT_BROKER_URL;
private static final int sendNum = 10;
public static void product() {
ConnectionFactory connectionFacotry;
Connection connection = null ;
Session session; //会话 接受或者发送消息的线程
Destination destination; //消息目的地
MessageProducer messProducer; // 消息生产者
// 实例化工厂连接
connectionFacotry = new ActiveMQConnectionFactory(JMSProducer.username,JMSProducer.password,JMSProducer.url);
try {
connection = connectionFacotry.createConnection();
connection.start(); // 启动连接
session = connection.createSession(Boolean.TRUE, Session.AUTO_ACKNOWLEDGE);
destination = session.createQueue("MSGQuence");
messProducer = session.createProducer(destination);
sendMess(session,messProducer);
session.commit();
} catch (Exception e) {
e.printStackTrace();
}finally {
if(null != connection) {
try {
connection.close();
} catch (JMSException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
/**
* 发送消息
* @param session
* @param messProducer
* @throws JMSException
*/
public static void sendMess(Session session, MessageProducer messProducer) throws JMSException {
for (int i = 0; i < 10; i++) {
TextMessage txtMsg = session.createTextMessage("PL发送的消息"+i);
System.out.println("发送消息:"+i);
messProducer.send(txtMsg);
}
}
public static void main(String[] args) {
product();
}
}
创建消费者
/**
* 消息生产者(点对点)
* @author PL
*
*/
public class JMSConsumer {
private static final String username = ActiveMQConnection.DEFAULT_USER;
private static final String password = ActiveMQConnection.DEFAULT_PASSWORD;
private static final String url = ActiveMQConnection.DEFAULT_BROKER_URL;
private static final int sendNum = 10;
@Test
public static void consumer() {
ConnectionFactory connectionFacotry;
Connection connection = null ;
Session session; //会话 接受或者发送消息的线程
Destination destination; //消息目的地
MessageConsumer messConsumer; // 消息生产者
// 实例化工厂连接
connectionFacotry = new ActiveMQConnectionFactory(JMSConsumer.username,JMSConsumer.password,JMSConsumer.url);
try {
connection = connectionFacotry.createConnection();
connection.start(); // 启动连接
session = connection.createSession(Boolean.FALSE, Session.AUTO_ACKNOWLEDGE);
destination = session.createQueue("MSGQuence");
messConsumer = session.createConsumer(destination);
//messConsumer.receive(200000);
// 注册监听
messConsumer.setMessageListener(new MyJMSListener());
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
consumer();
}
}
添加消费者监听
public class MyJMSListener implements MessageListener{
@Override
public void onMessage(Message message) {
try {
System.out.println(((TextMessage)message).getText());
} catch (JMSException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
4、创建订阅topic模式消息队列
生产者
/**
* 消息消费者(消息发布)
* @author PL
*
*/
public class JMSProducer_Subscribe {
private static final String username = ActiveMQConnection.DEFAULT_USER;
private static final String password = ActiveMQConnection.DEFAULT_PASSWORD;
private static final String url = ActiveMQConnection.DEFAULT_BROKER_URL;
private static final int sendNum = 10;
@Test
public static void product() {
ConnectionFactory connectionFacotry;
Connection connection = null ;
Session session; //会话 接受或者发送消息的线程
Destination destination; //消息目的地
MessageProducer messProducer; // 消息生产者
// 实例化工厂连接
connectionFacotry = new ActiveMQConnectionFactory(JMSProducer_Subscribe.username,JMSProducer_Subscribe.password,JMSProducer_Subscribe.url);
try {
connection = connectionFacotry.createConnection();
connection.start(); // 启动连接
session = connection.createSession(Boolean.TRUE, Session.AUTO_ACKNOWLEDGE);
destination = session.createTopic("JMSTopic");
messProducer = session.createProducer(destination);
sendMess(session,messProducer);
session.commit();
} catch (Exception e) {
e.printStackTrace();
}finally {
if(null != connection) {
try {
connection.close();
} catch (JMSException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
/**
* 发送消息
* @param session
* @param messProducer
* @throws JMSException
*/
public static void sendMess(Session session, MessageProducer messProducer) throws JMSException {
for (int i = 0; i < 10; i++) {
TextMessage txtMsg = session.createTextMessage("PL发布的消息"+i);
System.out.println("消息发布:"+i);
messProducer.send(txtMsg);
}
}
public static void main(String[] args) {
product();
}
}
消费者
/**
* 消息生产者(消息订阅)
* @author PL
*
*/
public class JMSConsumer_Subscribe1 {
private static final String username = ActiveMQConnection.DEFAULT_USER;
private static final String password = ActiveMQConnection.DEFAULT_PASSWORD;
private static final String url = ActiveMQConnection.DEFAULT_BROKER_URL;
private static final int sendNum = 10;
@Test
public static void consumer() {
ConnectionFactory connectionFacotry;
Connection connection = null ;
Session session; //会话 接受或者发送消息的线程
Destination destination; //消息目的地
MessageConsumer messConsumer; // 消息生产者
// 实例化工厂连接
connectionFacotry = new ActiveMQConnectionFactory(JMSConsumer_Subscribe1.username,JMSConsumer_Subscribe1.password,JMSConsumer_Subscribe1.url);
try {
connection = connectionFacotry.createConnection();
connection.start(); // 启动连接
session = connection.createSession(Boolean.FALSE, Session.AUTO_ACKNOWLEDGE);
destination = session.createTopic("JMSTopic");
messConsumer = session.createConsumer(destination);
//messConsumer.receive(200000);
// 注册监听
messConsumer.setMessageListener(new MyJMSListener_Subscribe());
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
consumer();
}
}
消息订阅监听
public class MyJMSListener_Subscribe implements MessageListener{
@Override
public void onMessage(Message message) {
try {
System.out.println("消息订阅1:"+((TextMessage)message).getText());
} catch (JMSException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}