消息中间件-ACTIVEMQ-10:ActiveMQ的高级特性

本文深入探讨了消息队列的高级功能,包括异步投递、延时和定时消息投递、消息重发机制及死信队列的运用。详细讲解了如何在ActiveMQ中配置和使用这些特性,以及它们在实际场景中的应用。
部署运行你感兴趣的模型镜像

目录

1:异步投递

1.1:异步投递的含义

1.2:开启异步投递:

​1.3: 确保异步发送成功:

2: 延时投递和定时投递

2.1:在activemq.xml中配置schedulerSupport属性为true,标识mq服务器开启定时和延时

2.2:代码层面的封装辅助消息类型schedulerMessage

1:生产者

2:消费者不用动

3:结果

3:消息重发机制

3.1:那些情况会引起消息重发

3.2:消息重发时间间隔和重发次数

3.3:有毒消息Poison ACK

3.4:消息重发的属性

3.5:消息重发的案例

3.6:消费者修改重发机制

3.7:spring整合后如何修改重发机制

4:死信队列

1:简介:

2:作用

3:自动删除过期消息

4:存放非持久的消息到死信队列

5:重复消息和幂等调用


1:异步投递

1.1:异步投递的含义

1.2:开启异步投递:

1.3: 确保异步发送成功:

package com.wkl.queuq;

import org.apache.activemq.ActiveMQConnectionFactory;
import org.apache.activemq.ActiveMQMessageProducer;
import org.apache.activemq.AsyncCallback;
import org.springframework.beans.factory.annotation.Qualifier;

import javax.jms.*;
import java.util.UUID;

/**
 * Description:第一次连接ActvieMq的服务
 * Date:       2020/9/3 - 下午 1:51
 * author:     wangkanglu
 * version:    V1.0
 */
public class Produce {

    /*账号密码如果都是默认的admin,可以不用穿;直传url*/
    private static  final String USERNAME = "admin";
    private static  final String PASSWORD = "admin";
    /*这个url以tcp协议开头,java程序访问的是61616端口*/
    private static  final String ACTIVE_URL = "tcp://192.168.43.122:61616";
    private static  final String Queue_NAME = "queue01";

    public static void main(String[] args) throws JMSException {
        //1:创建连接工厂,按照给定的账号,密码,url地址来链接;
        ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory(USERNAME, PASSWORD, ACTIVE_URL);
        activeMQConnectionFactory.setUseAsyncSend(true);
        //2:通过链接工厂获得connection并启动
        Connection connection = activeMQConnectionFactory.createConnection();
        connection.start();
        //3:通过connection创建会话,参数分别是事务和签收
        Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
        //4:创建目的地(队列还是主题)
        Queue queue = session.createQueue(Queue_NAME);
        //5:创建消息生产者,
        ActiveMQMessageProducer producer = (ActiveMQMessageProducer) session.createProducer(queue);
        /*---------开启持久化-----------*/
        producer.setDeliveryMode(DeliveryMode.PERSISTENT);

        //6:通过消息生产者producer产生3条消息发到mq的队列中
        for (int i = 1; i <=5 ; i++) {
            //7:创建消息
            TextMessage textMessage = session.createTextMessage("msg--" + i);
            /*在这里设置发送消息的回调*/
            textMessage.setJMSMessageID(UUID.randomUUID().toString());
            String jmsMessageID = textMessage.getJMSMessageID();

            //8:通过perducer发送给mq
            producer.send(textMessage, new AsyncCallback() {
                @Override
                public void onSuccess() {
                    System.out.println("成功:"+jmsMessageID);
                }

                @Override
                public void onException(JMSException e) {
                    System.out.println("失败:"+jmsMessageID);
                }
            });
        }

        //9:关闭资源;顺着申请,倒着关闭
        producer.close();
        session.close();
        connection.close();

        System.out.println("---end---");

    }
}

 

2: 延时投递和定时投递

通过配置属性可以实现延时和定时投递信息,属性如下

2.1:在activemq.xml中配置schedulerSupport属性为true,标识mq服务器开启定时和延时

2.2:代码层面的封装辅助消息类型schedulerMessage

