ActiveMQ消息队列实现点对点(Queue)和发布/订阅(Topic)

(Message Queue 消息队列)JMS

前言

JMS即Java消息服务(Java Message Service)应用程序接口,是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间中发送消息,进行异步通信
JMS是一种与厂商无关的 API,用来访问收发系统消息,它类似于JDBC(Java Database Connectivity)。这里,JDBC 是可以用来访问许多不同关系数据库的 API,而 JMS 则提供同样与厂商无关的访问方法,以访问消息收发服务。


一、什么是ActiveMQ?

ActiveMQ 是Apache出品,最流行的,能力强劲的开源消息总线。ActiveMQ 是一个完全支持JMS1.1和J2EE 1.4规范的 JMS 实现,尽管JMS规范出台已经是很久的事情了,但是JMS在当今的J2EE应用中间仍然扮演着特殊的地位(在两个应用程序之间发送消息)。

二、启动MQ

直接双击activemq.bat就可以,注意根据系统选择(window 64位 选择 win64中的activemq)
在这里插入图片描述
启动成功。。。
在这里插入图片描述
Url:http://127.0.0.1:8161/admin/index.jsp
默认的用户名和密码:admin/admin
在这里插入图片描述
ActiveMQ的控制台,发布的消息都可以看见。
在这里插入图片描述

三、点对点(Queue)和发布/订阅(Topic)的区别

1、点对点(Queue)

在这里插入图片描述

2、发布/订阅(Topic)

在这里插入图片描述

3、点对点 与 发布/订阅的区别

在这里插入图片描述

四、ActiveMQ 点对点代码实现

1.消息发送者(Sender)

import org.apache.activemq.ActiveMQConnectionFactory;

import javax.jms.*;

public class 生产消息到Queue
{
    
    
    public static void main(String[] args) {
    
    
        //创建连接工厂
        ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(
                "admin",
                "admin",
                "tcp://localhost:61616");
        //声明连接
        Connection connection = null;
        //创建Session:用于发送消息和接收消息
        Session session = null;
        //创建消息的目的地
        Destination destination = null;
        //声明消息生产者
        MessageProducer producer = null;


        try {
    
    
            //1,获得与ActiveMQ的连接
            connection = connectionFactory.createConnection();
            //2,开启这个连接
            connection.start();
            //3,创建Session对象:这将是个用于发送消息或接收消息的线程
            //createSession 第一个参数transacted 表示是否支持事务
            //第二个参数 acknowledgeMode 有如下几种
            //1.AUTO_ACKNOWLEDGE 自动确认模式,不需客户端进行确认(通常使用这种)
            //2.CLIENT_ACKNOWLEDGE   客户端进行确认
            //客户端获得message之后需要进行message.acknowledge();
            //3.DUPS_OK_ACKNOWLEDGE  允许重复消息
            session = connection.createSession(Boolean.TRUE,
                    Session.AUTO_ACKNOWLEDGE);
            //4,创建目的地,并指明消息所放队列的名字
            destination = session.createQueue("香坊铁路局");//Queue是Destination子接口
            //5,创建向该目的地发送消息的生产者
            producer = session.createProducer(destination);
            //6,设置持久化模式
            // 持久化模式 NON_PERSISTENT不持久化,PERSISTENT持久化,默认是持久化的
            //producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);//默认是持久化的
            //发送三个消息
            for(int cs=1;cs<=3;cs++) {
    
    
                //7,创建要发送的消息
                TextMessage message = session.createTextMessage("T1978is over  "+cs);
                //8,发送消息到目的
                producer.send(message);
            }
            //9,提交消息
            session.commit();
        } catch (JMSException e) {
    
    
            e.printStackTrace();
        }
        finally
        {
    
    
            //关闭连接
            try {
    
    
                connection.close();
            } catch (JMSException e) {
    
    
                e.printStackTrace();
            }
        }
    }
}

2.消息接收者(Receiver)

import org.apache.activemq.ActiveMQConnection;
import org.apache.activemq.ActiveMQConnectionFactory;

import javax.jms.*;

