同步通讯:客户端向服务器端发出请求,并一直等待服务器端的响应。直到获取到服务器端返回的响应信息,客户端才能继续执行。
MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序的通信方法。应用程序通过读写出入队列的消息(针对应用程序的数据)来通信,而无需专用连接来链接它们。消息传递指的是程序之间通过在消息中发送数据进行通信,而不是通过直接调用彼此来通信,直接调用通常是用于诸如远程过程调用的技术。
MOM消息中间件:消息发送端将消息发送给消息服务器,消息服务器将消息存放在若干个队列中,在合适的时候再将消息转发给消息接收端。在这种模式下,发送消息和接收消息是一个异步的过程,消息发送端和消息接收端不一定同时运行,消息发送端在发送完消息后也无需继续等待消息接收端的响应信息,而可以继续做其它事情。
Java提供JMS规范,即定义了Java访问消息中间件的接口,它并没有提供接口的实现。目前,有很多的JMS Provider提供了这些接口的实现,包括Apache的ActiveMQ、阿里巴巴的RocketMQ、Pivotal的RabbitMQ。
JMS中相关术语:
Provider:消息生产者
Customer:消息消费者
Publish/Subscribe:消息的发布订阅模式
Queue:消息对列
Topic:消息主题
ConnectionFactory:连接工厂,用于创建连接
Connection:消息生产者或消费者到JMS Provider的连接
Destination:消息的目的地
Session:会话,一个发送或接收消息的线程
消息格式定义:
StreamMessage:数据流
MapMessage:名称-值对
TextMessage:字符串对象
ObjectMessage:序列化的Java对象
BytesMessage:字节数据流
在ActiveMQ的官网下载最新版本的软件包
ActiveMQ的配置文件、jetty容器的配置文件
ActiveMQ软件包中一个比较全的jar包
webapps包含可以部署到jetty中的admin管控台程序
在bin目录下通过bat文件启动ActiveMQ
查看jetty.xml中的端口号
启动完成后,使用浏览器访问
消息生产者Producer
-
package com.cb;
-
-
import javax.jms.Connection;
-
import javax.jms.ConnectionFactory;
-
import javax.jms.DeliveryMode;
-
import javax.jms.Destination;
-
import javax.jms.MessageProducer;
-
import javax.jms.Session;
-
import javax.jms.TextMessage;
-
import org.apache.activemq.ActiveMQConnectionFactory;
-
-
public
class Producer {
-
public static void main(String[] args) throws Exception{
-
//1.创建ConnectionFactory对象
-
ConnectionFactory connectionFactory=
new ActiveMQConnectionFactory(
-
ActiveMQConnectionFactory.DEFAULT_USER,
-
ActiveMQConnectionFactory.DEFAULT_PASSWORD,
-
"tcp://localhost:61616");
-
//2.创建一个Connection并开启
-
Connection connection=connectionFactory.createConnection();
-
connection.start();
-
//3.创建Session会话,用来接收消息,通过参数可以设置:是否启用事务、消息签收模式
-
Session session=connection.createSession(Boolean.FALSE, Session.AUTO_ACKNOWLEDGE);
-
//4.创建Destination对象。在点对点模式中,该对象被称为Queue;在发布订阅模式中,该对象被称为Topic
-
Destination destination=session.createQueue(
"queue1");
-
//5.创建消息的生产者
-
MessageProducer messageProducer=session.createProducer(destination);
-
//6.设置生产者的消息持久化与非持久化特性
-
messageProducer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
-
//7.选择需要的JMS消息格式,创建并发送消息,此处选择的是TextMessage字符串对象
-
TextMessage textMessage=session.createTextMessage();
-
textMessage.setText(
"生产者"+
"activemq消息测试");
-
messageProducer.send(textMessage);
-
//8.释放Connection
-
if(
null!=connection){
-
connection.close();
-
}
-
-
}
-
}
运行上述代码,查看控制台
点击队列名称,查看详情
此时,生产者发送消息到消息中间件ActiveMQ中了。
消息消费者Consumer
-
package com.cb;
-
-
import javax.jms.Connection;
-
import javax.jms.ConnectionFactory;
-
import javax.jms.Destination;
-
import javax.jms.MessageConsumer;
-
import javax.jms.Session;
-
import javax.jms.TextMessage;
-
import org.apache.activemq.ActiveMQConnectionFactory;
-
-
public
class Consumer {
-
public static void main(String[] args) throws Exception{
-
//1.创建ConnectionFactory对象
-
ConnectionFactory connectionFactory=
new ActiveMQConnectionFactory(
-
ActiveMQConnectionFactory.DEFAULT_USER,
-
ActiveMQConnectionFactory.DEFAULT_PASSWORD,
-
"tcp://localhost:61616");
-
//2.创建一个Connection并开启
-
Connection connection=connectionFactory.createConnection();
-
connection.start();
-
//3.创建Session会话,用来接收消息,通过参数可以设置:是否启用事务、消息签收模式
-
Session session=connection.createSession(Boolean.FALSE, Session.AUTO_ACKNOWLEDGE);
-
//4.创建Destination对象。在点对点模式中,该对象被称为Queue;在发布订阅模式中,该对象被称为Topic
-
Destination destination=session.createQueue(
"queue1");
-
//5.创建消息的消费者
-
MessageConsumer messageConsumer=session.createConsumer(destination);
-
//6.消费者从消息中间件的Queue获取消息
-
while(
true){
-
TextMessage textMessage=(TextMessage) messageConsumer.receive();
-
if(
null==textMessage){
-
break;
-
}
-
System.out.println(
"消费者接收到的内容:"+textMessage.getText());
-
}
-
//7.释放Connection
-
if(
null!=connection){
-
connection.close();
-
}
-
-
}
-
}
运行上面消费消息的代码,并查看控制台
此时,点击queue1查看队列中消息,发现为空,因为消息已经被消费了
在Eclipse的Console中结果如下图:
在activemq.xml中可以设置安全验证,只有验证通过的用户才可以向ActiveMQ消息中间件中发送、获取消息。
-
<plugins>
-
<simpleAuthenticationPlugin>
-
<users>
-
<authenticationUser username="cb" password="123456" groups="users,admins"/>
-
</users>
-
</simpleAuthenticationPlugin>
-
</plugins>
同时修改Producer、Customer第1步中的用户名和密码