Shiro认证
认证过程
代码实现引入Shiro依赖123456<!-- https://mvnrepository.com/artifact/org.apache.shiro/shiro-core --><dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-core</artifactId> <version>1.4.0</version></dependency>
Java代码12345678910111213141516171819202122232425262728293031323334353637383940414243444546package com.ledao;import org.apache.shiro.SecurityUtils;import org.apache.shiro.authc.AuthenticationException;import org.apache.s ...
Java内部类
概述在Java中,可以将一个类的定义放在另外一个类的定义内部,这就是内部类。内部类本身就是类的一个属性,与其他属性定义方式一致
内部类可以分为四种:静态内部类、成员内部类、局部内部类和匿名内部类
优点
一个内部类对象可以访问创建它的外部类对象的内容,包括私有数据
内部类不为同一包的其他类所见,具有很好的封装性
内部类有效实现了“多重继承”,优化 java 单继承的缺陷
匿名内部类可以很方便的定义回调
应用场景
一些多算法场合
解决一些非面向对象的语句块
适当使用内部类,使得代码更加灵活和富有扩展性
当某个类除了它的外部类,不再被其他的类使用时
实现静态内部类
概念
定义在类内部的静态类,就是静态内部类
静态内部类可以访问外部类所有的静态变量,而不可访问外部类的非静态变量,静态内部类的创建方式:new 外部类.静态内部类()
代码实现
12345678910111213141516171819202122/** * 静态内部类 * * @author LeDao * @company * @create 2021-09-13 9:19 */public class Ou ...
Docker搭建RabbitMQ集群
拉取镜像拉取RabbitMQ镜像
1docker pull rabbitmq
创建Docker网卡创建一个RabbitMQ的Docker网卡
1docker network create rabbitmqnet
创建RabbitMQ容器分别执行下面3条命令创建3个RabbitMQ容器:
创建RabbitMQ容器1
1docker run -d --name=rabbitmq1 -p 5673:5672 -p 15673:15672 -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=admin -e RABBITMQ_NODENAME=rabbitmq1 -e RABBITMQ_ERLANG_COOKIE='YZSDHWMFSMKEMBDHSGGZ' -h rabbitmq1 --net=rabbitmqnet RabbitMQ镜像id
创建RabbitMQ容器2
1docker run -d --name=rabbitmq2 -p 5674:5672 -p 15674:15672 -e RABBI ...
RabbitMQ实现延时队列
简介延时队列,首先,它是一种队列,队列意味着内部的元素是有序的,元素出队和入队是有方向性的,元素从一端进入,从另一端取出。
其次,延时队列,最重要的特性就体现在它的延时属性上,跟普通的队列不一样的是,普通队列中的元素总是等着希望被早点取出处理,而延时队列中的元素则是希望被在指定时间得到取出和处理,所以延时队列中的元素是都是带时间属性的,通常来说是需要被处理的消息或者任务。
简单来说,延时队列就是用来存放需要在指定时间被处理的元素的队列,延时时间到了消息才会进入队列中等待着被消费
使用场景那么什么时候需要用延时队列呢?考虑一下以下场景:
订单在十分钟之内未支付则自动取消
新创建的店铺,如果在十天内都没有上传过商品,则自动发送消息提醒
账单在一周内未支付,则自动结算
用户注册成功后,如果三天内没有登陆则进行短信提醒
用户发起退款,如果三天内没有得到处理则通知相关运营人员
预定会议后,需要在预定的时间点前十分钟通知各个与会人员参加会议
实现方式实现方式有两种:
使用TTL+死信队列
利用RabbitMQ插件,推荐使用此方式
TTL+死信队列生产者生产一条消息发送到TTL交换机,然后分发 ...
RabbitMQ实现死信队列
简介当消息成为Dead Message后,可以重新被发送到另一个交换机,这个交换机就是死信交换机DLX(死信交换机),然后这个Dead Message会发送到与之绑定的死信队列。
消息成为Dead Message的三种情况:
消息由于消息有效期(per-message TTL)过期,队列的有效期并不会导致其中的消息过期
消息由于队列超过其长度限制而被丢弃
消息被消费者使用basic.reject或basic.nack方法并且requeue参数值设置为false的方式进行消息确认(negatively acknowledged)
实现过程情况一消息由于消息有效期(per-message TTL)过期
rabbitmq-common模块的RabbitMQConfig类添加配置:
1234567891011121314151617181920212223242526272829303132333435363738394041424344/** * dlx交换机名称 */public static final String DLX_DIRECT_EXCHANGE = " ...
RabbitMQ实现TTL(Time-To-Live 过期时间)
简介消息过期时间在指定的过期时间内,如果消息没有被消费,这个消息就会过期从队列中移除
实现方式
给消息设置过期时间
给队列设置过期时间,交换器分发到这个队列的消息都会有相同的过期时间,推荐使用这种方式
注意如果队列设置了消息过期时间并且消息也设置了过期时间,那么数值小的过期时间生效,例如:
一个消息的过期时间为10秒,队列的消息过期时间为20秒,那么该消息的过期时间为10秒
一个消息的过期时间为20秒,队列的消息过期时间为10秒,那么该消息的过期时间为10秒。同一个队列的消息过期时间最好一样,千万不能让队列里的消息延时时间乱七八糟多久的都有,这样的话先入队的消息如果延时时间过长会堵着后入队延时时间小的消息,导致后面的消息到时也无法变成死信转发出去
实现过程给消息设置
创建交换机、队列,交换机绑定队列
在RabbitMQConfig类中添加以下代码:
1234567891011121314151617181920212223242526272829303132333435363738394041424344/** * ttl交换机名称 */public static fina ...
RabbitMQ消费端并发和限流设置
简介并发:有时候,我们需要加快消息的处理速度,这时候,我们可以通过提高消息处理程序的并发量,来提高消息的处理能力,本质就是多个消费者消费同一个队列的消息
限流:有些场景,消费者端处理并发太大的时候,会影响消息处理端的性能,这时候需要限流
实现过程并发在要并发的监听队列的方法的@RabbitListener注解中配置concurency=“min-max”,min是最小并发数,max是最大并发数
1@RabbitListener(queues = {RabbitMQConfig.DIRECT_QUEUE},concurrency = "5-8")
限流在要限流的监听队列的方法所在类RabbitMQConsumerServiceImpl.java中添加以下代码:
1234567891011@Resourceprivate CachingConnectionFactory cachingConnectionFactory;@Bean(name = "limitContainerFactory")public SimpleRabbi ...
RabbitMQ消费端手动ACK确认机制
简介ack——acknowledge(vt. 承认;答谢;报偿;告知已收到;确认的意思),在RabbitMQ中指代的是消费者收到消息后确认的一种行为,关注点在于消费者能否实际接收到MQ发送的消息
当消息一旦被消费者接收到,会立刻自动向MQ确认接收,并将响应的message从RabbitMQ消息缓存中移除,但是在实际的业务处理中,会出现消息收到了,但是业务处理出现异常的情况,在自动确认的模式下,该条业务处理失败的message就相当于被丢弃了。如果设置了手动确认,则需要在业务处理完成之后,手动调用channel.basicAck(),手动的签收,如果业务处理失败,则手动调用channel.basicNack()方法拒收,并让MQ重新发送该消息。
RabbitMQ提供了三种确认方式:
自动确认acknowledge=”none”:当消费者接收到消息的时候,就会自动给到RabbitMQ一个回执,告诉RabbitMQ我已经收到消息了,不在乎消费者接收到消息之后业务处理的成功与否,这是RabbitMQ默认的
手动确认acknowledge=”manual”:当消费者收到消息后,不会立刻告诉R ...
RabbitMQ消息可靠性投递
简介在使用RabbitMQ的时候,消息生产者发送消息不希望出现消息丢失或者投递失败的现象,RabbitMQ在消息投递可靠性方面给我们提供了两种模式:①confirm确认模式 ②return退回模式
confirm确认模式介绍作用于生产者发送到交换机过程,发送成功与否都会调用
消息确认,是指生产者消息投递后,如果Broker收到消息,则会给生产者一个应答生产者进行接收应答,用来确定这条消息是否正常的发送到Broker,这种方式也是消息的可靠性投递的核心保障
实现rabbitmq-producer模块的application.yml文件添加以下配置:
1spring.rabbitmq.publisher-confirm-type=correlated
RabbitMQProducerServiceImpl类实现RabbitTemplate.ConfirmCallback接口,再实现confirm方法
123456789101112131415/** * @param correlationData 消息唯一标识 * @param b 交换机是否成功收到消息 t ...
RabbitMQ实现主题模式Topic
简介
主题模式和路由模式很像,但是路由模式是精确匹配,主题模式是模糊匹配,更加灵活,更加强大
主题模式使用的是topic类型的交换机,使用通配符方式实现模糊匹配,匹配符有:*和#
通配符
匹配方式
*
匹配一个单词
#
匹配零个或者多个单词
对上图的3中路由key进行解释:
*.orange.* :orange前后各有一个单词,例如:lazy.orange.rabbit、quick.orange.dog等情况
*.*.rabbit :rabbit前面后两个单词,例如:lazy.green.rabbit、quick.orange.rabbit等情况
lazy.# :lazy后面有0个或无数个单词,例如:lazy,lazy.rabbit、lazy.red.rabbit、lazy.red.old.rabbit等情况
实现过程发送topic消息为了方便测试,在rabbitmq-producer模块下添加一个发送指定类型消息功能,首先在sendInformationPage.html中添加一个form标签:
12345<form action="/sendT ...