点对点(point to point)消息发送

消息生产者生产消息发送到 queue 中,然后消息消费者从 queue 中取出并且消费消息。消息被消费以后,queue 中的消息被删掉,一个 queue 可以有多个消费者,但是对一个消息而言,只会有一个消费者可以消费到该消息。

点对点消息发送演示过程

1、启动 ActiveMQ

打开 ActiveMQ 管理界面,点开 Queues 选项卡,没有队列,如下:

ActiveMq 实现点对点(point to point)消息发送_其他

2、ActiveMQ 的依懒包

ActiveMQ 开发只需引入 activemq-all-5.15.0.jar 这一个包即可,因为它集成了所有开发需要的jar包。

<!-- activemq 依懒包 -->
    <dependency>
      <groupId>org.apache.activemq</groupId>
      <artifactId>activemq-all</artifactId>
      <version>5.15.0</version>
    </dependency>

3、建立消息生产者的工程,producer

新建一个类 MessageSender 用于发送点对点消息

package producer;


import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.MessageProducer;
import javax.jms.Session;
import javax.jms.TextMessage;


import org.apache.activemq.ActiveMQConnectionFactory;


/**
 * 点对点(point to point)消息发送
 * 
 * @author JPM
 */
public class MessageSender {


  public static void main(String[] args) {
    ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(
        "tcp://localhost:61616"); // 创建连接工厂
    Connection connection = null;
    try {
      connection = connectionFactory.createConnection(); // 创建连接
      connection.start(); // 启动连接


      // 创建session,两个参数分别表示:是否启动事务,消息确认模式
      Session session = connection.createSession(Boolean.TRUE,
          Session.AUTO_ACKNOWLEDGE);
      // 创建消息的目的地,createQueue表示创建的是队列消息
      Destination destination = session.createQueue("queue_01");
      // 创建消息生产者
      MessageProducer producer = session.createProducer(destination);
      // 创建需要发送的消息
      TextMessage textMessage = session
          .createTextMessage("hello,queue_01!");
      // 发送消息
      producer.send(textMessage);
      // 开启事务的时候,消息发送必须使用commit提交
      session.commit();
      session.close();
    } catch (JMSException e) {
      e.printStackTrace();
    } finally {
      if (connection != null) {
        try {
          connection.close();
        } catch (JMSException e) {
          e.printStackTrace();
        }
      }
    }
  }
}

4、运行消息生产者类,查看 ActiveMQ 管理界面

运行消息生产者类 MessageSender,向队列 “queue_01” 发送一条消息 “hello,queue_01!” ,打开 ActiveMQ 管理界面,如下:

ActiveMq 实现点对点(point to point)消息发送_其他_02

此时说明消息生产者向队列写入消息成功。

5、建立消息消费者的工程,consumer

新建一个类 MessageReceiver 用于接收点对点消息

package consumer;


import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.MessageConsumer;
import javax.jms.Session;
import javax.jms.TextMessage;


import org.apache.activemq.ActiveMQConnectionFactory;


/**
 * 点对点(point to point)消息接收
 * 
 * @author JPM
 */
public class MessageReceiver {


  public static void main(String[] args) {
    ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(
        "tcp://localhost:61616");
    Connection connection = null;
    try {
      connection = connectionFactory.createConnection();
      connection.start();
      // 表示消息由客户端自动确认
      Session session = connection.createSession(Boolean.FALSE,
          Session.AUTO_ACKNOWLEDGE);
      Destination destination = session.createQueue("queue_01");
      // 创建消息消费者
      MessageConsumer consumer = session.createConsumer(destination);
      TextMessage textMessage = (TextMessage) consumer.receive(); // 接收消息
      System.out.println("MessageReceiver--->" + textMessage.getText());
      session.close();
    } catch (JMSException e) {
      e.printStackTrace();
    } finally {
      if (connection != null) {
        try {
          connection.close();
        } catch (JMSException e) {
          e.printStackTrace();
        }
      }
    }
  }
}

6、运行消息消费者类,查看 ActiveMQ 管理界面

运行消息生产者类 MessageReceiver,从队列 “queue_01” 后去一条消息,并输出到控制台 ,控制台显示:

MessageReceiver--->hello,queue_01!

打开 ActiveMQ 管理界面,如下:

ActiveMq 实现点对点(point to point)消息发送_其他_03

至此说明队列里的消息已经被消费掉。

**7、消息消费者监听消息的关键代码**

// 创建消息消费者
MessageConsumer consumer = session.createConsumer(destination);
// 监听消息
consumer.setMessageListener(new MessageListener() {
  public void onMessage(Message msg) {
    TextMessage textMessage = (TextMessage)msg;
    try {
      System.out.println("MessageReceiver--->" + textMessage.getText());
    } catch (JMSException e) {
      e.printStackTrace();
    }
  }
});