ActiveMQ(1)

目录

1. 简介

2. 消息中间件的特点

3. 消息类型

3.1 p2p  点对点

3.2 发布订阅

4. 角色

5. 下载安装ActiveMQ

6. 小程序测试activeMQ点对点模式

6.1 依赖包

6.2 消息提供者

6.3 消息提供者

6.4 启动进行测试

7. 小程序测试activeMQ订阅发布模式

7.1 依赖包

7.2 订阅者

7.3 发布者

7.4 测试

 

1. 简介

activeMq是一种消息中间件,常用的消息中间件还有 RabbitMQ、RocketMQ、Kafka等。消息中间件可以当做一种通讯方式,消息传输的中间件,的主要特点是异步处理,主要目的是减少请求响应时间和解耦。

2. 消息中间件的特点

1. 异步通信。不需要立即处理的业务,通过消息异步的处理。

2. 缓冲。上游系统和下游系统做缓冲,保护下游系统

3. 解耦。降低工程间的强依赖程度,针对异构系统进行适配。

4. 顺序保护。先进先出

5. 过载保护。保护下游系统

6. 可恢复性。消息可以保存,直到消费成功。如果下游系统挂了,不影响上游系统,当下游系统重新连接,可以继续消费

3. 消息类型

3.1 p2p  点对点

消息生产者生产消息发送到 queue 中,然后消息消费者从 queue 中取出并且消费消息。 消息被消费以后,queue 中不再有存储,所以消息消费者不可能消费到已经被消费的消 息。 Queue 支持存在多个消费者,但是对一个消息而言,只会有一个消费者可以消费、其它 的则不能消费此消息了。 当消费者不存在时,消息会一直保存,直到有消费消费

3.2 发布订阅

消息生产者(发布)将消息发布到 topic 中,同时有多个消息消费者(订阅)消费该消 息。 和点对点方式不同,发布到 topic 的消息会被所有订阅者消费。 当生产者发布消息,不管是否有消费者。都不会保存消息 一定要先有消息的消费者,后有消息的生产者。

4. 角色

1. 消息的提供者 provider

生成消息,发送到消息服务器中

2. 消息的消费者consumer

消费消息,从消息服务其中取消息

3. Broker 消息服务器

中间件,存消息,让provider放入消息,让consumer取消息

5. 下载安装ActiveMQ

官网地址:https://activemq.apache.org/

下载地址:https://activemq.apache.org/components/classic/download/

下载完成,解压,找到bin目录下  ....bin/win64  ,运行activemq.bat,就可以成功

也可以安装到windows服务列表中,执行执行installService.bat,安装到windows系统的服务中

6. 小程序测试activeMQ点对点模式

6.1 依赖包

        <dependency>
            <groupId>org.apache.activemq</groupId>
            <artifactId>activemq-all</artifactId>
            <version>5.15.15</version>
        </dependency>

6.2 消息提供者

/**
 * 消息提供者
 * 1.获取连接工厂
 * 2.从Factory中获取connection
 * 3.从连接中获取Session
 * 4.创建queue
 * 5.创建provider
 * 6.发送数据
 * 7.关闭连接
 */
package com.hww.mq;

import com.sun.xml.internal.ws.wsdl.writer.document.Definitions;
import org.apache.activemq.ActiveMQConnectionFactory;
import org.apache.activemq.command.ActiveMQQueue;
import org.apache.activemq.command.ActiveMQTextMessage;

import javax.jms.*;

import static java.lang.Thread.sleep;

/**
 * 消息提供者
 */
public class MqProvider {

    public static void main(String[] args) throws Exception{

        //1. 获取连接工厂(user password url)
        //activeMq支持多种协议,比如tcp mqtt amqp。。。
        ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory(
                ActiveMQConnectionFactory.DEFAULT_USER,
                ActiveMQConnectionFactory.DEFAULT_PASSWORD,
                "tcp://localhost:61616"
        );

        //2. 从Factory中获取connection
        Connection connection = activeMQConnectionFactory.createConnection();

        //3. 从连接中获取Session
        //两个属性:
        // boolean transacted 是否需要事务
        // int acknowledgeMode 确认方式
        Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);

        // 4. 创建queue
        Queue mqqueue1 = session.createQueue("mqqueue1");

        // 5. 创建provider
        MessageProducer producer = session.createProducer(mqqueue1);

        // 6. 发送数据
        // message有多个类型
        //TextMessage 文本消息
        //MapMessage k/v
        //BytesMessage 字节流
        //StreamMessagejava原始的数据流
        //ObjectMessage序列化的java对象
        TextMessage textMessage = session.createTextMessage();
        for (int i = 0; i < 100; i++) {

            textMessage.setText("hello world"+i);
            producer.send(textMessage);
            sleep(1000);
        }


        //7. 关闭
        producer.close();
        session.close();
        connection.close();
    }

}

6.3 消息提供者

/**
 * 消息消费者
 * 1. 获取连接工厂
 * 2.从Factory中获取connection
 * 3.从连接中获取Session
 * 4.创建queue
 * 5.创建Cousumer
 * 6.等待提供着放入消息
 * 
 */
package com.hww.mq;

import org.apache.activemq.ActiveMQConnectionFactory;
import org.apache.activemq.command.ActiveMQTextMessage;

