目录
一 前言
1.1 为什么要使用 MQ
耦合调用、异步模型、抵御洪峰流量,保护了主业务,削峰.
即:以前有A、B两服务,A直接请求B。现在是,A请求到MQ,B从MQ拿到请求。解耦了,并且,A放完请求就ok了,不用等B相应(异步)。A不会在短时间内收到大量的请求(削峰)
二 实际生产案例存在的问题
微服务架构中,一个功能需要多个接口的协调工作
才能实现
2.1 耦合严重
后期扩展困难
2.2 洪峰流量
秒杀场景
2.3 同步存在性能问题
木桶原理
2.4 解决办法
三 在Linux安装
- 在官网下载linux版本
- 解压
- 普通启动:进入bin目录,执行
./activemq start
。默认端口:61616
四 JAVA API编程-queue
4.1 创建生产者
package com.zyc.activemqdemo.proceduer;
import org.apache.activemq.ActiveMQConnectionFactory;
import javax.jms.*;
public class JmsProduce {
public static final String URL = "tcp://192.168.196.4:61616";
public static final String queue_name = "queue01";
public static void main(String[] args) throws JMSException {
ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory(URL);
Connection connection = factory.createConnection();
connection.start();
//第一个参数是是否创建session,第二个参数表示应答模式
Session session = connection.createSession(false,Session.AUTO_ACKNOWLEDGE);
//创建queue
Queue queue = session.createQueue(queue_name);
MessageProducer producer = session.createProducer(queue);
for (int i = 1; i < 3; i++) {
TextMessage textMessage = session.createTextMessage("mag..." + i);
producer.send(textMessage);
}
//关闭资源,从下往上关闭
producer.close();
session.close();
connection.close();
System.out.println("....");
}
}
4.2 控制台参数说明
4.3 消费者
同步模式
package com.zyc.activemqdemo.consumer;
import org.apache.activemq.ActiveMQConnectionFactory;
import javax.jms.*;
public class JmsConsumer {
public static final String URL = "tcp://192.168.196.4:61616";
public static final String queue_name = "queue01";
public static void main(String[] args) throws JMSException {
ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory(URL);
Connection connection = factory.createConnection();
connection.start();
Session session = connection.createSession(false,Session.AUTO_ACKNOWLEDGE);
Queue queue = session.createQueue(queue_name);
MessageConsumer consumer = session.createConsumer(queue);//创建消费者
while (true){
TextMessage receive = (TextMessage) consumer.receive();
if (null != receive){
System.out.println("消息:"+receive.getText());
}
else {
System.out.println("结束");
break;
}
}
consumer.close();
session.close();
connection.close();
System.out.println("完成....");
}
}
receive方法
receive方法是阻塞
的,还有两个类似的方法
Message receive() throws JMSException;
Message receive(long var1) throws JMSException;
Message receiveNoWait() throws JMSException;
Listener方式
//前面一样
consumer.setMessageListener(new MessageListener() {
@Override
public void onMessage(Message message) {
if (null != message && message instanceof TextMessage){
TextMessage textMessage = (TextMessage) message;
try {
System.out.println(textMessage.getText());
} catch (JMSException e) {
e.printStackTrace();
}
}
}
});
System.in.read();//这行代码不写,很有可能主线程马上执行完毕。虚拟机关闭!!!看不到监听效果
消费者3种情况
轮询效果
小结
五 JAVA API编程-Topic
5.1 Topic介绍
5.2 生产者
package com.zyc.activemqdemo.proceduer;
import org.apache.activemq.ActiveMQConnectionFactory;
import javax.jms.*;
public class JmsProduce_Topic {
public static final String URL = "tcp://192.168.196.4:61616";
public static final String topic_name = "topic01";
public static void main(String[] args) throws JMSException {
ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory(URL);
Connection connection = factory.createConnection();
connection.start();
Session session = connection.createSession(false,Session.AUTO_ACKNOWLEDGE);
Topic topic = session.createTopic(topic_name);
MessageProducer producer = session.createProducer(topic);
for (int i = 1; i < 3; i++) {
TextMessage textMessage = session.createTextMessage("Topic mag..." + i);
producer.send(textMessage);
}
producer.close();
session.close();
connection.close();
System.out.println("完成....");
}
}
5.3 消费者
一样,也有两种接收
方式
package com.zyc.activemqdemo.consumer;
import org.apache.activemq.ActiveMQConnectionFactory;
import javax.jms.*;
import java.io.IOException;
public class JmsConsumer_Topic {
public static final String URL = "tcp://192.168.196.4:61616";
public static final String topic_name = "topic01";
public static void main(String[] args) throws JMSException, IOException, InterruptedException {
ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory(URL);
Connection connection = factory.createConnection();
connection.start();
Session session = connection.createSession(false,Session.AUTO_ACKNOWLEDGE);
Topic topic = session.createTopic(topic_name);
MessageConsumer consumer = session.createConsumer(topic);
// while (true){
// TextMessage receive = (TextMessage) consumer.receive();
// if (null != receive){
// System.out.println("消息:"+receive.getText());
// }
// else {
// System.out.println("结束");
// break;
// }
// }
consumer.setMessageListener(new MessageListener() {
@Override
public void onMessage(Message message) {
if (null != message && message instanceof TextMessage){
TextMessage textMessage = (TextMessage) message;
try {
System.out.println("消费者接收到消息:"+textMessage.getText());
} catch (JMSException e) {
e.printStackTrace();
}
}
}
});
System.in.read();
Thread.sleep(100000);
consumer.close();
session.close();
connection.close();
System.out.println("qq完成....");
}
}
5.4 Topic和Queue的对比
- Topic是
无状态的
- Topic可能会
被丢弃