ActiveMQ系列-01 入门

ActiveMQ - 初步认识

消息中间件应用场景

  • 异步处理

场景说明: 用户注册,需要执行三个业务逻辑,分别为写入用户表,发注册邮件以及注册短信

  • 应用解耦

场景说明: 用户下单后,订单系统需要通知库存系统。

  • 流量削峰

场景说明: 秒杀活动,一般会因为流量过大,导致流量暴增,应用挂掉。(在用户请求与秒杀业务处理中间加入消息队列)

ActiveMQ介绍与JMS协议

简介

  • 什么是ActiveMQ?

ActiveMQ是遵守Apache开源规则的最流行,能力强劲的消息中间件。ActiveMQ是一个完全支持JMS1.1和J2EE1.4规范的JMS Provider实现。

  • 什么是JMS?

JMS即Java消息服务(Java Message Service)应用程序接口,是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。Java消息服务是一个与具体平台无关的API,绝大多数MOM提供商都对JMS提供支持。

JMS消息模式

消息中间件一般有两种传递模式:点对点模式(P2P)和发布-订阅模式(Pub/Sub)

点对点模型(Queue队列模型)

P2P: 即生产者和消费者之间的消息往来

ActiveMQ

每个消息都被发送到特定的消息队列,接收者从队列中获取消息。队列保留着消息,直到他们被消费或超时

P2P特点:

  • 每个消息只有一个消费者(Consumer),即一旦被消费,消息就不再在消息队列中
  • 发送者和接收者之间在时间上没有依赖性,也就是说当发送者发送了消息之后,不管接收者有没有正在运行,它不会影响到消息被发送到队列
  • 接收者在成功接收消息之后需向队列应答成功

发布/订阅模型(Publish-Subscribe)

发布/订阅

包含三个角色: 主题(Topic),发布者(Publisher),订阅者(Subscriber),多个发布者将消息发送到topic,系统将这些消息投递到订阅此topic的订阅者。

ActiveMQ

发布者发送到topic的消息,只有订阅了topic的订阅者才会收到消息。topic实现了发布和订阅,当你发布一个消息,所有订阅这个topic的服务都能得到这个消息,所以从1到N个订阅者都能得到这个消息的拷贝。

发布/订阅模型的特点:

  • 每个消息可以有多个消费者
  • 发布者和订阅者之间有时间上的依赖性(先订阅再发布)
  • 订阅者必须保持运行的状态,才能接收发布者发布的消息

JMS编程API

要素 作用
Destination 表示消息所走通道的目标定义,用来定义消息从发送端发出后要走的通道,而不是接收方。Destination属于类对象
ConnectionFactory 用于创建连接对象,ConnectionFactory属于管理类的对象
Connection 连接接口,所负责的重要工作时创建Session
Session 会话接口,这是一个非常重要的对象,消息发送者、消息接收者以及消息对象本省,都是通过这个会话对象创建的
MessageConsume 消息消费者,也就是订阅消息并处理消息的对象
MessageProducer 消息的生产者,也就是用来发送消息的对象
  1. ConnectionFactory
    创建Connection对象的工厂,针对两种不同的jms消息模型,分别有QueueConnectionFactory和TopicConnectionFactory两种。

  2. Destination
    Destination的意思是消息生产者的消息发送目标或者说消息消费者的消息来源。对于消息生产者来说,它的Destination是某个队列(Queue)或某个主题(Topic);对于消息消费者来说,它的Destination也是某个队列或主题(即消息来源)。所以,Destination实际上就是两种类型的对象:Queue、Topic

  3. Connection
    Connection表示在客户端和JMS系统之间建立的连接(对TCP/IP socket的包装)。Connection可以产生一个或多个Session。

  4. Session
    Session是我们对消息进行操作的接口,可以通过Session创建生产者、消费者、消息等。Session提供了事务的功能,如果需要使用session发送/接收多个消息时,可以将这些发送/接收动作放到一个事务中。

  5. Producer
    消息生产者由Session创建,并用于将消息发送到Destination。同样,消息生产者分两种类型: QueueSender和TopicPublisher。可以调用消息生产者的方法(send或publish方法)发送消息

  6. Consumer
    消息消费者由Session创建,用于接收被发送到Destination的消息。两张类型: QueueReceiver和TopicSubscriber。可分别通过session的createReceiver(Queue)或createSubscriber(Topic)来创建。当然,也可以session的createDurableSubscriber方法来创建持久化的订阅者。

  7. MessageListener
    消息监听器。如果注册了消息监听器,一旦消息到达,将自动调用监听器的onMessage方法。EJB中的MDB(Message-Driven Bean)就是一种MessageListener。

