为了账号安全,请及时绑定邮箱和手机立即绑定

ActiveMQ入门&ActiveMQ与RocketMQ的对比

标签:
Java

1. ActiveMQ入门

前面的文章已经写过MQ的相关概念,这里不再赘述。

1.1 ActiveMQ是什么

ActiveMQ是Apache下的开源项目,完全支持JMS1.1和J2EE1.4规范的JMS Provider实现。

1.2 ActiveMQ的特点

  • 支持多种语言编写客户端

  • 对Spring的支持,很容易和Spring整合

  • 支持多种传输协议:TCP,SSL,NIO,UDP等

  • 支持Ajax请求

1.3 ActiveMQ的安装

1.3.1 官网下载

http://activemq.apache.org/

5acb3c8700013dc501600160.jpg

5acb3c8700013dc501600160.jpg

5acb3c8700013dc501600160.jpg

解压后的文件夹结构:

5acb3c8700013dc501600160.jpg

1.3.2 启动ActiveMQ

直接双击这个“wrapper.exe”即可

5acb3c8700013dc501600160.jpg

之后可以在浏览器输入http://localhost:8161/

5acb3c8700013dc501600160.jpg

1.3.3 进入管理中心

点击Manage ActiveMQ broker,会弹出身份验证,输入admin,admin即可

5acb3c8700013dc501600160.jpg

5acb3c8700013dc501600160.jpg

1.4 搭建Maven工程框架

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">    <modelVersion>4.0.0</modelVersion>    <groupId>com.linkedbear</groupId>    <artifactId>ActiveMQ-Demo</artifactId>    <version>0.0.1-SNAPSHOT</version>   

    <properties>        <activemq.version>5.15.4</activemq.version>    </properties>    <parent>        <groupId>org.springframework.boot</groupId>        <artifactId>spring-boot-starter-parent</artifactId>        <version>2.0.0.RELEASE</version>    </parent>    <dependencies>        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-web</artifactId>        </dependency>        <!-- ActiveMQ -->        <dependency>             <groupId>org.apache.activemq</groupId>             <artifactId>activemq-client</artifactId>             <version>${activemq.version}</version>         </dependency>       

        <!-- 热部署 -->        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-devtools</artifactId>        </dependency>    </dependencies>    <build>        <plugins>            <plugin>                <artifactId>maven-compiler-plugin</artifactId>                <configuration>                    <source>1.8</source>                    <target>1.8</target>                </configuration>            </plugin>        </plugins>    </build></project>

1.5 创建工程目录结构

5acb3c8700013dc501600160.jpg

之前的文章中写过,JMS的消息传递有两种模式,前面的RocketMQ中只写了一对一模式,本篇文章将会编写两种模式。

1.6 一对一模式的Queue

1.6.1 生产者

/**

 * 生产者Controller

 * @Title ProducerQueueController

 * @author LinkedBear

 * @Time 2018年8月3日 下午4:52:49

*/@Controllerpublic class ProducerQueueController {    @RequestMapping("/queueProduceMessage")

    @ResponseBody    public Map<String, Object> queueProduceMessage() throws Exception {

        //JMS的使用比较类似于JDBC与Hibernate        //1. 创建一个连接工厂(类似于JDBC中的注册驱动),需要传入TCP协议的ActiveMQ服务地址        ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://127.0.0.1:61616");

        //2. 创建连接(类似于DriverManager.getConnection)        Connection connection = connectionFactory.createConnection();

        //3. 开启连接(ActiveMQ创建的连接是需要手动开启的)        connection.start(); //注意不是open。。。        //4. 获取session(类似于Hibernate中的session,都是用会话来进行操作)        //里面有两个参数,参数1为是否开启事务,参数2为消息确认模式        Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);

        //5. 创建一对一的消息队列        Queue queue = session.createQueue("test_queue");

        //6. 创建一条消息        String text = "test queue message" + Math.random();

        TextMessage message = session.createTextMessage(text);

        //7. 消息需要发送方,要创建消息发送方(生产者),并绑定到某个消息队列上        MessageProducer producer = session.createProducer(queue);

        //8. 发送消息        producer.send(message);

        //9. 关闭连接        producer.close();

        session.close();

        connection.close();

       

        //------显示发送的消息到视图上------        Map<String, Object> map = new HashMap<>();

        map.put("message", text);

        return map;

    }

}

1.6.2 消费者

/**

 * 消费者Controller

 * @Title ConsumerQueueController

 * @author LinkedBear

 * @Time 2018年8月3日 下午4:52:56

*/@Controllerpublic class ConsumerQueueController {    @RequestMapping("/queueGetMessage1")

    public void queueGetMessage1() throws Exception {

        //1. 创建一个连接工厂,需要传入TCP协议的ActiveMQ服务地址        ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://127.0.0.1:61616");

        //2. 创建连接        Connection connection = connectionFactory.createConnection();

        //3. 开启连接        connection.start(); //注意不是open。。。        //4. 获取session        //里面有两个参数,参数1为是否开启事务,参数2为消息确认模式        Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);

        //5. 创建一对一的消息队列        Queue queue = session.createQueue("test_queue");

       

        //------------前5步都是相同的,以下为不同----------------        //6. 创建消费者        MessageConsumer consumer = session.createConsumer(queue);

        //7. 使用监听器监听队列中的消息        consumer.setMessageListener(new MessageListener() {

            @Override            public void onMessage(Message message) {

                TextMessage textMessage = (TextMessage) message;

                try {

                    String text = textMessage.getText();

                    System.out.println("收到消息:" + text);

                } catch (JMSException e) {

                    e.printStackTrace();

                }

            }

        });

       

        //由于设置监听器后不能马上结束方法,要在这里加一个等待点        System.in.read();

       

        //8. 关闭连接        consumer.close();

        session.close();

        connection.close();

    }



    @RequestMapping("/queueGetMessage2")

    public void queueGetMessage2() throws Exception //(完全相同,不再重复)

}

