ActiveMQ消息队列
传统调用接口:
会有是不好的通讯方式和特点,同步请求
1.网咯延迟,发生阻塞
如果在A调用B的时候,B有延迟,那么A就会一直等待,发生阻塞,等待B工程响应
2.超时,重试机制
在提交数据的时候,如果存在网络延迟,那么客户端重复点击提交,可能会产生数据不一致
3.数据不一致
就是说A提交数据,B有延迟没有拿到实时的数据,就会存在数据不一致
消息中间建
解决高并发,采用两种通讯模式,点对点p2p(简单来说就是一个对应一个),发布订阅(一对多)
点对点
生产这向消息队列发生消息,如果消费者不在,消息队列将会缓存
消费者存储数据到消息队列:是采用先进先出的方式(排队)
消息队列
一个生产者,对应多个消费者
用于消息推送
Windows安装ActiveMQ
1.解压apache-activemq-5.11.1-bin.zip
2.进入apache-activemq-5.11.1\bin\win64(电脑是64位的点击64,32的点击32)进去win64后点击activemq.bat启动第一次启动需要等以后,甭着急
3.ActiveMQ的默认地址是8161,启动完后在浏览器输入127.0.0.1:8161,你会进入下面这个页面
点击管理ActiveMQ会弹出一个登陆框,默认的账号密码是admin
点对点通讯
导入依赖
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-core</artifactId>
<version>5.7.0</version>
</dependency>
生产者
public static void main(String[] args) throws JMSException {
//步骤一:创建连接工厂
ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory(ActiveMQConnectionFactory.DEFAULT_USER, ActiveMQConnectionFactory.DEFAULT_PASSWORD, "tcp://127.0.0.1:61616");
//步骤二:创建连接
Connection connection = activeMQConnectionFactory.createConnection();
//步骤三:启动连接
connection.start();
//步骤四:获取会话工厂
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
//步骤五:创建队列
Queue queue = session.createQueue("wdksoft_queue");
//创建消息生产者
MessageProducer producer = session.createProducer(queue);
//消息持久化
producer.setDeliveryMode(2);
//模拟消息
TextMessage textMessage = session.createTextMessage("hello activeMQ");
//发送消息
producer.send(textMessage);
System.out.println("生产者生产消息完毕~");
//回收资源
session.close();
connection.close();
}
消费者
public static void main(String[] args) throws JMSException {
//步骤一:创建连接工厂
ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory("tcp://127.0.0.1:61616");
//步骤二:创建连接
Connection connection = activeMQConnectionFactory.createConnection();
//步骤三:开启连接
connection.start();
//创建会话对象
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
//获取到接受消息的队列
Queue queue = session.createQueue("wdksoft_queue");
//创建消费者
MessageConsumer consumer = session.createConsumer(queue);
while(true){
//获取消息
TextMessage message = (TextMessage)consumer.receive();
if(message!=null){
System.out.println("消费者获取消息:"+message.getText());
}else{
break;
}
}
//回收资源
session.close();
connection.close();
}
4.发布订阅模式:消费者先订阅Topic制图,再生产消息
public static void main(String[] args) throws JMSException {
//步骤一:创建连接工厂
ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory("tcp://127.0.0.1:61616");
//步骤二:创建连接
Connection connection = activeMQConnectionFactory.createConnection();
//步骤三:开启连接
connection.start();
//创建会话对象
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
//获取到接受消息的队列
Topic topic = session.createTopic("wdksoft_topic");
//创建消费者
MessageConsumer consumer = session.createConsumer(topic);
while(true){
//获取消息
TextMessage message = (TextMessage)consumer.receive();
if(message!=null){
System.out.println("消费者获取消息:"+message.getText());
}else{
break;
}
}
//回收资源
session.close();
connection.close();
}
生产者:
public static void main(String[] args) throws JMSException {
//步骤一:创建连接工厂
ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory(ActiveMQConnectionFactory.DEFAULT_USER, ActiveMQConnectionFactory.DEFAULT_PASSWORD, "tcp://127.0.0.1:61616");
//步骤二:创建连接
Connection connection = activeMQConnectionFactory.createConnection();
//步骤三:启动连接
connection.start();
//步骤四:获取会话工厂
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
//步骤五:创建主题
Topic topic = session.createTopic("wdksoft_topic");
//创建消息生产者
MessageProducer producer = session.createProducer(null);
//消息持久化
producer.setDeliveryMode(2);
//模拟消息
TextMessage textMessage = session.createTextMessage("hello activeMQ pub");
//发送消息
producer.send(topic,textMessage);
System.out.println("生产者生产消息完毕~");
//回收资源
session.close();
connection.close();
}