ActiveMQ

ActiveMQ安装

安装(Linux)

第一步: 安装JDK(略)

第二步: 下载activemq的压缩包(apache-activemq-5.15.12-bin.tar.gz)到Linux系统

第三步: 解压文件
tar -zxvf apache-activemq-5.15.12-bin.tar.gz

第四步: 进入apache-activemq-5.15.12的bin目录

cd apache-activemq-5.15.12/bin

第五步: 启动activemq
./activemq start   (执行2次:第一次生产配置文件;第二次启动)

第六步: 停止activemq
./activemq stop

其它命令:
./activemq status -- 查看activemq的状态
./activemq restart -- 重启activemq
./activemq purge FOO.BAR -- 删除队列中的所有消息,队列名称是FOO.BAR
./activemq dstat -- 显示默认broker的所有主题和队列统计信息
./activemq dstat topics -- 显示主题的统计信息
./activemq dstat queue -- 显示队列的统计信息
...

访问

http://127.0.0.1:8161

页面控制台: http://ip:8161 (监控)
请求地址: tcp://ip:61616  (java代码访问消息中间件)

初始用户名和密码: admin/admin

原生JMS开发

点对点模式

生产者
  1. Maven引入依赖
<dependencies>
        <dependency>
            <groupId>org.apache.activemq</groupId>
            <artifactId>activemq-all</artifactId>
            <version>5.15.11</version>
        </dependency>
    </dependencies>
  1. 编写生产消息的类(PTP_Producer.class)
public class PTP_Producer {
    public static void main(String[] args) throws JMSException {
        //1.创建连接工厂
        ConnectionFactory factory = new ActiveMQConnectionFactory("tcp://127.0.0.1:61616");
        //2.创建连接
        Connection connection = factory.createConnection();
        //3.打开连接
        connection.start();
        //4.创建session
        /**
         * 参数一:是否开启事务
         * 参数二:消息确认机制
         */
        Session session = connection.createSession(false,Session.AUTO_ACKNOWLEDGE);
        //5.创建目标地址(Queue:点对点消息,Topic:发布订阅消息)
        Queue queue = session.createQueue("queue01");
        //6.创建消息生产者
        MessageProducer producer=session.createProducer(queue);
        //7.创建消息
        TextMessage message=session.createTextMessage("hello,this is PTP message");
        //8.发送消息
        producer.send(message);
        System.out.println("生产者发送完毕...");
        //9.释放资源
        session.close();
        connection.close();
    }
}
  1. 运行效果


    ActiveMQ

    ActiveMQ
消费者
  1. Maven引入依赖
    如上,略

  2. 编写接收消息的类(PTP_Consumer.class) -- receive方法

public class PTP_Consumer {
    public static void main(String[] args) throws JMSException {
        //1.创建连接工厂
        ConnectionFactory factory = new ActiveMQConnectionFactory("tcp://127.0.0.1:61616");
        //2.创建连接
        Connection connection = factory.createConnection();
        //3.打开连接
        connection.start();
        //4.创建session
        Session session = connection.createSession(false,Session.AUTO_ACKNOWLEDGE);
        //5.指定目标地址
        Queue queue = session.createQueue("queue01");
        //6.创建消息消费者
        MessageConsumer consumer = session.createConsumer(queue);
        //7.接受消息
        while (true){
            Message message = consumer.receive(); // 不断的接收,还有一个方法receive(long l),这个是隔多少毫秒接收一次
            if(message == null){ // 表示没有信息了,退出循环
                break;
            }

            if(message instanceof TextMessage){
                TextMessage textMessage = (TextMessage) message;
                System.out.println("接受到的消息: "+textMessage.getText());
            }
        }
    }
}
  1. 编写接收消息的类(PTP_Consumer2.class) -- 监听器方法(常用)
public class PTP_Consumer2 {
    public static void main(String[] args) throws JMSException {
        //1.创建连接工厂
        ConnectionFactory factory = new ActiveMQConnectionFactory("tcp://127.0.0.1:61616");
        //2.创建连接
        Connection connection = factory.createConnection();
        //3.打开连接
        connection.start();
        //4.创建session
        Session session = connection.createSession(false,Session.AUTO_ACKNOWLEDGE);
        //5.指定目标地址
        Queue queue = session.createQueue("queue01");
        //6.创建消息消费者
        MessageConsumer consumer = session.createConsumer(queue);
        //7.设置消息监听器来接收消息
        consumer.setMessageListener(new MessageListener() {
            // 处理消息
            @Override
            public void onMessage(Message message) {
                if(message instanceof TextMessage){
                    TextMessage textMessage = (TextMessage) message;
                    try {
                        System.out.println("接收的消息(2):"+textMessage.getText());
                    } catch (JMSException e) {
                        e.printStackTrace();
                    }
                }
            }
        });
        // 注意: 在监听器模式下千万不要关闭连接,一旦关闭,消息无法接收
    }
}
  1. 运行效果


    ActiveMQ

    ActiveMQ

