1.概念:
定义:
各类产品:
解决三个问题:
解耦
异步
削峰
2.activeMQ为例,下载安装启动
1)Linux下安装启动:
2)安装完浏览器看下前台界面
前台:
3.Java代码实现ActiveMQ通讯,基础入门代码
queue和topic的区别是,queue模式下,生产者生产的消息=所有消费者消费消息总数。topic模式下:生产者生产的消息所有消费者都可以消费到。(类似生活中于通知下发)
1)queue模式:
生产者代码
package com.scbg;
import org.apache.activemq.ActiveMQConnectionFactory;
import org.springframework.objenesis.instantiator.basic.NewInstanceInstantiator;
import javax.jms.*;
/**
* @program: activeMQ_demo
* @description: JMS消息生产者
* @author: 三层饼干儿
* @create: 2019-08-27 13:34
**/
public class JMSProducer {
public static final String ACTIVEMQ_URL="tcp://192.168.0.128:61616";
public static final String QUEUE_NAME="Q";
public static void main(String[] args) throws JMSException {
//1.创建连接工厂,给定url,默认用户名密码
ActiveMQConnectionFactory factory= new ActiveMQConnectionFactory(ACTIVEMQ_URL);
//2.获取连接,并启动访问
Connection connection = factory.createConnection();
connection.start();
//3.创建会话 第一个参数事务 第二个签收
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
//4.session对象指定目的地,必须指明队列还是主题
Queue queue = session.createQueue(QUEUE_NAME);
//5.创建消息生产者
MessageProducer producer = session.createProducer(queue);
//6.生产3个消息发送到mq队列
for (int i=1;i<=3;i++){
TextMessage textMessage = session.createTextMessage("msg----->" + i);
producer.send(textMessage);
}
//7.关闭资源
producer.close();
session.close();
connection.close();
System.out.println("-------------->消息发布成功");
}
}
消费者代码
1>消费者,一致等待(占资源较多,死循环)
package com.scbg;
import org.apache.activemq.ActiveMQConnectionFactory;
import javax.jms.*;
/**
* @program: activeMQ_demo
* @description: JMS消息消费者
* @author: 三层饼干儿
* @create: 2019-08-27 13:34
**/
public class JMSConsumer1 {
public static final String ACTIVEMQ_URL="tcp://192.168.0.128:61616";
public static final String QUEUE_NAME="Q";
public static void main(String[] args) throws JMSException {
//1.创建连接工厂,给定url,默认用户名密码
ActiveMQConnectionFactory factory= new ActiveMQConnectionFactory(ACTIVEMQ_URL);
//2.获取连接,并启动访问
Connection connection = factory.createConnection();
connection.start();
//3.创建会话 第一个参数事务 第二个签收
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
//4.session对象指定目的地,必须指明队列还是主题
Queue queue = session.createQueue(QUEUE_NAME);
//5.创建消息消费
MessageConsumer consumer = session.createConsumer(queue);
//6.消费消息
while (true){
TextMessage textMessage = (TextMessage)consumer.receive();
if (null!=textMessage){
System.out.println("消费者收到消息--->"+textMessage.getText());
}else{
break;
}
}
//7.关闭资源
consumer.close();
session.close();
connection.close();
}
}
2>监听方式消费消息:
package com.scbg;
import org.apache.activemq.ActiveMQConnectionFactory;
import javax.jms.*;
import java.io.IOException;
/**
* @program: activeMQ_demo
* @description: JMS消息消费者
* @author: 三层饼干儿
* @create: 2019-08-27 13:34
**/
public class JMSConsumer1 {
public static final String ACTIVEMQ_URL="tcp://192.168.0.128:61616";
public static final String QUEUE_NAME="Q";
public static void main(String[] args) throws JMSException, IOException {
//1.创建连接工厂,给定url,默认用户名密码
ActiveMQConnectionFactory factory= new ActiveMQConnectionFactory(ACTIVEMQ_URL);
//2.获取连接,并启动访问
Connection connection = factory.createConnection();
connection.start();
//3.创建会话 第一个参数事务 第二个签收
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
//4.session对象指定目的地,必须指明队列还是主题
Queue queue = session.createQueue(QUEUE_NAME);
//5.创建消息消费
final MessageConsumer consumer = session.createConsumer(queue);
//6-1消费消息
/*while (true){
TextMessage textMessage = (TextMessage)consumer.receive();
if (null!=textMessage){
System.out.println("消费者收到消息--->"+textMessage.getText());
}else{
break;
}
}*/
//6-2 while(true)会浪费资源,可以使用监听的方式接受消息。
consumer.setMessageListener(new MessageListener() {
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();
//7.关闭资源
consumer.close();
session.close();
connection.close();
}
}
2)Topic 模式,代码省略。
4.JMS
1)
2)
3)持久化:生产者生产完消息发送后,服务器宕机。服务器重启后,消费者还能不能消费到这些消息。
1>queue模式
默认是持久化消息,可以通过设置更改。
2>topic模式
4)事务
5)签收