ActiveMQ消息中间件入门学习




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

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


  
  
  1. package com.cb;
  2. import javax.jms.Connection;
  3. import javax.jms.ConnectionFactory;
  4. import javax.jms.DeliveryMode;
  5. import javax.jms.Destination;
  6. import javax.jms.MessageProducer;
  7. import javax.jms.Session;
  8. import javax.jms.TextMessage;
  9. import org.apache.activemq.ActiveMQConnectionFactory;
  10. public class Producer {
  11. public static void main(String[] args) throws Exception{
  12. //1.创建ConnectionFactory对象
  13. ConnectionFactory connectionFactory= new ActiveMQConnectionFactory(
  14. ActiveMQConnectionFactory.DEFAULT_USER,
  15. ActiveMQConnectionFactory.DEFAULT_PASSWORD,
  16. "tcp://localhost:61616");
  17. //2.创建一个Connection并开启
  18. Connection connection=connectionFactory.createConnection();
  19. connection.start();
  20. //3.创建Session会话,用来接收消息,通过参数可以设置:是否启用事务、消息签收模式
  21. Session session=connection.createSession(Boolean.FALSE, Session.AUTO_ACKNOWLEDGE);
  22. //4.创建Destination对象。在点对点模式中,该对象被称为Queue;在发布订阅模式中,该对象被称为Topic
  23. Destination destination=session.createQueue( "queue1");
  24. //5.创建消息的生产者
  25. MessageProducer messageProducer=session.createProducer(destination);
  26. //6.设置生产者的消息持久化与非持久化特性
  27. messageProducer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
  28. //7.选择需要的JMS消息格式,创建并发送消息,此处选择的是TextMessage字符串对象
  29. TextMessage textMessage=session.createTextMessage();
  30. textMessage.setText( "生产者"+ "activemq消息测试");
  31. messageProducer.send(textMessage);
  32. //8.释放Connection
  33. if( null!=connection){
  34. connection.close();
  35. }
  36. }
  37. }

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


点击队列名称,查看详情


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


消息消费者Consumer


  
  
  1. package com.cb;
  2. import javax.jms.Connection;
  3. import javax.jms.ConnectionFactory;
  4. import javax.jms.Destination;
  5. import javax.jms.MessageConsumer;
  6. import javax.jms.Session;
  7. import javax.jms.TextMessage;
  8. import org.apache.activemq.ActiveMQConnectionFactory;
  9. public class Consumer {
  10. public static void main(String[] args) throws Exception{
  11. //1.创建ConnectionFactory对象
  12. ConnectionFactory connectionFactory= new ActiveMQConnectionFactory(
  13. ActiveMQConnectionFactory.DEFAULT_USER,
  14. ActiveMQConnectionFactory.DEFAULT_PASSWORD,
  15. "tcp://localhost:61616");
  16. //2.创建一个Connection并开启
  17. Connection connection=connectionFactory.createConnection();
  18. connection.start();
  19. //3.创建Session会话,用来接收消息,通过参数可以设置:是否启用事务、消息签收模式
  20. Session session=connection.createSession(Boolean.FALSE, Session.AUTO_ACKNOWLEDGE);
  21. //4.创建Destination对象。在点对点模式中,该对象被称为Queue;在发布订阅模式中,该对象被称为Topic
  22. Destination destination=session.createQueue( "queue1");
  23. //5.创建消息的消费者
  24. MessageConsumer messageConsumer=session.createConsumer(destination);
  25. //6.消费者从消息中间件的Queue获取消息
  26. while( true){
  27. TextMessage textMessage=(TextMessage) messageConsumer.receive();
  28. if( null==textMessage){
  29. break;
  30. }
  31. System.out.println( "消费者接收到的内容:"+textMessage.getText());
  32. }
  33. //7.释放Connection
  34. if( null!=connection){
  35. connection.close();
  36. }
  37. }
  38. }

运行上面消费消息的代码,并查看控制台


此时,点击queue1查看队列中消息,发现为空,因为消息已经被消费了


在Eclipse的Console中结果如下图:




在activemq.xml中可以设置安全验证,只有验证通过的用户才可以向ActiveMQ消息中间件中发送、获取消息。



  
  
  1. <plugins>
  2. <simpleAuthenticationPlugin>
  3. <users>
  4. <authenticationUser username="cb" password="123456" groups="users,admins"/>
  5. </users>
  6. </simpleAuthenticationPlugin>
  7. </plugins>

同时修改Producer、Customer第1步中的用户名和密码















猜你喜欢

转载自blog.csdn.net/u011428598/article/details/81225295