1.6.3 运行结果

先执行两个消息的消费者

http://localhost:8080/queueGetMessage1

http://localhost:8080/queueGetMessage2

执行http://localhost:8080/queueProduceMessage

5acb3c8700013dc501600160.jpg

但是只收到一条消息

0ee8fb0d76af8b19d2f9266d89c1775c21d.jpg

1.7 一对多模式的Topic

1.7.1 生产者

/**

 * 生产者Controller

 * @Title ProducerTopicController

 * @author LinkedBear

 * @Time 2018年8月3日 下午4:52:49

*/@Controllerpublic class ProducerTopicController {    @RequestMapping("/topicProduceMessage")

    @ResponseBody    public Map<String, Object> topicProduceMessage() throws Exception {

        //JMS的使用比较类似于JDBC与Hibernate        //1. 创建一个连接工厂(类似于JDBC中的注册驱动),需要传入TCP协议的ActiveMQ服务地址        ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://127.0.0.1:61616");

        //2. 创建连接(类似于DriverManager.getConnection)        Connection connection = connectionFactory.createConnection();

        //3. 开启连接(ActiveMQ创建的连接是需要手动开启的)        connection.start(); //注意不是open。。。        //4. 获取session(类似于Hibernate中的session,都是用会话来进行操作)        //里面有两个参数,参数1为是否开启事务,参数2为消息确认模式        Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);

        //5. 创建一对多的消息广播        Topic topic = session.createTopic("test_topic");

        //6. 创建一条消息        String text = "test topic message" + Math.random();

        TextMessage message = session.createTextMessage(text);

        //7. 消息需要发送方,要创建消息发送方(生产者),并广播到某个消息广播端上        MessageProducer producer = session.createProducer(topic);

        //8. 发送消息        producer.send(message);

        //9. 关闭连接        producer.close();

        session.close();

        connection.close();

       

        //------显示发送的消息到视图上------        Map<String, Object> map = new HashMap<>();

        map.put("message", text);

        return map;

    }

}

1.7.2 消费者

/**

 * 消费者Controller

 * @Title ConsumerTopicController

 * @author LinkedBear

 * @Time 2018年8月3日 下午4:52:56

*/@Controllerpublic class ConsumerTopicController {    @RequestMapping("/topicGetMessage")

    public void topicGetMessage() throws Exception {

        //1. 创建一个连接工厂,需要传入TCP协议的ActiveMQ服务地址        ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://127.0.0.1:61616");

        //2. 创建连接        Connection connection = connectionFactory.createConnection();

        //3. 开启连接        connection.start(); //注意不是open。。。        //4. 获取session        //里面有两个参数,参数1为是否开启事务,参数2为消息确认模式        Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);

        //5. 创建一对多的消息广播        Topic topic = session.createTopic("test_topic");

       

        //------------前5步都是相同的,以下为不同----------------        //6. 创建消费者        MessageConsumer consumer = session.createConsumer(topic);

        //7. 使用监听器监听队列中的消息        consumer.setMessageListener(new MessageListener() {

            @Override            public void onMessage(Message message) {

                TextMessage textMessage = (TextMessage) message;

                try {

                    String text = textMessage.getText();

                    System.out.println("收到消息:" + text);

                } catch (JMSException e) {

                    e.printStackTrace();

                }

            }

        });

       

        //由于设置监听器后不能马上结束方法,要在这里加一个等待点        System.in.read();

       

        //8. 关闭连接        consumer.close();

        session.close();

        connection.close();

    }



    @RequestMapping("/topicGetMessage2")    public void topicGetMessage2() throws Exception //(完全相同,不再重复)

}

1.7.3 运行结果

先执行两个消息的消费者

http://localhost:8080/topicGetMessage1

http://localhost:8080/topicGetMessage2

执行http://localhost:8080/topicProduceMessage

378469c62f5b4a39f29eeae8f92eee96ad1.jpg

这次收到了两条消息

a28d20a54f2c16246cfe87d185f65a64a10.jpg

2. RocketMQ与ActiveMQ的对比

从这两种消息中间件的编写过程来看,两种产品的区别是比较大的,下面就这两种产品进行多方面对比。

参考文章:https://blog.csdn.net/jasonhui512/article/details/53231566

比较项

RocketMQ

ActiveMQ

语言支持

只支持Java

多语言,Java为主

可用性

分布式

主从

JMS规范

常用的使用方式没有遵循JMS

严格遵循JMS规范

消息持久化

硬盘

内存,硬盘,数据库

部署方式

独立部署

独立部署、嵌入应用,可以与Spring很好的整合

社区活跃

活跃

不很活跃


点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
JAVA开发工程师
手记
粉丝
23
获赞与收藏
51

关注作者,订阅最新文章

阅读免费教程

  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消