public class 从指定的Queue接收消息
{
    
    
    public static void main(String[] args) {
    
    
        //声明连接工厂
        ConnectionFactory connectionFactory=null;
        //声明连接
        Connection conn = null;
        //声明Session
        Session session = null;
        //声明目的地
        Destination destination =null;
        //声明接收者
        MessageConsumer consumer =null;

        try
        {
    
    
            //创建连接工厂
            connectionFactory = new ActiveMQConnectionFactory("admin","admin","tcp://localhost:61616");
         /*   connectionFactory = new ActiveMQConnectionFactory(
                    ActiveMQConnection.DEFAULT_USER,
                    ActiveMQConnection.DEFAULT_PASSWORD,
                    "tcp://localhost:61616");*/
            //创建连接对象
            conn = connectionFactory.createConnection();
            //开启连接
            conn.start();//这个不能忘啊
            //创建Session, false不启动事务,AUTO_ACKNOWLEDGE 自动确认模式,不需客户端进行确认
            session = conn.createSession(Boolean.FALSE,Session.AUTO_ACKNOWLEDGE);
            //创建目的地
            destination = session.createQueue("香坊铁路局");
            //创建消息接收者
            consumer = session.createConsumer(destination);
   /*         TextMessage textMessage =  (TextMessage)consumer.receive();

            System.out.println("接收到的消息为:"+textMessage.getText());*/
            while(true)
            {
    
    
                //consumer.receive();
                    //如果一秒种都无法在消息队列中得到值则返回null
                    TextMessage textMessage = (TextMessage) consumer.receive(1000);
		//如果没有信息了就结束循环
                    if(textMessage == null)
                    {
    
    
                        break;
                    }
                    System.out.println(textMessage.getText());
            }
	session.commit();//只有提交才会将消息从MQ中移除(取走)

        }
        catch (Exception e)
        {
    
    
            e.printStackTrace();
        }
        finally
        {
    
    
            try {
    
    
                conn.close();

            } catch (JMSException e) {
    
    
                e.printStackTrace();
            }
        }
    }
}

五、ActiveMQ 发布/订阅代码实现

1.消息发布者

import org.apache.activemq.ActiveMQConnectionFactory;

import javax.jms.*;

public class PublisherDemo
{
    
    
    public static void main(String[] args) {
    
    
        //声明连接工厂
        ConnectionFactory connectionFactory = null;
        //声明连接
        Connection connection = null;
        //声明Session
        Session session =null;
        //声明消息目的地
        Destination destination =null;
        //声明消息发布者
        MessageProducer messageProducer =null;
        try
        {
    
    
            //创建连接工厂
            connectionFactory = new ActiveMQConnectionFactory(
                    "admin",
                    "admin",
                    "tcp://localhost:61616"
            );
            //创建连接
            connection = connectionFactory.createConnection();
            //开始连接
            connection.start();
            //创建Session
            session = connection.createSession(true,Session.AUTO_ACKNOWLEDGE);
            //创建目的地
            destination = session.createTopic("阿城铁路局");//createTopic表示采用发布/订阅模式
            //创建消息发布者
            messageProducer = session.createProducer(destination);
            //发送消息
            TextMessage textMessage =session.createTextMessage("T1983 is over");
            messageProducer.send(textMessage);
            //提交
            session.commit();
        }
        catch (Exception e)
        {
    
    
            e.printStackTrace();
        }
        finally
        {
    
    
            try {
    
    
                connection.close();
            } catch (JMSException e) {
    
    
                e.printStackTrace();
            }
        }

    }
}

2.消息订阅者

import org.apache.activemq.ActiveMQConnectionFactory;

import javax.jms.*;

public class SubscriberDemo
{
    
    
    public static void main(String[] args) {
    
    
        //声明连接工厂
        ConnectionFactory connectionFactory = null;
        //声明连接
        Connection connection = null;
        //声明Session
        Session session =null;
        //声明消息目的地
        Destination destination =null;
        //声明消息发布者
        MessageConsumer messageConsumer =null;
        try
        {
    
    
            //创建连接工厂
            connectionFactory = new ActiveMQConnectionFactory(
                    "admin",
                    "admin",
                    "tcp://localhost:61616"
            );
            //创建连接
            connection = connectionFactory.createConnection();
            //开始连接
            connection.start();
            //创建Session
            session = connection.createSession(true,Session.AUTO_ACKNOWLEDGE);
            //创建目的地
            destination = session.createTopic("阿城铁路局");//createTopic表示采用发布/订阅模式
            //创建消息订阅者
            messageConsumer = session.createConsumer(destination);
            //接收消息
           messageConsumer.setMessageListener(new MessageListener(){
    
    //采用匿名内部类对象实现MessageListener接口
               @Override
               public void onMessage(Message message) {
    
    //接收订阅的内容
                   TextMessage textMessage = (TextMessage) message;
                   try {
    
    
                       System.out.println("订阅者:"+textMessage.getText());
                   } catch (JMSException e) {
    
    
                       e.printStackTrace();
                   }
               }
           });
            //提交
            session.commit();
        }
        catch (Exception e)
        {
    
    
            e.printStackTrace();
        }//注意作为订阅者:1、要确保先启动等待着消息的发布,2、代码中不能关闭连接
    }
}

总结

许多厂商都支持 比如我们今天要学习的ActiveMQ(ActiveMQ只是实现了JMS操作标准的Java产品之一,即所有实现了JMS操作标准的Java产品都可以称为MQ,MQ的主要应用就是可以实现以异步方式在两个应用程序之间发送消息)(主要应用:天气预报服务)。

猜你喜欢

转载自blog.csdn.net/zhx__/article/details/119840256