# mq
**Repository Path**: dlr-sfs_admin/mq
## Basic Information
- **Project Name**: mq
- **Description**: 消息中间件学习
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2019-08-10
- **Last Updated**: 2020-12-19
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# mq
各种消息组件:kafka rabbitmq rocketmq activemq(功能都一样,主学activemq)
1.为什么使用中间件: 可以解耦 消峰 异步
.png")
2.linux安装:
1.mkdir /usr/tools/mq
2.解压缩: tar -zxvf /opt/apache-activemq-5.15.9-bin.tar.gz -C /usr/tools/mq/
3.修改名称: mv apache-activemq-5.15.9/ activemq
4.启动:cd /usr/tools/mq/activemq/bin/ ./activemq start/stop
5.默认端口: 61616
6.是否启动:ps -ef|grep activemq|grep -v grep
3.控制台访问: 默认端口8161 http://192.168.10.20:8161/ 默认用户名 admin/admin
4.java操作:
4.1 JMS总体架构:通过 连接工厂 获取 连接 获取 session 创建 消息 目的地
4.2 目的地:点对点队列和发布订阅主题两种模式
代码讲解:
点对点队列,创建成功
.png")
消费者:
1.通过receive()方法进行同步阻塞接受,不设置时间一直等待,设置后没有,过期不侯
2.通过Listener监听接口来实现
3.点对点队列消费情况:先启动生产者,在启动多个消费者,那个消费者先消费其余的消费者就不消费了,2.先启动多个消费者,在启动生产者,平均消费
4.点对点的特点:

5.发布订阅主题

6.二者区别

5.JMS学习:
1.是俩个程序之间进行异步通信的API,为标准的消息协议和服务提供一组通用接口,包括创建 发送 读取等.当程序通过JMS进行通讯时,之间并不是直接调用,
通过JMS规范的消息收发组件进行关联的。
2.元素:JMS容器(上边的四个组件) 生产者 消费者 消息(Message)
3.消息(Message):消息头 消息属性 消息体组成
消息头主要方法:
setJMSDestination:设置消息的目的地(队列和主题)
setJMSDeliveryMode:消息是否持久化
setJMSExpiration:消息的过期时间
setJMSPriority:消息的优先级(0-9的级别越来越高) 默认4级
setJMSMessageID:消息的唯一ID
消息体主要概述:
共有5种消息格式:(切记生产和消费的消息格式必须一致)

消息属性概述:主要是对消息进行更细致的区分(设置其他属性)
6.消息的可靠性(Important):主要基于消息的持久性 消息事务 消息签收
1.持久性(基于connection连接)
DeliveryMode.NON_PERSISTENT非持久化和DeliveryMode.PERSISTENT持久化
重点:当指定消息为非持久化时,如果mq宕机,在重启消息将不复存在,持久化如果消息没被消费,重启还在(默认是持久化的)
6.1点对点队列持久话只需要设置一下DeliveryMode的值即可(就不写代码了)
6.2订阅发布主题:非持久化没有意义,先启动订阅在启动发布
6.3点对点 发布订阅持久化的区别:
点对点无无需调整启动位置 直接设置持久状态就可以,发布订阅生产者和消费者需要调整启动位置,并且消费者需要使用TopicSubscriber接受消息(看代码persistent_topic_consumer)
2.事务(基于session会话 偏于生产者):Session session=connection.createSession(false,Session.AUTO_ACKNOWLEDGE);
false:不开启事务默认commit,true:开启事务,消息发送后,session关闭前,必须commit(好处是批量消息时,可以回滚)
当生产者和消费者开启事务时,生产者不commitmq不会产生消息,消费者不commit程序会消费消息,但mq控制台不显示消费,会*重复消费*
3.签收(偏于消费者):
AUTO_ACKNOWLEDGE:自动签收 默认的******
CLIENT_ACKNOWLEDGE:手动签收******
DUPS_OK_ACKNOWLEDGE:允许重复签收
SESSION_TRANSACTED:事务签收
----------------------不写代码了--------------------------------
非事务手动签收:消费者显示调用textMessage.acknowledge();手动签收
事务的手动签收:开启事务了,无论哪种签收模式,都被默认为自动签收(**消费者开启事务但没有提交的手动签收会重复消费**)
1.mq启动时,默认执行/usr/tools/mq/activemq/conf下的activemq.xml
2.将activemq.xml拷贝一份activemq-1.xml
3.启动时指定配置文件:[root@localhost bin]# ./activemq start xbean:file://usr/tools/mq/activemq/conf/activemq-1.xml
7.按照不同的conf启动activeMQ
**_Broker相当于activeMQ服务器的实例,正常是在服务器启动MQ,现在将通过代码将MQ嵌套在Java代码中,通过代码启动_**
通过Java代码嵌入式启动: BrokerService
8.整合Spring:
1.生产者 消费者配置一样
如果消费者是监听模式的话就不用配置Spring提供的JMS工具类 消息的发送 接受 改为
https://blog.csdn.net/changhenshui1990/article/details/79813240
9.SringBoot整合:
Queue
一:生产者
1.写配置类开启mq的注解@EnableJms 2.使用JmsMessagingTemplate操作消息
扩展 3. 定时发送消息:生产者标注@Scheduled 主启动类开启定时任务 @EnableScheduling
二:消费者
配置消费和的类 方法标记@JmsListener(destination = "${queue-name}")监听某个队列即可
Topic:和队列一致
10.优化配置及集群:
1.MQ的传输协议:auto vm amqp mqtt tcp(基础) nio(常用) ssl nio-ssl(关于配置官网)
如何修改mq的传输协议:/usr/tools/mq/activemq/conf==>vi activemq.xml
name=""协议描述 openwire描述的是tcp协议 openwire就是activemq默认的协议
端口号的修改(上边)
tcp 的一些优化方案:http://activemq.apache.org/tcp-transport-reference
NIO 协议为ActiveMQ 提供更好的性能
适合NIO 使用的场景:
1 当有大量的Client 连接到Broker 上 , 使用NIO 比使用 tcp 需要更少的线程数量,所以使用 NIO
2 可能对于 Broker 有一个很迟钝的网络传输, NIO 的性能高于 TCP
2.新增nio协议
代码配置及NIO协议优化:
1.基础整合开代码;
2.优化:
只支持以TCP协议为基础得NIO网络IO模型
配置NIO网络IO模型多协议: