ActiveMQ 点对点发送与接收消息示例

ActiveMQ 点对点发送与接收 都是基于Queue队列的,每条消息只能被一个消费者所消费

点对点模型 用于 消息生产者 和 消息消费者 之间 点到点 的通信。消息生产者将消息发送到由某个名字标识的特定消费者。这个名字实际上对于消费服务中的一个 队列(Queue),在消息传递给消费者之前它被 存储 在这个队列中。队列消息 可以放在 内存 中也可以 持久化,以保证在消息服务出现故障时仍然能够传递消息。

消息生产者

package com.kevin.mq.activemqdemo;

import org.apache.activemq.ActiveMQConnectionFactory;

import javax.jms.*;

/**
 * @Author kevin
 * @Description 消息发送者
 * @Date Created on 2019/8/2 15:21
 */
public class Sender {
    /**消息服务器的连接地址**/
    public static final String BROKER_URL = "tcp://127.0.0.1:61616";

    public static void main(String[] args) {
        Sender sender = new Sender();
        sender.sendMessage("Kevin Hello ActiveMQ.");
    }


    public void sendMessage (String msg) {

        Connection connection = null;
        Session session = null;
        MessageProducer messageProducer = null;

        try {
            //1.创建一个连接工厂
            ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(BROKER_URL);
            //2.创建一个连接
            connection = connectionFactory.createConnection();
            //3.创建一个Session回话
            session = connection.createSession(Boolean.FALSE, Session.AUTO_ACKNOWLEDGE);

            //4.创建一个目的地
            Destination destination = session.createQueue("kevin.shoudong.queue");

            //5.创建一个消息的生产者
            messageProducer = session.createProducer(destination);

            //6.设置消息是否需要持久化
            //messageProducer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
            messageProducer.setDeliveryMode(DeliveryMode.PERSISTENT);

            for (int i=0;i<20;i++){
                Message message = session.createTextMessage("kevin "+ i);
                message.setIntProperty("Id", i);
                //发送消息
                messageProducer.send(message);
            }

        }catch (Exception e){
            e.printStackTrace();
        } finally {
            try{
                //关闭连接释放资源
                if (null != messageProducer) {
                    messageProducer.close();
                }
                if (null != session) {
                    session.close();
                }
                if (null != connection) {
                    connection.close();
                }
            } catch (JMSException e) {
                e.printStackTrace();
            }
        }


    }
}


消费者,
需要一直处于运行状态,监听消息,然后进行消费


package com.kevin.mq.activemqdemo;

import org.apache.activemq.ActiveMQConnectionFactory;

import javax.jms.*;

/**
 * @Author kevin
 * @Description 消息的接收者
 * @Date Created on 2019/8/2 15:34
 */
public class Receive {
    /**消息服务器的连接地址**/
    public static final String BROKER_URL = "tcp://127.0.0.1:61616";

    public static void main(String[] args) {
        Receive receiver = new Receive();
        receiver.receiveMessage();
    }

    /**
     * 接收消息
     *
     */
    public void receiveMessage () {
        Connection connection = null;
        Session session = null;
        MessageConsumer messageConsumer = null;

        try{
            //1.创建一个连接工厂
            ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(BROKER_URL);
            //2.创建一个连接
            connection = connectionFactory.createConnection();
            //3.创建一个Session回话
            session = connection.createSession(Boolean.FALSE, Session.AUTO_ACKNOWLEDGE);
            //4.创建一个目的地
            Destination destination = session.createQueue("kevin.shoudong.queue");

            //5.创建一个消费者
            //selector即为消息选择器,通过选择需要的标识,过滤消息接受id为10-15之 //间的消息
            String selector = "Id >=10 and Id<=15";
            messageConsumer = session.createConsumer(destination, selector);
            //messageConsumer = session.createConsumer(destination);

            //接收消息之前 需要启动连接
            connection.start();
            while (true){
                Message message = messageConsumer.receive();
                if (message instanceof TextMessage){
                    //判断是否是文本消息
                    String text = ((TextMessage) message).getText();
                    System.out.println("接收到的消息内容是:" + text);
                }else{

                    System.out.println("接收到的消息内容是   非文本消息" );
                }
            }



        }catch (Exception e){
            e.printStackTrace();
        } finally {
            try{
                //关闭连接释放资源
                if (null != messageConsumer) {
                    messageConsumer.close();
                }
                if (null != session) {
                    session.close();
                }
                if (null != connection) {
                    connection.close();
                }
            } catch (JMSException e) {
                e.printStackTrace();
            }
        }


    }

}

发布了95 篇原创文章 · 获赞 50 · 访问量 10万+

猜你喜欢

转载自blog.csdn.net/jc0803kevin/article/details/98212259