import javax.jms.*;

/**
 * 消息消费者
 */
public class MqConsumer {

    public static void main(String[] args) throws Exception{

        //1. 获取连接工厂(user password url)
        //activeMq支持多种协议,比如tcp mqtt amqp。。。
        ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory(
                ActiveMQConnectionFactory.DEFAULT_USER,
                ActiveMQConnectionFactory.DEFAULT_PASSWORD,
                "tcp://localhost:61616"
        );

        //2. 从Factory中获取connection
        Connection connection = activeMQConnectionFactory.createConnection();
        connection.start();
        //3. 从连接中获取Session
        //两个属性:
        // boolean transacted 是否需要事务
        // int acknowledgeMode 确认方式
        Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
        // 4. 创建queue
        Queue mqqueue1 = session.createQueue("mqqueue1");

        // 5. 创建Cousumer
        MessageConsumer consumer = session.createConsumer(mqqueue1);

        while(true){
            //该receive方法会阻塞,直到有队列中有消息
            Message receive = consumer.receive();
            TextMessage receive1 = (TextMessage) receive;
            String text = receive1.getText();
            System.out.println("consumer获取:"+text);
        }
    }

}

6.4 启动进行测试

 

7. 小程序测试activeMQ订阅发布模式

7.1 依赖包

同上

7.2 订阅者

package com.hww.mq;

import org.apache.activemq.ActiveMQConnectionFactory;
import org.apache.activemq.command.ActiveMQTextMessage;

import javax.jms.*;

import static java.lang.Thread.sleep;

/**
 * 消息提供者
 * 1.获取连接工厂
 * 2.从Factory中获取connection
 * 3.从连接中获取Session
 * 4.创建queue
 * 5.创建provider
 * 6.发送数据
 * 7.关闭连接
 */
public class MqSub {

    public static void main(String[] args) throws Exception{

        //1. 获取连接工厂(user password url)
        //activeMq支持多种协议,比如tcp mqtt amqp。。。
        ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory(
                ActiveMQConnectionFactory.DEFAULT_USER,
                ActiveMQConnectionFactory.DEFAULT_PASSWORD,
                "tcp://localhost:61616"
        );

        //2. 从Factory中获取connection
        Connection connection = activeMQConnectionFactory.createConnection();
        connection.start();
        //3. 从连接中获取Session
        //两个属性:
        // boolean transacted 是否需要事务
        // int acknowledgeMode 确认方式
        Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);

        // 4. 创建topic
        Topic topic1 = session.createTopic("topic1");

        // 5. 创建Cousumer
        MessageConsumer consumer = session.createConsumer(topic1);
        int i =0;
        while(true){
            sleep(2000);
            System.out.println("接收"+i+++"次");
            //该receive方法会阻塞,直到有队列中有消息
            Message receive = consumer.receive();
            TextMessage receive1 = (TextMessage) receive;
            String text = receive1.getText();
            System.out.println("consumer获取:"+text);
        }

        //或者设置监控
//        consumer.setMessageListener(new MessageListener() {
//            public void onMessage(Message message) {
//                try {
//                    System.out.println("接收消息  = [" + ((TextMessage) message).getText() + "]");
//                } catch (JMSException e) {
//                    e.printStackTrace();
//                }
//            }
//        });


    }

}

 

7.3 发布者

package com.hww.mq;

import org.apache.activemq.ActiveMQConnectionFactory;
import org.apache.activemq.command.ActiveMQTextMessage;

import javax.jms.*;

import static java.lang.Thread.sleep;

/**
 * 消息提供者
 * 1.获取连接工厂
 * 2.从Factory中获取connection
 * 3.从连接中获取Session
 * 4.创建queue
 * 5.创建provider
 * 6.发送数据
 * 7.关闭连接
 */
public class MqPub {

    public static void main(String[] args) throws Exception{

        //1. 获取连接工厂(user password url)
        //activeMq支持多种协议,比如tcp mqtt amqp。。。
        ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory(
                ActiveMQConnectionFactory.DEFAULT_USER,
                ActiveMQConnectionFactory.DEFAULT_PASSWORD,
                "tcp://localhost:61616"
        );

        //2. 从Factory中获取connection
        Connection connection = activeMQConnectionFactory.createConnection();

        //3. 从连接中获取Session
        //两个属性:
        // boolean transacted 是否需要事务
        // int acknowledgeMode 确认方式
        Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);

        // 4. 创建queue
        Topic topic1 = session.createTopic("topic1");
        // 5. 创建provider
        MessageProducer producer = session.createProducer(topic1);
        // 6. 发送数据
        // message有多个类型
        //TextMessage 文本消息
        //MapMessage k/v
        //BytesMessage 字节流
        //StreamMessagejava原始的数据流
        //ObjectMessage序列化的java对象
        for (int i = 0; i < 100; i++) {
            TextMessage textMessage = new ActiveMQTextMessage();
            textMessage.setText("hello world"+i);
            producer.send(textMessage);
            System.out.println("发送一次"+i);
            sleep(1000);
        }


        //7. 关闭连接
        producer.close();
        session.close();
        connection.close();
    }

}

7.4 测试

优先启动订阅者。

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值