设为首页 加入收藏

TOP

成小胖学习 ActiveMQ · 基础篇(一)
2017-11-27 13:06:50 】 浏览:668
Tags:成小胖 学习 ActiveMQ 基础

过了个春节,回到公司的成小胖变成了成大胖。但是你们千万别以为他那个大肚子里面装的都是肥肉,里面的墨水也多了不少嘞,毕竟成小胖利用春节的半个月时间专心学习并研究了 ActiveMQ,嘿嘿……

这不,为了检验下自己的学习成果,上班的第一天成小胖就去找架构师老王交流 ActiveMQ 相关的知识,还顺便向老王讨了个红包,可把成小胖给高兴坏了。

来,根据你的了解说下 ActiveMQ 是什么。”

“这个简单,ActiveMQ 是一个 MOM,具体来说是一个实现了 JMS 规范的系统间远程通信的消息代理。它……”

等等,先解释下什么是 MOM。”

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

JMS呢?

成小胖是个追求极致的人,为了解释得更通俗易懂,索性搬来一块白板边画边说。

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


嗯,很好。下面的这些概念你也需要特别理解下

  • Provider:纯 Java 语言编写的 JMS 接口实现(比如 ActiveMQ 就是)
  • Domains:消息传递方式,包括点对点(P2P)、发布/订阅(Pub/Sub)两种
  • Connection factory:客户端使用连接工厂来创建与 JMS provider 的连接
  • Destination:消息被寻址、发送以及接收的对象

你来说说这其中 P2P 和 Pub/Sub 的区别吧”,老王给成小胖抛出了一个问题。

成小胖可不是吃素的,毕竟要是吃素的话他也吃不到这么胖……这些基本概念对他来说都是小事一桩:

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 会为它存储消息。当持久化订阅者重新连接时,将会受到所有的断连期间未消费的消息。

“嗯,总结的很不错,上面的这些知识是学习 ActiveMQ 的理论基础,是必须要掌握的。”

“既然 JMS 是一个通用的规范,那么使用它创建应用程序肯定也有一个通用的步骤吧?”老王追问道。

“有的有的。要不您来说说这个通用步骤?就当我考考您,哈哈!”成小胖故作聪明,自以为老王作为架构师不会关注这些太具体的实现细节。

然而老王平日里亲力亲为,至今还常常撸代码,怎么会被这种小 case 所难倒?于是老王分分钟给出答案:

  • 获取连接工厂
  • 使用连接工厂创建连接
  • 启动连接
  • 从连接创建会话
  • 获取 Destination
  • 创建 Producer,或
    1. 创建 Producer
    2. 创建 message
  • 创建 Consumer,或发送或接收message发送或接收 message
    1. 创建 Consumer
    2. 注册消息监听器(可选)
  • 发送或接收 message
  • 关闭资源(connection, session, producer, consumer 等)

“66666,厉害啊我的王哥!”成小胖的小聪明被老王击得粉碎!

“你嘴皮子耍够了吧,还是多动动手吧。现在你手写上面步骤对应的代码实现吧”,老王给了成小胖一个眼神,让他自己慢慢体会……

成小胖也不是省油的灯,马上擦干净白板,现场撸了起来(是撸代码,撸代码,撸代码,重要的事情说三遍):

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) {
首页 上一页 1 2 3 4 下一页 尾页 1/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇条件队列大法好 :wait 和 notify.. 下一篇Java 性能调优的 11 个实用技巧

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目