目录
2.1:在activemq.xml中配置schedulerSupport属性为true,标识mq服务器开启定时和延时
2.2:代码层面的封装辅助消息类型schedulerMessage
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:重复消息和幂等调用

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

被折叠的 条评论
为什么被折叠?



