Spring Async
@Async注解介绍@Async注解用于声明一个方法是异步的。当在方法上加上这个注解时,Spring 将会在一个新的线程中执行该方法,而不会阻塞原始线程。这对于需要进行一些异步操作的场景非常有用,比如在后台执行一些耗时的任务而不影响前台响应。
@Servicepublic class MyService { @Async public void asyncMethod() { // 异步执行的代码 }}// 在上面的例子中,asyncMethod 方法使用 @Async 注解标记,表示该方法将在一个独立的线程中执行。
@Async存在的问题或注意事项线程池问题上面说到,如果直接使用@Async注解,Spring就会直接使用SimpleAsyncTaskExecutor线程池。既没有重用线程,也没有设置最大线程数,所以在并发量大的时候会产生严重的性能问题!所以一般在生产环境,特别是 toc 的项目,不建议直接使用 @Async 注解,应该使用自定义线程池搭配 @Async 注解一起使用!
如何配置@Async的自定 ...
Java实战之自定义注解(以excel导出为案例)
定义注解@Excel、@PrintExcelLog。
@Excel用于设置excel的标题和默认值
@PrintExcelLog用于标识是否打印excel导出日志/** * 用于设置excel的标题和默认值 */@Retention(RetentionPolicy.RUNTIME)@Target({ElementType.FIELD, ElementType.METHOD, ElementType.TYPE})@Componentpublic @interface Excel { String title() default ""; String value() default "";}```j```java/** * 用于标识是否打印excel导出日志 */@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.METHOD)public @interface PrintExcelLog { boolean value ...
分布式基础理论 CAP & BASE
CAP定理CAP定理又被称为布鲁尔定理,是加州大学计算机科学家埃里克·布鲁尔提出来的猜想,后来被证明成为分布式计算领域公认的定理。不过布鲁尔在出来CAP的时候并没有对CAP三者(Consistency,Availability,Partition tolerance)进行详细的定义,所以在网上也出现了不少对CAP不同解读的声音。
CAP定理在发展中经历过两个版本,后一个版本比较完善,我们以第二个版本为准:在一个分布式系统中(指互相连接并共享数据的节点集合)中,当涉及到读写操作时,只能保证一致性(Consistence)、可用性(Availability)、分区容错性(Partition Tolerance)三者中的两个,另外一个必须被牺牲。
其中的关系如下图所示:
一致性、可用性、分区容错性的具体体现是什么。
一致性(Consistence) , 这个是针对数据来说的,比如数据库MySQL中的数据,一个分布式系统中,某个节点修改了一个数据,那么之后其他所有节点读取这条数据的时候,得到的一定是最新的数据。
可用性(Availability),分布式系统中某些节点挂掉了,但是不会影响整体的 ...
Spring设计模式-模板方法模式
工厂模式
模板方法模式用于定义一个算法的框架,并允许子类在不改变该算法结构的情况下重新定义算法中的某些步骤。这种模式提供了一种将算法的通用部分封装在一个模板方法中,而将具体步骤的实现延迟到子类中的方式。
模板方法模式的案例?
RestTemplate:在 Spring 框架中,RestTemplate 是用来发送 REST 请求的模板工具类。它使用了模板方法模式,提供了一些通用的方法和工具,使得发送 REST 请求的过程更加简单和灵活。RestTemplate 中的 execute、getForObject、postForObject 等方法构成了模板方法,它们定义了 REST 请求的通用流程,而具体的 HTTP 请求的细节则由不同的实现类来实现。
RedisTemplate:在 Spring Data Redis 中,RedisTemplate 用于执行对 Redis 的各种操作。它同样使用了模板方法模式,定义了一系列对 Redis 的操作方法,如 set、get、delete 等,这些方法构成了模板方法,而底层的 Redis 连接和具体的操作则由实现类来完成。
MongoT ...
Spring设计模式-责任链模式
责任链模式
责任链模式是一种行为设计模式,它允许你创建一系列对象,使每个对象都有机会处理请求。在该模式中,请求沿着对象链传递,直到最后一个责任链对象为止,。
责任链模式的要点
Handler 接口:定义了处理请求的接口,通常包含一个处理请求的方法。
ConcreteHandler 具体处理者类:实现了处理请求的方法,并决定是否自行处理请求或将请求传递给下一个处理者。
Client 客户端:创建责任链,并将请求发送到链中的第一个处理者。在 Spring 框架中,责任链模式经常被用于实现过滤器、拦截器等功能,例如在 Spring Security 中就有一个基于责任链模式的安全过滤器链。
责任链模式在项目中可以用来做什么?
校验用户的权限:token权限、URL权限、是否已经被管理员禁用;
校验短信的数据:是否手机号码在黑名单里、参数是否合法、平台的短信功能是否开启
支付回调:验签、订单状态更新、发送通知告知用户支付成功、统计订单支付成功数量、金额。
案例验签、订单状态更新、发送通知告知用户支付成功、统计订单支付成功数量、金额这几个步骤进行拆分,每个步骤都是一个链条,具体代码如下:
...
JavaScript常用的工具函数汇总
格式化时间戳export function formatDateTimeStamp(date, fmt) { // 格式化时间戳 : formatDateTimeStamp(new Date(time),'yyyy-MM-dd hh:mm:ss') if (/(y+)/.test(fmt)) { fmt = fmt.replace(RegExp.$1, (date.getFullYear() + '').substr(4 - RegExp.$1.length)) } let o = { 'M+': date.getMonth() + 1, 'd+': date.getDate(), 'h+': date.getHours(), 'm+': date.getMinutes(), 's+': date.ge ...
POST为什么会发送两次请求?
为啥有时候会发两次呢?(预检请求)
这其实跟浏览器的“预检”机制有关系。简单来说,就是浏览器在正式发请求之前,会先问问服务器:“嘿,我要发请求了,你准备好了吗?能接收吗?”这个过程就叫做“预检请求”,也叫OPTIONS请求。
为啥要有这个预检呢?
因为有时候咱们发的请求可能比较复杂,比如请求头里面带了点特殊的东西,或者请求方法是PUT、DELETE这种不常用的。这时候,浏览器就会有点担心,怕服务器不理解或者不接受这个请求,所以就先发个简单的OPTIONS请求去问问。如果服务器说:“没问题,你来吧!”那浏览器就会再发一次正式的POST请求。所以,咱们就看到了两次请求:一次是预检的OPTIONS请求,一次是正式的POST请求。
那么,跨域请求的时候,什么情况下会发出OPTIONS预检请求呢?
请求方法不是GET、HEAD、POST:因为GET、HEAD、POST这三种方法被认为是“简单”的,通常不会对服务器造成太大影响,所以浏览器会直接发送请求。但如果是PUT、DELETE等方法,浏览器就会先发个OPTIONS请求问问,就怕有人要搞破坏。
请求头包含了自定义字段:比如你在请求头里加了 ...
TCP-UDP的区别
连接方式
TCP: 是一种面向连接的协议。在数据传输前,TCP 在通信双方之间建立连接,确保数据传输的可靠性和顺序性。连接建立后,数据传输完毕后会释放连接。
UDP: 是一种无连接的协议。发送端直接将数据发送到目标地址,不需要建立连接,也不保证数据的可靠性和顺序性。
可靠性
TCP: 提供可靠的数据传输,通过确认机制、重传机制和流量控制来保证数据的完整性和顺序性。如果数据丢失或损坏,TCP 会重传丢失的数据。
UDP: 不提供数据传输的可靠性保证。数据发送后,不会进行重传,也不保证数据的顺序性,适合那些可以容忍少量数据丢失的应用,如音视频传输、实时游戏等。
传输效率和延迟
TCP: 因为提供了可靠性保证和错误处理机制,通常会比 UDP 传输速度稍慢,并且会引入一定的延迟。
UDP: 由于没有连接建立和重传机制,传输速度快,延迟低。适合对实时性要求高、可以容忍一定丢包率的应用场景。
应用场景
TCP: 适用于需要数据完整性和顺序性的应用,如网页浏览、文件下载、电子邮件传输等。
UDP: 适用于对实时性要求高、可以容忍少量数据丢失的应用,如语音通话、视频会议、实时游戏等。
总结来 ...
Vsftp-CentOS安装教程
介绍在CentOS系统上安装和配置vsftpd服务器是一个相对简单的过程,可以让你搭建一个功能强大的FTP服务器。以下是详细的步骤和说明,帮助你在CentOS上安装vsftpd并进行基本配置。
安装vsftpd# 第一种sudo apt-get updatesudo apt-get install vsftpd# 第二种sudo yum install vsftpd -y# 检查是否安装成功sudo vsftpd -v
启动vsftpd服务# 启动服务sudo systemctl start vsftpd# 关闭服务sudo systemctl stop vsftpd# 设置开机启动sudo systemctl enable vsftpd# 重启服务sudo systemctl restart vsftpd
配置vsftpdsudo cp /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.bak# 使用文本编辑器打开配置文件sudo vi /etc/vsftpd/vsftpd.conf
根据你的需求修改配置选项。以下是一些常用的配置项及 ...
Docker镜像和容器的关系?
Docker镜像是一个只读的模板,包含了运行应用程序所需的所有文件和依赖。
Docker容器则是Docker镜像的一个运行实例,可以被创建、启动、停止、删除等操作。每个Docker容器都是基于一个Docker镜像创建的。