1:生产者

package com.wkl.queuq;

import org.apache.activemq.ActiveMQConnectionFactory;
import org.apache.activemq.ActiveMQMessageProducer;
import org.apache.activemq.AsyncCallback;
import org.apache.activemq.ScheduledMessage;
import org.springframework.beans.factory.annotation.Qualifier;

import javax.jms.*;
import java.util.UUID;

/**
 * Description:第一次连接ActvieMq的服务
 * Date:       2020/9/3 - 下午 1:51
 * author:     wangkanglu
 * version:    V1.0
 */
public class Produce {

    /*账号密码如果都是默认的admin,可以不用穿;直传url*/
    private static  final String USERNAME = "admin";
    private static  final String PASSWORD = "admin";
    /*这个url以tcp协议开头,java程序访问的是61616端口*/
    private static  final String ACTIVE_URL = "tcp://192.168.43.122:61616";
    private static  final String Queue_NAME = "queue01";

    public static void main(String[] args) throws JMSException {
        //1:创建连接工厂,按照给定的账号,密码,url地址来链接;
        ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory(USERNAME, PASSWORD, ACTIVE_URL);
        activeMQConnectionFactory.setUseAsyncSend(true);
        //2:通过链接工厂获得connection并启动
        Connection connection = activeMQConnectionFactory.createConnection();
        connection.start();
        //3:通过connection创建会话,参数分别是事务和签收
        Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
        //4:创建目的地(队列还是主题)
        Queue queue = session.createQueue(Queue_NAME);
        //5:创建消息生产者,
        ActiveMQMessageProducer producer = (ActiveMQMessageProducer) session.createProducer(queue);
        /*---------开启持久化-----------*/
        producer.setDeliveryMode(DeliveryMode.PERSISTENT);

        //设置延迟时间
        long delay = 3*1000;
        long period = 4*1000;
        int repeat = 5;

        //6:通过消息生产者producer产生3条消息发到mq的队列中
        for (int i = 1; i <=5 ; i++) {
            //7:创建消息
            TextMessage textMessage = session.createTextMessage("msg--" + i);
            /*在这里设置发送消息的回调*/
            textMessage.setJMSMessageID(UUID.randomUUID().toString());

            //设置间隔发送的属性
            textMessage.setLongProperty(ScheduledMessage.AMQ_SCHEDULED_DELAY,delay);
            textMessage.setLongProperty(ScheduledMessage.AMQ_SCHEDULED_PERIOD,period);
            textMessage.setIntProperty(ScheduledMessage.AMQ_SCHEDULED_REPEAT,repeat);

            String jmsMessageID = textMessage.getJMSMessageID();

            //8:通过perducer发送给mq
            producer.send(textMessage, new AsyncCallback() {
                @Override
                public void onSuccess() {
                    System.out.println("成功:"+jmsMessageID);
                }

                @Override
                public void onException(JMSException e) {
                    System.out.println("失败:"+jmsMessageID);
                }
            });
        }

        //9:关闭资源;顺着申请,倒着关闭
        producer.close();
        session.close();
        connection.close();

        System.out.println("---end---");

    }
}

2:消费者不用动

 

3:结果

 

3:消息重发机制

3.1:那些情况会引起消息重发

3.2:消息重发时间间隔和重发次数

3.3:有毒消息Poison ACK

3.4:消息重发的属性

3.5:消息重发的案例

消费者使用事务,但是读取完不提交

重复第6次后就不会再读到了;转入到死信队列;

3.6:消费者修改重发机制

 

3.7:spring整合后如何修改重发机制

4:死信队列

1:简介:

2:作用

处理失败的消息

3:自动删除过期消息

4:存放非持久的消息到死信队列

5:重复消息和幂等调用

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

您可能感兴趣的与本文相关的镜像

Llama Factory

Llama Factory

模型微调
LLama-Factory

LLaMA Factory 是一个简单易用且高效的大型语言模型(Large Language Model)训练与微调平台。通过 LLaMA Factory,可以在无需编写任何代码的前提下,在本地完成上百种预训练模型的微调

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

苍煜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值