发布订阅模式

生产者
  1. Maven引入依赖
    如上,略

  2. 编写生产类(PS_Producer.class)

/**
 * 发布订阅模式-消息生产者
 */
public class PS_Producer {
    public static void main(String[] args) throws JMSException {
        //1.创建连接工厂
        ConnectionFactory factory = new ActiveMQConnectionFactory("tcp://127.0.0.1:61616");
        //2.创建连接
        Connection connection = factory.createConnection();
        //3.打开连接
        connection.start();
        //4.创建session
        /**
         * 参数一:是否开启事务
         * 参数二:消息确认机制
         */
        Session session = connection.createSession(false,Session.AUTO_ACKNOWLEDGE);
        //5.创建目标地址(Queue:点对点消息,Topic:发布订阅消息)
        Topic topic = session.createTopic("topic01");
        //6.创建消息生产者
        MessageProducer producer=session.createProducer(topic);
        //7.创建消息
        TextMessage message=session.createTextMessage("hello,this is PS message");
        //8.发送消息
        producer.send(message);
        System.out.println("生产者发送完毕...");
        //9.释放资源
        session.close();
        connection.close();
    }
}
  1. 运行效果


    ActiveMQ

    ActiveMQ
消费者
  1. Maven引入依赖
    如上,略

  2. 编写生产类(PS_Consumer.class)

/*
 * 发布订阅模式消费者
 */
public class PS_Consumer {
    public static void main(String[] args) throws JMSException {
        //1.创建连接工厂
        ConnectionFactory factory = new ActiveMQConnectionFactory("tcp://127.0.0.1:61616");
        //2.创建连接
        Connection connection = factory.createConnection();
        //3.打开连接
        connection.start();
        //4.创建session
        Session session = connection.createSession(false,Session.AUTO_ACKNOWLEDGE);
        //5.指定目标地址
        Topic topic = session.createTopic("topic01");
        //6.创建消息消费者
        MessageConsumer consumer = session.createConsumer(topic);
        //7.设置消息监听器来接收消息
        consumer.setMessageListener(new MessageListener() {
            // 处理消息
            @Override
            public void onMessage(Message message) {
                if(message instanceof TextMessage){
                    TextMessage textMessage = (TextMessage) message;
                    try {
                        System.out.println("接收的消息---topic:"+textMessage.getText());
                    } catch (JMSException e) {
                        e.printStackTrace();
                    }
                }
            }
        });
        // 注意: 在监听器模式下千万不要关闭连接,一旦关闭,消息无法接收
    }
}
  1. 运行效果)


    ActiveMQ

这时我们看到订阅到的topic消息是没有被消费的。上面有说到,在发布订阅模式下,一定要先启动消费者,然后才能消费到发布者推送的订阅的信息。让我们重新启动下PS_Producer类,再看看效果


ActiveMQ

这时已经成功获取到消息了,再看看页面控制台


ActiveMQ

消息入列2条,成功出列1条,1个消费者

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,835评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,598评论 1 295
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,569评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,159评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,533评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,710评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,923评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,674评论 0 203
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,421评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,622评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,115评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,428评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,114评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,097评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,875评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,753评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,649评论 2 271

推荐阅读更多精彩内容

  • ActiveMQ 即时通讯服务 浅析http://www.cnblogs.com/hoojo/p/active_m...
    bboymonk阅读 1,425评论 0 11
  • 什么是activeMQ activeMQ是一种开源的,实现了JMS1.1规范的,面向消息(MOM)的中间件,为应用...
    赵铁柱啊阅读 1,802评论 1 6
  • 简介 ActiveMQ 特点 ActiveMQ 是由 Apache 出品的一款开源消息中间件,旨在为应用程序提供高...
    预流阅读 5,809评论 4 21
  • ActiveMQ 简介:ActiveMQ 是Apache出品,最流行的,能力强劲的开源消息总线。ActiveMQ ...
    CoderZS阅读 2,631评论 0 23
  • 那个叛逆的我,疯狂旅行的我,沉迷小说的我,一直被我隐藏着,只有身边的人才知道那个我,也是我,我想这是每个人的独特,...
    晓晓E_L阅读 340评论 0 0