一、背景
1.在客户端与服务器进行通讯时.客户端调用后,必须等待服务对象完成处理返回结果才能继续执行。客户与服务器对象的生命周期紧密耦合,客户进程和服务对象进程都都必须正常运行;如果由于服务对象崩溃或者网络故障导致用户的请求不可达,客户会受到异常,点对点通信: 客户的一次调用只发送给某个单独的目标对象。下面的图不是同步方式,是异步方式,这样就产生了ActiveMQ。
二、什么是消息中间件
1.面向消息的中间件(MessageOrlented MiddlewareMOM)较好的解决了以上问题。发送者将消息发送给消息服务器,消息服务器将消感存放在若千队列中,在合适的时候再将消息转发给接收者。这种模式下,发送和接收是异步的,发送者无需等待; 二者的生命周期未必相同: 发送消息的时候接收者不一定运行,接收消息的时候发送者也不一定运行;一对多通信: 对于一个消息可以有多个接收者。
三、什么是JMS(其实就是消息中间件)
1.JMS是java的消息服务,JMS的客户端之间可以通过JMS服务进行异步的消息传输。
2.消息模型
2.1.点对点通讯方式,生产者、消息队列、消费者、一对一通讯,生产者产生消息,只允许有一个消费者进行消费。
2.1.1.特点:
- 每个消息只有一个消费者(Consumer)(即一旦被消费,消息就不再在消息队列中)
- 发送者和接收者之间在时间上没有依赖性,也就是说当发送者发送了消息之后,不管接收者有没有正在运行,它不会影响到消息被发送到队列
- 接收者在成功接收消息之后需向队列应答成功
2.2.发布订阅通讯方式,生产者、主题、消费者,一个生产者,多个消费者。
四、消息中间件的应用场景
五、本地安装
1.直接解压
2.启动
3.浏览器访问:127.0.0.1:8161(账户/密码:admin)
六、编写生产者代码
1.项目结构图
2.pom.xml
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-core</artifactId>
<version>5.7.0</version>
</dependency>
3.Producer.java
public class Producer {
public static void main(String[] args) throws JMSException {
// 获取mq连接工程
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(ActiveMQConnection.DEFAULT_USER,
ActiveMQConnection.DEFAULT_PASSWORD, "tcp://127.0.0.1:61616");
// 创建连接
Connection createConnection = connectionFactory.createConnection();
// 启动连接
createConnection.start();
// 创建会话工厂
Session session = createConnection.createSession(Boolean.FALSE, Session.AUTO_ACKNOWLEDGE);
// 创建队列
Destination destination = session.createQueue("cmx_queue");
MessageProducer producer = session.createProducer(destination);
// 不持久化
producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
for (int i = 1; i <= 5; i++) {
System.out.println("我是生产者: " + i);
//发送消息
sendMsg(session, producer, "我是生产者: " + i);
}
System.out.println("生产者 发送消息完毕!!!");
}
public static void sendMsg(Session session, MessageProducer producer, String i) throws JMSException {
TextMessage textMessage = session.createTextMessage("hello activemq " + i);
producer.send(textMessage);
}
}
4.启动项目
七、编写消费者代码
1.项目结构图
2.pom.xml
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-core</artifactId>
<version>5.7.0</version>
</dependency>
3.Consumer.java
public class Consumer {
public static void main(String[] args) throws JMSException {
// 获取mq连接工程
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(ActiveMQConnection.DEFAULT_USER,
ActiveMQConnection.DEFAULT_PASSWORD, "tcp://127.0.0.1:61616");
// 创建连接
Connection createConnection = connectionFactory.createConnection();
// 启动连接
createConnection.start();
// 创建会话工厂
Session session = createConnection.createSession(Boolean.FALSE, Session.AUTO_ACKNOWLEDGE);
// 创建队列
Destination destination = session.createQueue("cmx_queue");
MessageConsumer createConsumer = session.createConsumer(destination);
while (true) {
//监听消息
TextMessage textMessage =(TextMessage) createConsumer.receive();
if(textMessage!=null){
String text= textMessage.getText();
System.out.println("消费者 获取到消息: text:"+text);
}else{
break;
}
}
System.out.println("消费者消费消息完毕!!!");
}
}
4.结果(消费成功了,后台已经打印日志了)
八、mq的主题与订阅的代码实现
1.项目图
2.pom.xml
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-core</artifactId>
<version>5.7.0</version>
</dependency>
3.Producer.java
/**
* Created by ChenMingXu on 2019/6/2.
*/
public class Producer {
public static void main(String[] args) throws JMSException {
// 获取mq连接工程
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(ActiveMQConnection.DEFAULT_USER,
ActiveMQConnection.DEFAULT_PASSWORD, "tcp://127.0.0.1:61616");
// 创建连接
Connection createConnection = connectionFactory.createConnection();
// 启动连接
createConnection.start();
// 创建会话工厂
Session session = createConnection.createSession(Boolean.FALSE, Session.AUTO_ACKNOWLEDGE);
//Destination destination = session.createTopic("cmx-topic");
MessageProducer producer = session.createProducer(null);
// 不持久化
producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
for (int i = 1; i <= 5; i++) {
System.out.println("我是生产者: " + i);
sendMsg(session, producer, "我是生产者: " + i);
}
System.out.println("生产者 发送消息完毕!!!");
}
public static void sendMsg(Session session, MessageProducer producer, String i) throws JMSException {
TextMessage textMessage = session.createTextMessage("hello activemq " + i);
Destination destination = session.createTopic("cmx11-topic");
producer.send(destination, textMessage);
}
}
4.Consumer.java
public class Consumer {
public static void main(String[] args) throws JMSException {
System.out.println("Consumer");
// 获取mq连接工程
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(ActiveMQConnection.DEFAULT_USER,
ActiveMQConnection.DEFAULT_PASSWORD, "tcp://127.0.0.1:61616");
// 创建连接
Connection createConnection = connectionFactory.createConnection();
// 启动连接
createConnection.start();
// 创建会话工厂
Session session = createConnection.createSession(Boolean.FALSE, Session.AUTO_ACKNOWLEDGE);
// 创建队列
Destination destination = session.createTopic("cmx11-topic");
MessageConsumer createConsumer = session.createConsumer(destination);
while (true) {
// 监听消息
TextMessage textMessage = (TextMessage) createConsumer.receive();
if (textMessage != null) {
String text = textMessage.getText();
System.out.println("消费者获取到消息: text:" + text);
} else {
break;
}
}
System.out.println("消费者消费消息完毕!!!");
}
}
5.测试结果(先启动消费者、在启动生产者、并且支持多个消费者)
九、总结
Always keep the faith!!! 天太晚了,凌晨一点了,各位晚安