ActiveMQ相关概念

xiaoxiao2021-02-28  33

ActiveMQ 是一个 MOM,具体来说是一个实现了 JMS 规范的系统间远程通信的消息代理

MOM 就是面向消息中间件(Message-oriented middleware),是用于以分布式应用或系统中的异步、松耦合、可靠、可扩展和安全通信的一类软件。MOM 的总体思想是它作为消息发送器和消息接收器之间的消息中介,这种中介提供了一个全新水平的松耦合。

JMS 叫做 Java 消息服务(Java Message Service),是 Java 平台上有关面向 MOM 的技术规范,旨在通过提供标准的产生、发送、接收和处理消息的 API 简化企业应用的开发,类似于 JDBC 和关系型数据库通信方式的抽象。

Provider:纯 Java 语言编写的 JMS 接口实现(比如 ActiveMQ 就是)Domains:消息传递方式,包括点对点(P2P)、发布/订阅(Pub/Sub)两种Connection factory:客户端使用连接工厂来创建与 JMS provider 的连接Destination:消息被寻址、发送以及接收的对象JMS Provider:实现JMS 接口的消息中间件;PTP:Point to Point,即点对点的消息模型;      Pub/Sub:Publish/Subscribe,即发布/订阅的消息模型;Queue:队列目标;Topic:主题目标;ConnectionFactory:连接工厂,JMS 用它创建连接;Connection:JMS 客户端到JMS Provider 的连接;Destination:消息的目的地;Session:会话,一个发送或接收消息的线程;MessageProducer:由Session 对象创建的用来发送消息的对象;MessageConsumer:由Session 对象创建的用来接收消息的对象;Acknowledge:签收;Transaction:事务。

P2P (点对点)消息域使用 queue 作为 Destination,消息可以被同步或异步的发送和接收,每个消息只会给一个 Consumer 传送一次。

Consumer 可以使用 MessageConsumer.receive() 同步地接收消息,也可以通过使用MessageConsumer.setMessageListener() 注册一个 MessageListener 实现异步接收。

多个 Consumer 可以注册到同一个 queue 上,但一个消息只能被一个 Consumer 所接收,然后由该 Consumer 来确认消息。并且在这种情况下,Provider 对所有注册的 Consumer 以轮询的方式发送消息。

Pub/Sub(发布/订阅,Publish/Subscribe)消息域使用 topic 作为 Destination,发布者向 topic 发送消息,订阅者注册接收来自 topic 的消息。发送到 topic 的任何消息都将自动传递给所有订阅者。接收方式(同步和异步)与 P2P 域相同。除非显式指定,否则 topic 不会为订阅者保留消息。当然,这可以通过持久化(Durable)订阅来实现消息的保存。这种情况下,当订阅者与 Provider 断开时,Provider 会为它存储消息。当持久化订阅者重新连接时,将会受到所有的断连期间未消费的消息。

那么使用它创建应用程序肯定也有一个通用的步骤:获取连接工厂 使用连接工厂创建连接启动连接从连接创建会话获取 Destination创建 Producer,或 创建 Producer创建 message创建 Consumer,或发送或接收message发送或接收 message 创建 Consumer注册消息监听器(可选)发送或接收 message关闭资源(connection, session, producer, consumer 等) public class JMSDemo {          ConnectionFactory connectionFactory;          Connection connection;          Session session;          Destination destination;          MessageProducer producer;          MessageConsumer consumer;          Message message;          boolean useTransaction = false ;          try {                  Context ctx = new InitialContext();                  connectionFactory = (ConnectionFactory) ctx.lookup( "ConnectionFactoryName" );                  //使用ActiveMQ时:connectionFactory = new ActiveMQConnectionFactory(user, password, getOptimizeBrokerUrl(broker));                  connection = connectionFactory.createConnection();                  connection.start();                  session = connection.createSession(useTransaction, Session.AUTO_ACKNOWLEDGE);                  destination = session.createQueue( "TEST.QUEUE" );                  //生产者发送消息                  producer = session.createProducer(destination);                  message = session.createTextMessage( "this is a test" );                    //消费者同步接收                  consumer = session.createConsumer(destination);                  message = (TextMessage) consumer.receive( 1000 );                  System.out.println( "Received message: " + message);                  //消费者异步接收                  consumer.setMessageListener( new MessageListener() {                          @Override                          public void onMessage(Message message) {                                  if (message != null ) {                                          doMessageEvent(message);                                  }                          }                  });          } catch (JMSException e) {                  ...          } finally {                  producer.close();                  session.close();                  connection.close();          } }  session = connection.createSession(useTransaction, Session.AUTO_ACKNOWLEDGE);

创建Session时有两个非常重要的参数,第一个boolean类型的参数用来表示是否采用事务消息。如果是事务消息,对于的参数设置为true,此时消息的提交自动有comit处理,消息的回滚则自动由rollback处理。加入消息不是事务的,则对应的该参数设置为false,此时分为三种情况:

Session.AUTO_ACKNOWLEDGE表示Session会自动确认所接收到的消息。Session.CLIENT_ACKNOWLEDGE表示由客户端程序通过调用消息的确认方法来确认所接收到的消息。Session.DUPS_OK_ACKNOWLEDGE使得Session将“懒惰”地确认消息,即不会立即确认消息,这样有可能导致消息重复投递。
转载请注明原文地址: https://www.6miu.com/read-2622854.html

最新回复(0)