并行方式:把一部分业务异步处理
如果用的是腾讯云的服务器:无法启动,可能是hostname 带有下划线造成的,修改下划线即可:
hostnamectl set-hostname 主机名 # 新的主机名不能有下划线
发布订阅模式:一定是消费者先去订阅,然后才可以收到消息
jms协议的消息头:
我们点开消息查看:
消息体:
消息体中的属性 :
消息的属性我们可以用来:消息的过滤,消息的去重,标记等功能
消息的持久化:
防止消息丢失:我们就用第二种或第三种方式
基于数据库:比较麻烦,但是方便我们数据的查询
activemq持久化流程图:
基于内存的配置:
springboot默认用的是日志类型去存储消息:如果需要基于内存配置则需要修改配置(不推荐使用)
当我们发送了消息,然后重启mq,发现消息丢失
基于日志的方式配置:
日志存储在data/kahadb中
基于jdbc的配置:
然后需要在activemq的配置文件activemq.xml:
使用我们自己定义的数据源
然后我们需要druid和mysql的jar包:放到activemq的lib下面
然后创建数据库:db_activemq
然后重新启动activemq就会看到数据库自动建了三个表:
只要消息没有被消息掉,消息仍然存在于ACTIVEMQ_MSGS表中
消息事务
消息确认机制:
消息的投递方式:
1.异步投递
如果是原生API我们可以直接去修改参数
如果是用的spring或者springboot时,利用异步的方式去投递信息
异步发送怎么知道消息发送成功了:
/**
* 该方法演示我们异步投递消息,
* @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. 延迟投递:
/**
* 演示延迟投递
* @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.定时投递:
死信队列:
我们修改配置文件:给每一个队列建一个死信队列
消息重发的策略:默认是每隔一秒发送一次,发送6次
企业面试题:
1.Activemq宕机了怎么办:
zookeeper的搭建:参考我的博客zookeeper的学习笔记:
https://blog.csdn.net/qq_27922171/article/details/106644982
下面是搭建activemq的集群:
我们需要吸怪activemq的配置文件
然后还要修改activemq的端口:在配置文件conf/jetty.xml
修改好后,启动服务器
启动完后,因为选举的原因,只有一台服务器可以访问管理界面,我们可以自己试是那台服务器
我们也可以可以利用zookeeper的客户端界面工具ZooInspector, 查看哪个服务器了被选举作位主服务器: