SpringMvc请求参数的二次处理
需求
在一个项目中原来服务端是采用WebService
的进行客户端和服务进行交互,现根据需要调整为直接使用HHTP
方式访问。仅修改访问的方式,其数据的访问结构等不变。
在一个项目中原来服务端是采用WebService
的进行客户端和服务进行交互,现根据需要调整为直接使用HHTP
方式访问。仅修改访问的方式,其数据的访问结构等不变。
在工作的中使用到部分ElasticSearch
沾边的东西,ELK
日志实时分析系统,对ElasticSearch
也略有耳闻,趁着最近有时间学习一下,并将学习过程中知识点记录下来。
昨天要下班时遭测试反馈说某个业务日志表中的数据的基础字段(创建人、修改人)信息有问题,赶紧过去看了一眼,发现确实有问题,那张业务表主要是A角色的操作,而表中最后的数据记录的是B角色的信息。项目采用Oauth2
的方式进行认证,很容易就想到是否是token
互串导致,因为基础字段是直接通过token
信息进行存储,便于后期排查问题而已?
[TOC]
最近看了一些博客都是在推荐技术新人通过写博客的方式记录学习到的知识点和遇到的问题,好记性不如烂笔头,我也尝试开始写博客,在通过github gitpage
搭建博客的时候发现需要在一台电脑中配置两个git
账号,之前都是全局配置公司的gitlib
账号。记录一下整个的配置过程,过程中也踩了不少坑。
最近项目接入苞米豆的
lock4j
用于分布式的锁控制,良好的控制在多台服务器下请求分流导致的数据重复问题,使用上也比较简单,在需要分布式锁的方法上添加一个@Lock4j
注解并添加相应的参数即可,在使用中发现其中有一个属性keys = {"#userId", "#user.sex"}
,并且支持自定义重写分布式锁键的生成策略。在好奇心的驱使下,查看了默认实现的分布式锁键生成策略是通过SpEL
的方式解析参数信息。
今天在使用mybatis-plus
作者苞米豆的另一个项目lock4j
用于项目中的分布式锁,解决多实例情况下对接口进行上锁,使得业务上的共享资源在一个时间节点里只会被一个线程执行。
lock4j
和mybatis-plus
差不多,秉承着人性化使用的初衷,lock4j
使用上还是非常简单的,只需要在需要上锁的接口方法上使用@Lock4j
进行标记并设置一些简单的超时参数即可。
使用中发现有一个需要上锁的接口是一个私有方法(原本单机情况下,采用ReentrantLock
),所以改造时仅仅只是对改接口上添加@Lock4j
注解。
今天收到预生产环境测试人员的消息说项目启动失败,看了一下错误是rabbitmq
的队列监听抛出找不到该队列,没有道理,逻辑上已经经过了测试环境的测试没有理由犯这么低级的错误。吓得我赶紧看去看了一下预生产环境的apollo
配置信息(我们使用的mq
厂商随环境的不同可能不同),配置信息也是对的;赶紧再次核对一下错误日志,发启动时创建交换机还有另外的报错:
1 | 2021-04-14 16:58:23.014 [AMQP Connection 192.168.2.16:5672] ERROR o.s.a.r.c.CachingConnectionFactory-Channel shutdown: channel error; protocol method: #method<channel.close>(reply-code=406, reply-text=PRECONDITION_FAILED - inequivalent arg 'type' for exchange 'xxxxx' in vhost '/': received 'topic' but current is 'fanout', class-id=40, method-id=10) |
大概的意思是已经存在该名称为fanout
类型交换机不允许改变为topic
类型交换机。
使用过SprongBoot
打过jar
包的都应该知道,目标文件一般都会生成两个文件,一个是以.jar
的包,一个是.jar.original
文件。那么使用SpringBoot
会打出两个包,而.jar.original
的作用是什么呢?还有就是java -jar
是如何将一个SpringBoot
项目启动,之间都进行了那些的操作?
其实.jar.original
是maven
在SpringBoot
重新打包之前的原始jar
包,内部只包含了项目的用户类,不包含其他的依赖jar
包,生成之后,SpringBoot
重新打包之后,最后生成.jar
包,内部包含了原始jar
包以及其他的引用依赖。以下提及的jar
包都是SpringBoot
二次加工打的包。
[TOC]
在java
的异常体系中Exception
异常有两个分支,一个是运行时异常RuntimeException
,一个是编译时异常,在Exception
下的所有非RuntimeException
异常,比如IOException
、SQLException
等;所有的运行时异常不捕获,编译时异常是一定要捕获,否则编译会报错。@SneakyThrows
就是利用了这一机制,将当前方法抛出的异常,包装成RuntimeException
,骗过编译器,使得调用点可以不用显示处理异常信息。