activemq学习笔记

activemq学习笔记_第1张图片

activemq学习笔记_第2张图片

并行方式:把一部分业务异步处理

activemq学习笔记_第3张图片

activemq学习笔记_第4张图片

activemq学习笔记_第5张图片

activemq学习笔记_第6张图片

activemq学习笔记_第7张图片

activemq学习笔记_第8张图片

activemq学习笔记_第9张图片

activemq学习笔记_第10张图片

 activemq学习笔记_第11张图片

activemq学习笔记_第12张图片

activemq学习笔记_第13张图片

activemq学习笔记_第14张图片

activemq学习笔记_第15张图片

activemq学习笔记_第16张图片

如果用的是腾讯云的服务器:无法启动,可能是hostname 带有下划线造成的,修改下划线即可:

hostnamectl set-hostname 主机名 # 新的主机名不能有下划线

activemq学习笔记_第17张图片

activemq学习笔记_第18张图片

发布订阅模式:一定是消费者先去订阅,然后才可以收到消息
activemq学习笔记_第19张图片

jms协议的消息头:

activemq学习笔记_第20张图片

我们点开消息查看:

activemq学习笔记_第21张图片

activemq学习笔记_第22张图片

消息体:

activemq学习笔记_第23张图片

activemq学习笔记_第24张图片

消息体中的属性 :

消息的属性我们可以用来:消息的过滤,消息的去重,标记等功能

activemq学习笔记_第25张图片

消息的持久化:

activemq学习笔记_第26张图片

防止消息丢失:我们就用第二种或第三种方式

基于数据库:比较麻烦,但是方便我们数据的查询

activemq持久化流程图:

activemq学习笔记_第27张图片

activemq学习笔记_第28张图片

基于内存的配置:

springboot默认用的是日志类型去存储消息:如果需要基于内存配置则需要修改配置(不推荐使用)

当我们发送了消息,然后重启mq,发现消息丢失

基于日志的方式配置:

activemq学习笔记_第29张图片

日志存储在data/kahadb中

基于jdbc的配置:

activemq学习笔记_第30张图片

然后需要在activemq的配置文件activemq.xml:

activemq学习笔记_第31张图片

 

activemq学习笔记_第32张图片

使用我们自己定义的数据源

activemq学习笔记_第33张图片

然后我们需要druid和mysql的jar包:放到activemq的lib下面

activemq学习笔记_第34张图片

然后创建数据库:db_activemq

然后重新启动activemq就会看到数据库自动建了三个表:

activemq学习笔记_第35张图片

只要消息没有被消息掉,消息仍然存在于ACTIVEMQ_MSGS表中

消息事务

activemq学习笔记_第36张图片

消息确认机制:

activemq学习笔记_第37张图片

activemq学习笔记_第38张图片

消息的投递方式:

1.异步投递

activemq学习笔记_第39张图片

activemq学习笔记_第40张图片

如果是原生API我们可以直接去修改参数

activemq学习笔记_第41张图片

如果是用的spring或者springboot时,利用异步的方式去投递信息

activemq学习笔记_第42张图片

异步发送怎么知道消息发送成功了:

activemq学习笔记_第43张图片

 

/**
     * 该方法演示我们异步投递消息,
     * @return
     */
    public String sendQueue() {
        Connection connection = null;
        Session session = null;
        ActiveMQMessageProducer producer = null;
        //获取连接工厂
        ConnectionFactory connectionFactory =
                jmsQueueTemplate.getConnectionFactory();
        try {
            connection = connectionFactory.createConnection();
            session = connection.createSession(true, Session.AUTO_ACKNOWLEDGE);
            Queue queue = session.createQueue("spring_queue_async");
            int count = 10;

            producer = (ActiveMQMessageProducer) session.createProducer(queue);
            producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);

            long start = System.currentTimeMillis();
            for (int i = 0; i < count; i++) {
                //创建需要发送的消息
                TextMessage textMessage = session.createTextMessage("hello");
                // 设置消息唯一Id
                String msgid = UUID.randomUUID().toString();
                textMessage.setJMSMessageID(msgid);   // 这里设置id虽然mq中不起作用,主要用来记录我们那条数据发送失败,利于后期我们重新发送
                producer.send(textMessage, new AsyncCallback() {
                    @Override
                    public void onSuccess() {
                        // 使用msgid标记来进行消息发送成功的处理
                        System.out.println(msgid + "消息接收成功");
                    }

                    @Override
                    public void onException(JMSException e) {
                        //使用msgid标记消息发送失败的
                        System.out.println(msgid + "消息发送失败");
                        e.printStackTrace();
                    }
                });
            }
            session.commit();
        }catch(Exception e) {
            e.printStackTrace();
        }
        return "1";
    }

2. 延迟投递:

activemq学习笔记_第44张图片

/**
     * 演示延迟投递
     * @return
     */
    public String sendQueue2() {
        Connection connection = null;
        Session session = null;
        ActiveMQMessageProducer producer = null;
        //获取连接工厂
        ConnectionFactory connectionFactory =
                jmsQueueTemplate.getConnectionFactory();
        try {
            connection = connectionFactory.createConnection();
            session = connection.createSession(true, Session.AUTO_ACKNOWLEDGE);
            Queue queue = session.createQueue("spring_queue_async");
            int count = 10;

            producer = (ActiveMQMessageProducer) session.createProducer(queue);
            producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
            long start = System.currentTimeMillis();

            //创建要发送的消息
            TextMessage textMessage = session.createTextMessage("hello");
            // 设置延时时长(延时10秒)
            textMessage.setLongProperty(ScheduledMessage.AMQ_SCHEDULED_DELAY, 10000);
            producer.send(textMessage);
            session.commit();
        }catch(Exception e) {
            e.printStackTrace();
        }
        return "1";
    }

3.定时投递:

activemq学习笔记_第45张图片

死信队列:

activemq学习笔记_第46张图片

我们修改配置文件:给每一个队列建一个死信队列

activemq学习笔记_第47张图片

消息重发的策略:默认是每隔一秒发送一次,发送6次

企业面试题:

1.Activemq宕机了怎么办:

activemq学习笔记_第48张图片

activemq学习笔记_第49张图片

zookeeper的搭建:参考我的博客zookeeper的学习笔记:

https://blog.csdn.net/qq_27922171/article/details/106644982

下面是搭建activemq的集群:

我们需要吸怪activemq的配置文件

activemq学习笔记_第50张图片

activemq学习笔记_第51张图片

然后还要修改activemq的端口:在配置文件conf/jetty.xml

修改好后,启动服务器

启动完后,因为选举的原因,只有一台服务器可以访问管理界面,我们可以自己试是那台服务器

我们也可以可以利用zookeeper的客户端界面工具ZooInspector, 查看哪个服务器了被选举作位主服务器:

activemq学习笔记_第52张图片

activemq学习笔记_第53张图片

activemq学习笔记_第54张图片

activemq学习笔记_第55张图片

如何防止消费方重复消息消息(也可以理解为消息的幂等性问题):

activemq学习笔记_第56张图片

如何防止消息的丢失:

activemq学习笔记_第57张图片

你可能感兴趣的:(activemq)