ActiveMQ消息中间件学习(一)

来源:互联网 发布:爱淘宝1元红包抽不中 编辑:程序博客网 时间:2024/05/30 02:52

同步通讯:客户端向服务器端发出请求,并一直等待服务器端的响应。直到获取到服务器端返回的响应信息,客户端才能继续执行。

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;在发布订阅模式中,该对象被称为TopicDestination 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.释放Connectionif(null!=connection){connection.close();}}}

运行上述代码,查看控制台


点击队列名称,查看详情


此时,生产者发送消息到消息中间件ActiveMQ中了。


消息消费者Customer

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 Customer {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;在发布订阅模式中,该对象被称为TopicDestination 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.释放Connectionif(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步中的用户名和密码













原创粉丝点击