日常踩坑记录-汇总版
開發踩坑記錄,不定時更新
心得
- RTFM
- 嚴謹的去思考問題,處理問題
- 嚴格要求自己的代碼編寫習慣與風格
- 注意 單詞拼寫
20200207 mybatis plus 自帶insert插入異常 sql injection violation
解決方法:
使用逆向工程腳本時,生成的映射實體類在下面的注解會多table:
刪除即可
@TableName(“table:ts_app_oracle_apply”)
20200209 數據庫字段自動更新生成問題
異常描述:更新數據時,個別時間字段沒有進行更新,但是更新操作執行完成后,不該被更新的字段更新了
解決方法: 數據庫中,設計表,修改所有時間字段,根據當前時間戳更新,關閉該選項
20200210 中文亂碼問題
詳細信息:java后臺使用content-disposition屬性返回中文文件名時,出現編碼問題 urlencode編碼,需要前端解碼
access-control-allow-credentials: true access-control-allow-headers: Origin,X-Requested-With,accept,content-type access-control-allow-methods: OPTIONS,GET,POST,DELETE,PUT access-control-allow-origin: * content-disposition: attachment;fileName=%E5%A4%A9%E5%B1%B1%E5%B9%B3%E5%8F%B0%E7%94%A8%E6%88%B7%E7%94%9F%E4%BA%A7%E7%8E%AF%E5%A2%83%E8%B5%84%E6%BA%90%E7%94%B3%E8%AF%B7%E5%AE%89%E5%85%A8%E8%B4%A3%E4%BB%BB%E6%89%BF%E8%AF%BA%E4%B9%A6.docx content-type: application/force-download date: Mon, 10 Feb 2020 03:11:46 GMT transfer-encoding: chunked20200210 指定配置文件啟動
指定配置文件啟動命令失效,與啟動腳本與jar包同級目錄下,建立config文件夾,存放配置文件在其中,
即可指定外部配置文件啟動
20200216 文件刪除失敗
原因:沒有關閉對應輸入流
20200218 excel文件導入,將數據返回時出現空指針異常
經檢查,發現是兩張表excel中,某個字段名不一致導致
20200224 應用上線前端按鈕無法顯示
原因:在后臺的邏邏輯判斷時,只考慮了應用申請記錄不為空的前提,當應用為空的時候
控制按鈕的值就無法賦值,導致了前端控制按鈕的值為null
解決:修改判斷邏輯
20200224 nginx代理靜態資源問題
原因:在nginx代理時,需要用到靜態資源,靜態資源的目錄是從根目錄也是就是“/”開始的
n那么,在配置代理時,location后就不能帶有前綴或者后綴,只能以“/”開始的
當然也不是絕對,要考慮實際的靜態資源的狀態,去配置代理
20200224 nginx代理cas登錄問題
現象: 在使用nginx代理時,發現登錄的cas模塊會跳到代理機ip+端口的地址,不會跳到代理地址
原因: 前端代碼在寫登錄時,直接使用本地地址作為登錄地址,所有要想到正確的登錄地址,需要進行代理,才可以
20200225 文件上傳出錯
原因:文件上傳直接報錯,其實文件是上傳成功的,但是由于數據庫的某個字段不能為空,導致程序異常
返回錯誤碼,直接顯示文件上傳失敗
20200303 數據庫連接異常
要注意部署數據庫的環境與服務環境是否相同
20200314 接口請求異常
測試環境接口可以正常請求,但是正式環境無法請求,原因是正式環境無法直接請求正式環境對應接口,加了
20200316 ftp連接關閉
查看代碼時,突然發現ftp連接后沒有關閉,雖然ftp會自動關閉,但是連接過多時不關閉會對資源產生影響
20200317 無法刪除壓縮包文件
沒有關閉壓縮包文件對應的流
20200318 調用webservice接口失敗
沒有對接口地址
20200320 數據庫連接異常
忘記配置端口
20200320 文件夾創建解析異常
linux中的文件符為/,windows中的文件符為\,要注意區分
20200324 h2數據庫查詢異常
在使用輕量數據庫h2時,發現插入數據正常,但是查詢數據會報錯,會將插入的string字符串,強制轉換為int類型
檢查后發現,h2數據表的字段順序與實體類中的字段順序必選保持一致,否則會出錯
20200408 postwoman請求異常
使用postwoman時,接口無法正常請求測試,但通過swagger可以正常測試使用
定位后發現postwoman是使用XMLRequest發送請求,需要在后臺代碼中設置跨越處理
20200420 ftp文件導出異常
用戶上傳文件后無法導出下載的問題,檢查后發現代碼沒有判斷非空選項值,且ftp目錄權限存在異常,已經修復
20200421 redis數據獲取異常
redis數據庫中有對應的值,但是在代碼中無法獲取,調試后發現是序列化原因,代碼發送取值請求時,key的序列化與redis的序列化
不一致,所以獲取值失敗
20200421 控制臺日志打印異常
pom依賴存在沖突
20200421 mongoDB配置異常
在項目中沒有使用到mongoDB的任何依賴,但是運行時拋出了沒有配置mongoDB的異常
原因是在項目中使用了jmeter的依賴包,而jimter依賴包會使用MongoDB的依賴
maven在解決依賴時,會自動解決傳遞依賴,所以會自動引入mongodb的依賴,導致運行異常
只需要在啟動類中添加排除注釋即可
也可以在.iml文件中,搜索MongoDB的依賴,刪除即可
20200422 mybatis pluse 映射類構造異常
在mybatis plus的映射構造類中,使用了lamlok時,會自動建立無參構造
但是如果在構造類中手動建立了構造函數,那么mybatis在執行自帶查詢時,結果返回會自動使用建好的構造函數
會導致返回值無法返回的異常
20200422 json數據二次轉義問題
解決辦法就是,只轉一次。轉兩次就會出現這個情況,你可以把之前轉的json轉成map
20200509 jmeter使用java調用接口參數傳遞異常
場景
再使用java代碼調用jmeter的接口去發送post請求時,發現json字符串會被轉義
即雙引號,大括號之類的特殊符號會被轉義
涉及到的類為 HTTPSamplerProxy類與SampleResult類
HTTPSamplerProxy類設置請求參數,接口地址端口請求頭等信息
SampleResult類用來發送請求,并接收返回結果
但是在HTTPSamplerProxy參數傳遞的過程中并為發現字符轉義
在SampleResult發送請求時,json字符串被轉義,涉及方法為queryString方法
解決方法:
經調試發現,參數轉義步驟,檢查為什么會執行轉義
可能性猜測為.
HTTPSamplerProxy添加請求參數時,使用的形式為key:value形式,當請求參數也為鍵值對形式時
不論是post還是get,參數都會被拼接到url接口地址的后面,所以再使用SampleResult發送請求時
url中的特殊符號會全部被轉義
所以當參數為json字符串類型,且位于body時,不用添加參數的key,直接將值添加到HTTPSamplerProxy實體中即可
疑問點
1:參數位于query時,且參數為json字符串時,如何避免轉義?
此時必須轉義,否則報錯,目前只發現可以手動轉義
20200518 服務啟動正常,但是接口調用時拋出類找不到的異常
代碼無異常,配置文件無異常。
接口請求就異常
swagger-ui無法訪問
本地啟動服務無異常
經檢查:發現啟動項目的用戶權限異常
設計啟動用戶為adcloud
實際啟動用戶為root
使用自動化發布工具部署發布時,使用的是adcloud用戶
導致權限不夠,無法讀取依賴包,拋出類加載異常
20200521 Apache錯誤:[error] (OS 10038)在一個非套接字上嘗試了一個操作
解決辦法一:
可能是安裝了某些程序修改了Winsock,使用netsh winsock reset 命令修復Winsock重啟計算機即可!
解決辦法二:
在httpd.conf文件中添加 Win32DisableAcceptEx 標記,如下:
< IfModule mpm_winnt.c>
ThreadsPerChild 1000
MaxRequestsPerChild 10000
Win32DisableAcceptEx
</IfModule>
解決辦法三:
1、網上鄰居-;本地連接-;屬性-;internet協議(TCP/IP)-;屬性-;高級 -;wins標簽-;去掉啟用LMhosts查詢前的勾.
2、控制面版-;windows防火墻-;高級標簽-;本地連接設置-;服務的標簽里勾選安全Web服務器(HTTPS)。
3、然后重啟Apache
20200522 添加eureka-server服務異常
springcloud更新換代比較快,可能1.5可以使用,到了2.0就不用了。所以做項目或者練習時要看清自己使用的版本。
1.5版本使用spring-cloud-starter-eureka-server還是沒問題的。
2.0以上建議使用 spring-cloud-starter-netflix-eureka-server。
20200522 spring cloud 項目eureka client端啟動異常 Completed shut down of DiscoveryClient
添加spring boot web依賴后解決
20200522 @Autowired注解與@Resource注解的區別
:@Autowired只按照byType 注入;@Resource默認按byName自動注入,也提供按照byType 注入;
20200522 Eureka異常 EMERGENCY! EUREKA MAY BE。。
警告!Eureka可能存在維護了錯誤的實例列表(當它們沒有啟動的時候,Eureka卻把它當成啟動的了)
;Renews值小于Threshold值,因此剩下未過期的都是安全的。
原因:
這個是Eureka的自我保護機制。Eureka Server在運行期間,
會統計心跳失敗的比例在15分鐘之內是否低于85%,如果出現低于的情況(在單機調試的時候很容易滿足,
實際在生產環境上通常是由于網絡不穩定導致),Eureka Server會將當前的實例注冊信息保護起來,同時提示這個警告。
解決方案
1、在生產上可以開自注冊,部署兩個server
2、在本機器上測試的時候,可以把比值調低,比如0.49
3、或者簡單粗暴把自我保護模式關閉
20200602 Long類型異常
再生成六位驗證碼時,此處的驗證碼類型為long類型,不是String類型
發現會有小概率產生的驗證碼位數不對,由六位變為五位,且數值也與六位的數值不一樣
類舉排查后發現:
long類型的數據,以0開頭時,會出現位數變化,即下邊的情況
Long errNum = 012345L;
此時 errNum的值為10024
原因是在Java語言中
數值類型的數據:
0開頭表示八進制
0x開頭為十六進制
20200605 mybatis插入數據異常
表中字段為int,自增
實體類設置為了uuid導致異常
且數據表中字段對應差一個分隔符
20200620配置文件路徑異常
再使用方法時,.class.getClassLoader().getResource(“jmeter.properties”).getPath();
獲取到的配置文件路徑為全路徑,即絕對路徑
不是相對路徑
打包為jar包時,獲取的路徑為jar包路徑,上述方法獲取到的路徑,無法直接獲取到配置文件
導致程序異常。
20200703 線程對象問題
線程池里用傳遞的方法,不會導致新建對象,占用內存
用new的方式才會有很多 線程里面傳進去的應該是同一個實例
20200703 try,catch,finally
當三者配合使用時,及時try中進行了return,finally中的語句還是會執行
20200708 mysql插入異常
字段不能使用mysql中的保留字段,如function,delete等關鍵字
20200709 mybatis plus 注解自定義sql時,函數返回值盡量使用包裝類
20200717 mybatis plus查詢異常
實體類若自定義構造后,沒有生成空參構造,查詢字段會出現異常,導致無法將值賦予對應字段
20200727 idea全局搜索異常
快捷鍵 :Ctrl+Shift+F 步驟:設置 -->時間和語言–左側的語言–>點擊語言模塊下的"中文(中華人民共和國)"
–>點擊“選項”–>點擊鍵盤模塊下的“微軟拼音”–>選項–>點擊“按鍵”–>最下面的“熱鍵”–>簡體/繁體中文輸入切換
20200805 mybatis plus IPage分頁異常
使用IPage方法進行分頁查詢時,必須要將IPage參數放到自定義方法的第一個參數位置
否則會報異常,select one but found many;
20200805 elasticSearch無法使用root用戶啟動
20200805 mybatis plus 查詢異常
在mybatis mapper接口類中,方法不能重載
/尚未解決/
20200811 elasticSearch建索引-表異常
使用自定義json字符串,可以成功建表
使用hashMap轉成的json字符串,無法建表,
原因不明:
1:猜測hashmap無序,導致字段順序異常?
20200902 mybatis plus拼接sql異常
字段為空時,使用mybatis plus自帶的.eq()方法查詢時,
會變成查詢全部
20200831
1、spring boot切面aop使用多個 websocket會二次發送
2:linux中特殊字符^M,是應用windows下的回車
20200902 h2數據庫初始化異常
在spring boot中,使用h2本地數據庫+mysql數據庫配置倆個數據源時
遇到了h2數據表初始化異常,無法建立h2數據表
且建表語句無異常,配置文件無異常
經排查發現:
配置yml文件中,自定義多個數據源,h2無法識別
只能在.properties文件中,優先使用spring.datasource.driver-class-name的方式配置h2
然后再去yml文件中配置數據源,這樣h2數據源就會先初始化,不會導致建表語句無法執行
20200909 mybatis分頁沒有生效
使用mybatis中自帶分頁,并配置了分頁攔截
/** * mybatis-plus分頁插件<br> * 文檔:http://mp.baomidou.com<br> * 需要注意的是Page參數需要放在參數列表的第一個 */ @Bean public PaginationInterceptor paginationInterceptor() {return new PaginationInterceptor(); } 但是實際使用中,卻沒有生效,需要在數據源配置類中加入以下代碼 ``@Bean(name = "viewSqlSessionFactory") public SqlSessionFactory sqliteSqlSessionFactory(@Qualifier("viewDataSource") DataSource dataSource) throws Exception {MybatisSqlSessionFactoryBean sqlSessionFactory = new MybatisSqlSessionFactoryBean();MybatisConfiguration configuration = new MybatisConfiguration();configuration.addInterceptor(new PaginationInterceptor());sqlSessionFactory.setConfiguration(configuration);sqlSessionFactory.setDataSource(dataSource);return sqlSessionFactory.getObject(); }20200921 攔截器write.print返回字段異常
writer.print()方法不能直接打印錯誤對象,需要將對象轉化為JSON字符串,才可以返回,否則返回的為對象的內存地址。
20201027 spring boot注解@Autowired異常
現象:在開發過程中,突然方法中的String類型參數會被提示沒有String的bean,無法注入
后續發現是方法上誤加了@Autowired注解導致
20201027 spring cloud消息總線配置異常
場景,使用spring cloud的微服務網關功能注冊api時,發現注冊的api無法訪問,
數據庫中與gitlib中已經新增了新建的api的相關信息與路由
排查問題:數據庫與gitlib中都有信息,即新增操作已經成功
調用api時提示沒有該api路徑,網關服務與配置中心服務都運行正常
查看日志發現配置中心無法連接kafka服務,發現kafka服務崩潰,重啟kafka
依然無法解決;
查看配置文件,發現springcloud消息總線配置有問題,修改配置文件后重啟服務;
接口可以通過網關注冊并發現。
spring cloud消息總線中對應關系需注意,且需注意分組配置
20201027 green plum執行查詢sql異常
green plum sql語句與mysql在使用limit語句有些許不通
mysql : select from table limit begin,size
green plum : select from table limit size offset begin
調用post接口傳參異常
在調用別人開發post接口時發現,傳遞的參數放到body中,始終無法成功調用
會提示必選參數沒有傳遞,經溝通發現該接口雖為post類型,但參數接收并沒有采用body
接收參數,且在接口定義中使用@RequestParam接收參數,即只能將參數拼接到api接口地址后
才可成功調用api。
20201102 mybatis plus啟動異常
org.apache.ibatis.builder.BuilderException: Could not find value method on SQL annotation. Cause: org.apache.ibatis.builder.BuilderException: Parsing error was found in mapping #{}.
Check syntax #{property|(expression), var1=value1, var2=value2, …}
其實就是#{}里面沒有寫參數。。。
20201104 swagger-ui接口測試異常
使用spring boot集成swagger-ui進行接口測試時,發現新定義的接口無法在swagger-ui中進行測試
網頁控制臺js輸出找不到Content-Type,其他接口均使用正常
經過調試后發現,接口有一參數名為nodeType,該參數名在swagger-ui中被認為是保留字段,會被解析
導致接口無法正常調用,本次場景出現使用的swagger-ui的版本為2.6.1,在2.9.1中未遇到該問題
20201106 ftp文件下載異常
搭建好新的ftp服務器,
使用java進行ftp文件操作時,發現文件可以正常上傳,但是無法正常下載
每次下載
20201110 循環依賴
在spring boot框架中使用JDBCTemplate連接數據庫時,兩個DAO層存在了循環依賴,導致項目無法啟動
20201116 lua腳本問題
由于對lua腳本語言不是很熟悉,在nginx中使用lua腳本語言時,先使用了ngx.say的方法
然后進行業務邏輯處理, 導致后續業務邏輯無法執行,并且拋出異常,注釋ngx.say后,
該問題消失,原因可能是lua腳本的執行順序可能有比較嚴格的規定。
20201119 mysql連接問題
在使用omindb連接數據庫時,發現無法連接mysql8.0以上的數據庫
后續調整了mysql8.0的服務認證方式之后,可以連接
是因為新5.7與8.0的密碼加密方式不通
20201214 javamail smtp郵件發送異常
配置后無法正常發送,拋異常如下
JavaMail Exception: javax.net.ssl.SSLException:
Unrecognized SSL message, plaintext connection?
經搜索排查后,修改配置文件如下:
Properties props = new Properties();
props.setProperty(“mail.smtp.auth”, “true”);
props.setProperty(“mail.debug”, “true”);//啟用調試
props.setProperty(“mail.smtp.starttls.enable”, “true”);//添加這個
props.setProperty(“mail.smtp.ssl.enable”, “true”);
props.setProperty(“mail.imap.socketFactory.fallback”, “false”);
//不需要這個
//props.setProperty(“mail.imap.socketFactory.class”, “javax.net.ssl.SSLSocketFactory”);
原因尚不明確,需繼續排查,可能是如下原因
配置JavaMail的Properties時,不要指定“mail.smtp.socketFactory.class”,因為TLS使用的是普通的Socket。
然后指定屬性“mail.smtp.starttls.enable”為“true”。
20201214 nginx代理異常
再使用nginx二級目錄方式代理多個不同項目時,出現了靜態資源404的問題
經排查后發現是不通項目中文件資源路徑的問題
只能使用單端口代理單服務,不會出現該問題
20201214 jpa實體類參數問題
在使用jpa自定義sql查詢,映射實體類時,
當使用的語句是*時,要注意數據庫中的表字段與實體類中的字段順序是否一致
不一致會出現類型映射異常
20201216 maven打包異常
場景:更換maven配置文件后,使用maven打包項目,拋出異常,無法識別字段
但是項目中所有依賴均無報錯,清除緩存后也可本地正常啟動,只是打包無法打包
會提示一系列異常
排查:在處理該問題時,百度了很多方法,均未生效,將原有maven本地倉庫刪除,重新導入
依賴,也沒有任何作用,還原配置文件,也沒有作用,發現idea中配置好后maven,使用
右側工具欄的maven插件,可以編譯打包,但是命令行打包依舊失敗
在配置IDEA中maven路徑時,發現有IDEA自帶maven配置,問題可能出現在這里
嘗試解決: 打開IDEA默認maven配置路徑,發現在C盤用戶名下的.m2文件夾內,依舊有一個maven
配置文件,該配置文件中的配置為默認配置,可添加公網依賴,但是無法添加內網依賴,
修改該配置文件后,打包正常
可能原因: 命令行使用maven打包命令時,讀取配置文件的順序可能是這樣的:
maven安裝目錄配置-》系統自帶maven配置
即C盤下的配置文件,優先度可能高于安裝目錄的配置文件
這樣就導致在IDEA中配置好后maven,使用右側maven工具插件可以打包,因為IDEA會去讀
項目配置好的,而不去讀系統默認的
但在命令行中,會使用系統變量中的maven,讀取配置文件的順序也如上所述,所以導致無法打包
20201218 swagger-ui模型綁定異常
場景:在srping boot中使用swagger2.9.2時,接口參數定義類型為Double
在啟動時會報異常 databind error
解決:排查后發現是swagger2.9.2中自帶的swagger-models存在bug,需要單獨導入
導入方式如下,即可避免數值類型的參數綁定異常
20201218 maven打包的jar包運行正常,但是調用接口時,接口拋異常
場景:本地IDEA中運行,調用接口無異常,本地打包后,運行jar包,提示com.sun.**類不存在
排查:檢查jdk中的jre是否缺少該jar包,發現缺少,復制jdk中的tool.jar,重新打包,問題存在
有博客說是因為jdk1.8打包時會排除jdk1.5的com.sun的包,估修改pom配置文件如下
問題依舊存在,清除緩存,重新導入maven,清楚idea緩存,maven命令clean,update
均未生效,其他項目打包正常,唯獨該項目存在這個問題
解決:迫于無奈,只能使用本地依賴的方式,pom中指定tool.jar包,問題解決
可能原因:該項目使用了公司內部的frm框架,有部分frm框架jar包因業務不需要,去除后
出現了該問題,可能的原因去除的frm框架依賴包中有改tool.jar依賴,但是父依賴
依舊使用的frm依賴,即可能導致maven認為該項目不需要導入tool.jar,導致依賴丟失
本地運行時正常,運行時可能使用了本地jdk中的依賴,所以不會報錯,真正原因尚未定位。
20210301 maven打包問題
在IDEA中配置好maven后,依賴添加正常,項目運行正常,使用IDEA自帶打包插件也可以打包
但是在命令行中打包異常,無法打包,會提示很多error信息
經排查后發現,maven在命令行執行打包時,默認讀取的配置文件是settings.xml,而不是IDEA選擇的配置文件
修改settings.xml配置文件后,打包正常。
20210301 關于spring boot配置文件問題
spring boot打包的jar包啟動時,可以指定配置文件啟動,但是直接使用java -jar的方式使用外部配置文件時
指定的配置文件僅有application.properties 和xx.yml
20210301 ansible接口調用異常
在使用python調用ansible接口時,拋出了psutil依賴找不到的異常
排查發現,我安裝的ansible版本為2.9.16,默認支持的python2
環境里安裝的python是python3,pip3安裝時將依賴安裝到了python3
使用pip安裝后正常
20210316 greepplum數據庫查詢異常
在查詢greenplum數據庫時,遇到這樣一個問題,同一個表 select * from "TEST" 可以正常查詢,但是使用select * from test
就無法查詢,提示表不存在,表名是不區分大小寫的,查找資料后發現是建表語句的問題,在建表,表名增加了雙引號,導致查詢時必須使用和雙引號內部一樣的表名,如下圖論壇中的回復所示
20210325 代碼排序異常
排序代碼如下,查詢數據庫,然后格式化時間,根據時間進行排序
但是數據庫中的數據存在一樣的時間,就導致了排序異常,邏輯互相沖突,修改時間后再無異常出現
20210618 上述bug又出現了,排序異常,還是相同的問題,沒有考慮到相等的情況,每次修改數據庫的行為并不可取,開始排查,原因就是沒有考慮到倆個元素相同的問題,導致出現了異常,后來采用.compareTo()方法后,異常解決
看源碼后發現,源碼是多了一個等于情況的判斷,所以就沒有了異常
public static int compare(long x, long y) {return (x < y) ? -1 : ((x == y) ? 0 : 1); }20210412 mybatis刪除無效bug修復過程記錄
場景:webservice接口無法正常刪除不需要的用戶信息
排除過程
1:檢查業務邏輯,業務邏輯無異常
2:因存在計數器統計刪除計數,懷疑為多線程導致,加鎖后,依舊無法刪除
3:傳參問題,參數傳遞無異常
4:mybaits參數傳遞問題,排除,參數傳遞正常
5:逐句分析代碼作用與邏輯,發現漏洞,碼的智障,查詢出的id沒有賦值,淦
20210531 elasticSearch聚合索引查詢異常
在使用java代碼去查詢es時,若es的索引無數據,會報404異常
20210532 elasticSearch聚合索引查詢排序異常
場景:
在使用java代碼去查詢es時,對日期類型的字段進行排序,發發生了排序異常,無法排序
異常排查:
1、測試環境所使用es版本為7.2,修改該字段類型為keyword,可以排序
2、生產環境使用es版本為7.4,修改字段類型為keyword,無法排序,修改為類型為date,還是無法排序
解決方案:
1、在java查詢代碼中給字段加了.keyword,后綴后,可以進行排序查詢,但還不是真正的無法排序的原因
2:查es中的mapping配置后發現,定義的數據類型與模板不一致,經排查后發現,建立索引時使用了索引模板
3、索引模板中的index_patterns字段必須要和索引名稱一致,這樣建立的索引,才會使用該索引模板
即數據類型會使用模板里的數據類型
4、index_patterns是索引模式,指當創建以index*
開頭的索引時,使用該索引模板。
注意,在elasticsearch的6.x版本中,索引模板模式index_patterns取代原來的template。
索引模板信息可參考下面的文章
https://www.cnblogs.com/Neeo/articles/10869231.html
20210621 mybatis-plus多數據源配置異常
一直在使用的mybatis多數據源配置,遷移到新項目中,突然無法生效了,只會去查詢第二個數據源的數據庫,導致很多業務邏輯無法跑了,配置多數據源的方法比較簡單,直接兩個配置類進行配置,一個類配置一個數據源,指定一個數據源為主數據源
配置內容就更簡單了:主數據源
從數據源與主數據源內容基本一致,只需去除primary主機,并修改相應類名即可,但是,突然不生效了,就是無法查詢,找了很多方法,都不行,后來注意到,從數據源中少了句代碼,就是下面的這句:
因為少了這句代碼,spring在進行數據源初始化時,會把MybatisConfiguration這個配置文件初始化兩次,即從數據源配置會覆蓋主數據源配置,導致查詢異常。。。。
20210719 hashMap值修改未生效問題
hashMap存入時會先獲取key的hash值,
調用putVal方法,傳入key的hash值,key,value,
在該方法內部,會將傳入的hash值與已有hash值進行比較,
簡單看了下源碼,如簡單遍歷ArrayList<HashMap<String,String>>,
取出值并修改后插入新的ArrayList時,值修改可能會失效,個人理解可能存在差異
20210830 es數據插入異常
在往es里插入數據時,發現新接入的日志數據無法正常插入,且只有極少數的日志可以插入;
開始排查業務代碼,發現業務代碼并沒有問題,數據也可以正常讀出,但是無法插入;
將服務部署在服務器上時,也無法插入,且沒有任何異常信息,
于是開始對比新舊日志的區別,發現舊的日志數據中,有一個時間字段格式為 yyyy-MM-dd HH:mm:ss ,但是新日志的該字段數據格式為 yyyy-MM-dd HH:mm:ss.SSS,在建立es字段索引時,已經約束了該字段格式只能是yyyy-MM-dd HH:mm:ss,所以新日志數據無法插入。
20210923 spring boot中this方法調用導致aop失效
在使用AOP去對某些方法的返回值做處理時,發現一個問題,
使用this的方式去調用方法時,該方法的返回值不會被aop處理,
使用注解,代理生成自身對象后,再調用該方法,返回值被AOP處理;
至此,問題結束,但是沒有考慮為什么this調用的方式不會被AOP處理。
疑問:那么為什么this的aop會失效呢?
在看了一大堆大佬的文章后,發現最終結論,過程比較復雜,有興趣的可以去看一下
結論如下:
1、spring中,非動態代理生成的對象,不會被aop捕捉;
2、因為AOP動態代理的方法真實調用,會使用真實被代理對象實例進行方法調用,
故在實例方法中通過this獲取的都是被代理的真實對象的實例,而不是代理對象自身。
參考鏈接:
csdn: https://blog.csdn.net/qq_33589510/article/details/120387044
oschina: https://my.oschina.net/guangshan/blog/1807721
20211028 docker容器啟動即退出
若dockerfile中沒有CMD去執行運行命令
打出的鏡像包是直接運行不起來的
需用docker run 鏡像 啟動命令
這種方式進行容器啟動
若帶CMD,且CMD中的命令是一直與終端有交互的
打出的鏡像包可以直接啟動運行
此方式可以不啟動任務程序運行容器鏡像
docker run -d -p 9400:8100 鏡像名 bash -c 'while true; do echo week;sleep 60; done ’
20211028 python項目啟動
最近業務有涉及到python項目的啟停問題,總結如下
django項目運行方式
****此命令需要在django項目所在文件夾執行
nohup python3 manage.py runserver 0.0.0.0:8100flask項目啟動方式,此處使用了gunicorn
****此命令需要在flask項目所在文件夾執行
gunicorn app:app -c gunicorn.conf.pygunicorn.conf.py 配置文件 配置啟動進程數,端口
workers = 5 # 定義同時開啟的處理請求的進程數量 worker_class = "gevent" # 采用gevent庫,支持異步處理請求 bind = "0.0.0.0:8888" # 端口綁定項目停止腳本
此命令基本適用于單服務停止
kill -9 `lsof -i:啟動端口 | awk 'NR==2{print $2}'`20211229 mysql鎖庫
中午的時候,正式環境的數據庫突然被鎖庫,導致數據無法更新
開始進行排查,經資料搜索后,發現這些信息都存放于information_schema庫中
可以用下面三張表來查原因:
innodb_trx ## 當前運行的所有事務
innodb_locks ## 當前出現的鎖
innodb_lock_waits ## 鎖等待的對應關系
一張一張的去進行查詢,發現長時間處于RUNNING的任務時
在mysql命令行中 使用kill 任務id 即可殺死進程 解除表鎖,業務恢復正常
注:此處的id常為一串數字,可多次進行嘗試
產生鎖庫原因時某一sql運行時間過長,導致整個mysql庫被鎖,其他位于該服務庫的庫全被鎖
附上參考鏈接:
https://blog.csdn.net/weberhuangxingbo/article/details/88709556
20220106
樂觀鎖
額外增加字段,時間戳,版本號之類的標志,取數據時要帶著版本號
更新數據時,如果庫內版本號與傳入一致,則更新,否則不更新
悲觀鎖
查詢出要更新的數據,然后加for update ,這樣不提交,其他也無法修改
select…for update
20220109 nginx反向代理端口丟失
情況如下:
源主機Aip地址為:10.0.0.1:30001
代理B主機地址為: 120.0.0.1:30002
現在在B主機上使用nginx代理A主機的30001端口
直接訪問B主機的30002端口,可訪問到被代理的主機A的30001端口
但刷新瀏覽器之后,代理端口丟失了,就會跳向B主機的30001端口
導致訪問異常,代理配置均無問題,其他幾十臺代理端口均正常
唯有代理出來的A不正常,懷疑是代理端口丟失
只能保證源端口和代理端口一致
具體原因未明。
20220215 日志文件太大無法直接查看處理
今天遇到一個問題,需要看日志文件才能定位到具體原因
但是一看日志,有七八個G。。。。使用常用的tail -n 或-f無法定位到
但是整個文件又太大,操作起來很不方便,無法快速定位到異常
可以使用下面的組合命令,導出自己想要的大概日志范圍
查看日志文件有多少行:wc -l 文件名
將目標文件指定行數導入到新文件(p為參數,必選):sed -n “開始行,結束行p” 目標文件 > 輸出文件
20220222 記一次數據采集延時導致數據丟失問題問題
問題:
現有A,B,C,D四個平臺的api日志信息需要采集到es中;
入庫es后,定時任務采集統計調用信息,入庫mysql;
但運行一段時間后發現,mysql中統計的數據量遠遠小于es中存儲的數據條數;
且采集程序與統計程序均無異常日志;
經排查后發現是數據延時問題:
現象如下:
1、定時任務開始統計上面的數據,入庫mysql,并記錄最新入庫時間到redis,
2、作為下一次查詢es的開始時間范圍
3、當A,B,D的數據被查詢統計時,C的數據還沒有入庫,但入庫時間字段為14:03
4、統計程序記錄的最新入庫時間字段已經是14:04了,那么C的數據就會丟失;
5、長久以往,丟失數據會很可觀,
解決方式:
延遲統計時間(如果對實時性要求不高),
若定時任務五分鐘統計一次,如14:00開始查詢es統計入庫mysql,統計延時十分鐘;
查詢es的入庫時間范圍就是 13:45:00 ~ 13:50:00
這樣就可以盡可能避免延時區域過小導致的數據丟失問題
20220224 Jenkins接口調用
1、首先需要在用戶管理-》用戶設置-》生成api token;
2、然后系統管理-》全局安全配置-》關閉CSRF Protection選項(防止跨站點請求偽造)
3、然后去項目配置-》Build Triggers-》Trigger builds remotely (e.g., from scripts)-》填入token名稱
4、postman中調用方式為http://登錄用戶名:3中的apitoken@ip:port/需要調用的api接口
20220301 mybatis-plus重載異常
傻叉錯誤,好久沒遇到了,自己把自己坑死了
mapper中有如下倆方法
findAllByDate(Page page,Integer status)
findAllByDate(Page page,Integer status,String content)
調用的時候,沒有問題,點擊的時候也是會跳到相應的方法
但是,有且只有一個查詢方法生效,另一個改的天花亂墜都不會生效
目前發現最終執行的方法為第二個,即順序執行最后一個
20220303 Jenkins接口調用403異常
最近業務需要對Jenkins進行一些操作,JenkinsServer可以對Jenkins進行一些操作
但是功能不適用,只能自己進行接口封裝,去進行接口調用
但是有這樣一個現象,使用postman可以對目標接口調用,curl也可以對目標接口調用
一使用代碼去請求接口時,就是403,返回未認證,使用JenkinsServer,就正常,但是不滿足業務需求
那么為什么JenkinsServer包裝的就行,自己寫的就不行?
解決思路:
1、先查詢一下有沒有人遇到相似的問題,發現都是基于修改Jenkins配置,此時修改了也解決不了,換思路;
2、開始看JenkinsServer的認證過程,一層層往里走,發現了它的認證方式,也是http請求,奇了怪了,為啥我的就不行
一點點看源碼,終于理了出來,順序如下:
整了半天才發現,它進行了basic認證。。。。
知道怎么處理的就簡單了,把上邊的方法整出來,放到自己寫的請求代碼中,同時設置BasicHttpContext,就ok了,附代碼如下
20220422 maven打包異常
使用下面命令拋出異常:
mvn package -Dmaven.test.skip=true
/Unknown lifecycle phase “.test.skip=true”./
改為:
mvn clean install package ‘-Dmaven.test.skip=true’
/根本原因是使用了shell,而不是cmd去執行命令/
20220426 swagger集成異常
現象:swagger-ui.html無法訪問 拋靜態資源異常
v2/api可以返回json,但是json格式不正確,經過了轉義
處理:springboot 2.0后fastJson不生效,需增加以下代碼
但是之前并未遇到該現象,為什么產生該現象,暫時不明
20220426 ffmpeg截取3gp視頻異常
異常如下:寫的比較清楚,當前安裝的ffmpeg不支持3gp文件截取
需要為已安裝好的工具重新添加插件,或者直接更新,使用新版本
Automatic encoder selection failed for output stream #0:1.
Default encoder for format 3gp (codec amr_nb) is probably disabled. Please choose an encoder manually.
可以參考下面的方式處理:
https://blog.csdn.net/weixin_35649605/article/details/117344981
20220428可運行的jar包,和給別人用的依賴jar包,哪里不同?
1、pom中不同,可運行jar包會有build標簽,依賴jar包則沒有
20220505 nacos配置讀取異常
使用了nacos作為配置中心,IDEA中運行正常
打包后本地運行異常,項目啟動時沒有去讀取nacos中的配置
分析原因,nacos讀取配置文件默認使用UTF-8,通過cmd啟動項目,項目默認編碼格式為GBK,導致問題出現
解決辦法:添加啟動參數-Dfile.encoding=utf-8 ,則能正常啟動并讀取遠程配置
原文鏈接:https://blog.csdn.net/qq_43437874/article/details/108625707
20220520 k8s容器日志中文異常
打包好的jarbao,linux服務器上運行正常,日志沒有中文亂碼
打包為鏡像,部署至k8s時,日志輸出異常,中文顯示為問號
解決辦法:
打包鏡像時添加如下語句即可解決
ENV LANG C.UTF-8
20220525 quartz調度任務無法執行異常
啟動的時候,調度器得名字必須的和之前一樣
如果名字不一樣,那么之前建好的調度任務將無法執行
20220526 IDEA 命令行異常,系統cmd命令行可以正常執行
換了個電腦,重新裝了IDEA,運行mvn命令的時候發現,以前的命令都不能用了
找了很多方法,發現了這種方式
以前的命令
mvn package -Dmaven.test.skip=true
新的命令
mvn package ‘-Dmaven.test.skip=true’
雖然一時解決了,但后續其他的maven命令又不行了
今天突然發現:IDEA命令行的最前面有PS 前綴,
原來是IDEA用了PowerShell 作為命令行執行,整了個大無語
可用以下方式改為cmd
setting->Tools->Treminal->shell path 選擇cmd就行了
202200602 fastjson版本更新至1.2.83導致異常
老版本的fastjson出現反序列化bug,涉及項目需要升級版本
但是,升級完之后,調別人接口返回的json數據,不能解析了,會拋出json格式異常
回退老版本就又可以了
感覺像是將返回的json字符串自動轉義了一次,toString了一下,再轉就ok了
20200602 mysql時間類型數據,自動更新后,少8小時
數據庫連接也配置了時區
字段也配置了時間格式
攔截器什么的也都設置了時間格式
但是庫里更新的數據,總少8小時。。。
查來查去,發現那個字段是自動根據當前時間戳更新
也就是它的值和mysql本身的時間有關系,和服務的時間沒關系
查了下數據庫的時間,發現數據庫就少八小時。。。。
改改數據庫配置就可以了
20220610 ffmpeg命令行執行異常 No such filter
在使用ffmpeg對視頻進行多個水印添加和移除操作時,出現了以下情況
##命令如下
添加水印
ffmpeg -i input.mp4 -i img.png -i img2.png -filter_complex “overlay=20:80,overlay=200:80,overlay=150:150” out.mp4
移除水印
ffmpeg -i input.mp4 -vf “delogo=x=1:y=2:w=3:h=4:show=0,delogo=x=1:y=2:w=3:h=4:show=0” out.mp4
上面倆命令
Windows下命令行可以執行,沒有異常
linux下命令行執行,也沒有異常
但是使用以下Java代碼執行命令時,ffmpeg出現了filter發現不了的異常
Runtime rt = Runtime.getRuntime();
Process proc = rt.exec(cmd);
異常排查:
1、懷疑是代碼中符合編碼問題,代碼中輸出執行的命令,復制到命令行中,也可以正常執行
2、把雙引號換成單引號,也不行,命令行中直接無法執行
3、直接去掉雙引號和單引號,命令可以執行了。。。
其他ffmpeg命令均未出現類似的問題,Windows和linux編碼均正常,jar包服務編碼也正常
且改情況只有服務執行時才會出現,目前服務無法遠程調試,待后續排查具體原因
20220615 fastjson序列化異常
維護已有業務時,接口返回參數與定義參數名稱不一樣
定義為isSuccess,最后結果輸出時返回success
使用fastjson后,定義變量不能以is開頭,否則會序列化異常
會主動去掉is
可為對應is開頭的參數添加get、set方法,可以解決上面出現的問題
后續規范,盡量避免使用is開頭定義變量
20220616 windows查找占用端口
netstat -ano |findstr “port”
20220628 ffmepg把視頻截圖
ffmpeg -i 2.mp4 -s 1280x1024 -vf fps=fps=1/1 %09d.jpg
20220628 IDEA 遠程調試
首先啟動項目的時候,命令如下
java -Xdebug -Xrunjdwp:server=y,transport=dt_socket,address=9005,suspend=n -jar /usr/local/big-screen.jar
核心在這里,使用端口為9005
-Xdebug -Xrunjdwp:server=y,transport=dt_socket,address=9005
這樣配置好之后IDEA中添加remote配置,然后運行,調用部署在服務器上的接口
就可以遠程調試了
20220703 GPRC序列化異常
使用閹割版的jdk容器環境,會拋出類找不到的異常
原因是有些jdk環境會缺少jre,導致序列化的時候拋出類找不到的異常
20220703 maven使用技巧
1、為別人提供公共模塊的依賴的jar包中,pom中沒有packaging這個屬性
2、父工程中使用dependencyManagement,子工程中若不引入dependencyManagement的依賴
則不會對項目包大小產生影響
20220703 arthas 服務監控,鏈路追蹤
可以監控java項目的內存使用情況,GC情況
每一個方法的消耗時長等情況
20220704 @Async默認線程數不夠,導致業務無法正常執行
@Async異步方法默認使用Spring創建ThreadPoolTaskExecutor。
默認核心線程數:8,最大線程數:Integet.MAX_VALUE,
隊列使用LinkedBlockingQueue,
容量是:Integet.MAX_VALUE,
空閑線程保留時間:60s,
線程池拒絕策略:AbortPolicy
@Async默認線程數為8,且線程拒絕策略為等待
@async默認線程數為8,且線程拒絕策略為等待
20220707 @Transactional鎖(lock or dead lock)異常
場景 服務A 服務B 為同一個服務,使用同一個數據庫
服務A先運行,更新a表,服務B再運行更新a表
此時服務B會拋出異常,表a被鎖,服務B的業務無法正常進行,服務A正常
其他使用了事務的方法全部回滾,相應方法不能繼續執行
根本原因是mysql在Update帶有子查詢的時候,子查詢的表會鎖住,導致該表無法使用
20220707 @Transactional事務傳播級別
若某一個類上使用了@Transactional事務注解,那么該類下的所有方法默認全部使用事務
spring 的事務傳播級別默認為require,即若使用了事務注解,那么子方法均會使用事務
若該類的某個方法不想使用事務,修改事務傳播級別為Propagation.NOT_SUPPORTED(不支持事務)即可
是有七種傳播級別
20220707 FastJson轉換list時,轉換的json出現$ref引用異常
場景,先new倆個ArrayList(),a,b
然后循環a,把a中的實例類添加到b中,再使用fastjson把b轉為json
異常就會出現
因為fastjson默認開啟引用檢測將相同的對象寫成引用的形式,引用是通過"$ref"來表示的
上面的場景就是重復引用了,循環引用也會產生這種情況
重復引用的解決方法;
1.單個關閉 JSON.toJSONString(object, SerializerFeature.DisableCircularReferenceDetect);
2.全局配置關閉 JSON.DEFAULT_GENERATE_FEATURE |= SerializerFeature.DisableCircularReferenceDetect.getMask();
循環引用的解決方法:
1.如果你前端用不到這個屬性在該屬性的get方法上加上注解@JSONField(serialize=false),
2.這樣該屬性就不會被序列化出來,這個也可以解決重復引用
3.修改表結構,出現循環引用了就是一個很失敗的結構了,不然準備迎接StackOverflowError異常
20220715 舊代碼if(){} else if(){} 坑
原有業務邏輯大概是這樣,猛一看上去,邏輯好像沒啥問題,
但仔細看就會發現,他想執行完if里面的東西,若為fals的時候,再去執行else if里的東西,不滿足再去執行
else的東西。。。。。直接整麻了
若使用這個邏輯去跑,最終結果是這樣的
20220714 redis過期時間設置異常 ERR invalid expire time in setex
該異常為更新redis值時,同時獲取到相應key的過期時間,更新時也更新過期時間
但是當過期時間為0或者小于0時就會出現該異常ERR invalid expire time in sete
20220715 docker 容器網絡ip分配沖突導致無法調用指定服務器接口
問題如下:
在一次常規的docker服務部署時,之前突然可以調用的接口無法調用了
本地調用也沒有任何異常,服務器上卻提示網絡不可搭,找不到該路由
開始排查,排查過程如下
1、 先與運維溝通,是否有動過網絡,溝通后
溝通后后發現該服務器網絡與目標口服務器網絡沒有做任何改動
即不可能是服務器之間的網絡問題
2、然后開始排查docker容器的網絡分配,突然發現有一個容器的ip是 192.168.0.1
然而服務需要調用的接口地址為 192.168.0.32
而在調用接口的時候,先去查了docker的服務路由,然后走服務器的路由
這就導致容器里的服務先找到了docker的路由,沒有去走服務器的路由
然后就無法調用接口了。。。
解決
查看索引容器分配的ip
docker inspect --format='{{.Name}} - {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $(docker ps -aq)查看某一個容器的具體分配信息
docker inspect 容器id關閉對應docker容器
相應docker的yml文件中加入如下內容,重啟即可解決
20220801 spring事務傳播導致業務邏輯無法執行
方法A中使用了事務,去做數據庫刪除操作
方法B需要查詢方法A刪除的數據,然后做后續操作
方法A執行完刪除后調用方法B,事務未提交,方法B也在事務中
查詢不到刪除的數據,導致了方法B的業務邏輯出現問題
此處需要修改事務傳播級別,方法B中不使用事務
1、propagation-requierd:如果當前沒有事務,就新建一個事務,如果已存在一個事務中,則加入到這個事務中,這個是默認選項。
2、propagation-supports:如果當前有事務,則支持當前事務,如果當前沒有事務,就以非事務方法執行。
3、propagation-mandatory:如果當前有事務,則使用當前的事務,如果沒有當前事務,就拋出異常。
4、propagation-required_new:無論當前有沒有事務,都要新建事務,如果當前存在事務,把當前事務掛起。
5、propagation-not_supported:以非事務方式執行操作,如果當前存在事務,就把當前事務掛起。
6、propagation-never:以非事務方式執行操作,如果當前事務存在則拋出異常。
7、propagation-nested:如果當前存在事務,則作為子事務在嵌套事務內執行。如果當前沒有事務,則執行與propagation_required類似的操作
20220802 float類型取整異常
如下代碼-0.5f向上取整是-0.0,不是0
向下取整,為-1.0
20220802 使用Java代碼在windows10中調用exe可執行文件異常
場景如下
cmd命令行執行exe文件時,exe文件可正常執行
將相同語句使用Java代碼執行時,會拋出exe需要文件無法找到的異常
原因
是因為使用java執行cmd命令時,執行命令的目錄會默認為當前java程序執行目錄
而不是exe文件所在目錄
可以理解為在當前程序目錄下面,執行了exe,導致exe找不到需要的文件
這就需要執行cmd命令的時候,指定cmd命令在哪里執行
參考代碼如下
/*** @param exePath exe文件路徑* @param sampleFilePath exe文件所在目錄*/private void excuteExe(String exePath,String sampleFilePath) {try {//調用exeRuntime runtime = Runtime.getRuntime();Process process = runtime.exec("cmd /c " + exePath + "", null, new File(sampleFilePath));BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(process.getInputStream(), "UTF-8"));//讀取執行結果String line;while ((line = bufferedReader.readLine()) != null) {log.info("----開始執行exe;line={}", line);}}catch (Exception e){}}20220803 字符串操作技巧
String,StringBuffer,StringBuilder 進行大量字符串修改時
StringBuffer,StringBuilder要優于String
50w的字符串拼接操作,String需要1分30s
StringBuffer,StringBuilder只需要幾十毫秒
原因就是每次對String字符串就行修改時,都是新建一個字符串,50w拼接
相當于new了50w次(不是很準確,大概就是這個意思,因為不一定new50w次,字符串也有緩存)
20220804 阿里云oss java sdk下載文件異常,提示NoSuchBucket
bucketName為test
文件目錄為tmp/20220804/test.zip
下載文件時,拋出異常NoSuchBucket,tmp
但在請求oss時,設置的bucketName為test,也就是說在發生請求時
阿里云oss提供的sdk把tmp當做了bucketName
目前使用的是sdk版本是2.2.3
更新版本為3.15.0后問題修復
20220191 logback配置不生效-覆蓋問題排查 耗時3天
1、問題描述
項目提供了統一的logback日志配置模塊,其他項目輸出日志時都需要依賴該模塊
但目前有這樣一個現象,有多個子項目歸屬同一個父項目,父項目依賴了改日志配置模塊
但是子項目在運行時,有些子項目輸出的日志符合依賴的日志模塊,有些子項目輸出的日志模塊不符合
2、問題排查
1:檢查日志不生效的子模塊,是否存在依其他模塊依賴logback,導致覆蓋了獨立日志模塊的配置
排查后,沒有發現logback.xml相關的配置
2:是否沒有讀取到獨立日志模塊的配置文件,使用配置文件配置logback路徑后,依然不生效
3:嘗試網上提供的解決方法,均無法解決,重新整理思路,觀察日志問題
此時發現一個現象,在IDEA中,項目啟動的前半程時,日志中的INFO,ERROR在控制臺是沒有顏色的
在后半程時,輸出的日志突然開始有了顏色,并開始有顏色的上一行日志中,拋出了如下異常
No context given for c.q.l.core.rolling.SizeAndTimeBasedRollingPolicy
但是在獨立的日志模塊中,該配置是配置了的,就不應該拋出該異常
拋出了,即說明沒有去走項目中的配置,走了其他地方的配置
且其他地方的配置級別,要遠遠高于自定義的配置
給人的感覺像是項目啟動后,才去加載的日志配置
3、問題解決
順著上面2.3中的思路,先去找出spring boot加載日志模塊的代碼,
參考了下面這篇博客
https://blog.csdn.net/weixin_44646065/article/details/125314449
通過這個博客,在源碼中找到了加載日志模塊的方法,然后開始debug
在一步步的debug中,突然發現在走完spring boot的log加載后
走到了一個自定義logback配置類中
該類中用@PostConstruct注解,在項目啟動后,使用類的方式,初始化了logback的配置
即沒有走logback.xml配置,而是通過java類的方式,去初始化logback配置
至此,問題已經定位到,去除改自定義配置類后,日志輸出正常
20221008 feign請求返回值反序列異常-LocalDateTime類型無法轉換導致
1、問題描述
在開發Feign接口時,結果返回的最后一步時,rpc接口的提供方突然拋出一個異常
無法將定義好的包裝類轉化,即序列化異常,其他feing接口均正常
2、問題排查
1:先排除rpc接口的實現業務邏輯,檢查是包裝類型依賴是否引入錯誤
檢查后沒有
2:再排除業務邏輯,檢查是否有數據返回,檢查后數據均正常
3:檢查包裝類型中的變量,此時看到了LocalDateTime類型
但此時沒有發現是該原因
3、嘗試解決
1:此時自定義的包裝類型不行,那么之間返回Object是否可以?
之間返回了Object,異常消失了,可以正常調用
但是接收起來需要在調用方進行json對象解析,還是比較麻煩
2:那為什么自定義包裝類型可以,自定義的類型不行
返回結果的時候一步步的debug,發現當自定義變量類型LocalDateTime時
會拋出該異常,也就是當前無法序列化LocalDateTime,導致了異常發生
有倆種方法,都需要引入下面的依賴
20221101 this事務或異步失效解決辦法
1:自己依賴自己即在service類里使用自己 2:在自身方法里使用代理獲取到自己的對象然后使用異步或事務方法 3:失效原因好像是事務或異步都是通過代理實現,之間使用this是使用的自己當前的對象,沒有使用代理獲取到對象,也就失效了,大概是這個意思,詳細的原因可以自行查詢。 @Service public class TestService{@Autowiredprivate ApplicationContext context;@Autowired@Lazyprivate TestService testService; public void testFunction(){//方法1testService.testAsync();//方法2TestService proxySelf = context.getBean(TestService.class);proxySelf.testAsync();}@Asyncpublic void testAsync(){//todo 業務邏輯} }20221114 Feign內部服務接口調用時請求頭問題
1、問題場景:
場景如下:前端通過瀏覽器或APP調用服務A接口,服務A內部Feign調用服務B接口
此時服務A可正常使用請求頭參數,服務B也需要使用這些請求頭參數,
獲取時無法獲取
2、問題排查與解決:
代碼無異常拋出,只是獲取不到對應請求頭的值,那么在服務B中進行日志打印,打印請求頭
發現沒有該值,服務A中是有該值的,那么請求頭默認是不會傳遞的嗎?
后經查詢后發現,默認配置下,請求頭的確不會傳遞,若在Feign調用過程中進行請求頭的傳遞
有倆種方法:
1:增加feign配置,可以傳遞請求頭;
2:在最外層捕捉到需要用的請求頭,將其添加為feign接口參數
推薦使用第二種,避免請求頭傳遞帶來的安全風險
20221114 spring boot打包部署后,無法正常獲取resource中的靜態文件
1、問題場景:
在開發excel模板下載功能時,需要將指定模板返回給前端,不能動態生成,
便將其放入resource目錄下,在本地測試時沒有問題,但部署在容器中后,便無法正常獲取文件,
提示獲取文件異常
2、問題排查:
第一次遇到該問題,在本地環境中、Linux服務器中部署服務均未遇到該問題,但是在容器化部署時,遇到了該問題
經查詢后發現是資源文件獲取的方式有問題
剛開始使用的獲取方式如下
ResourceUtils.getFile(ResourceUtils.CLASSPATH_URL_PREFIX + filename).toString();
修改為如下方式即可正常獲取
InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream(“template/filename”);
3、問題原因:
沒打包之前,文件是真實存在與文件系統中的,
一旦打成jar包后,使用File是訪問不到資源的內容的,推薦使用getInputStream()的方法
20221207 feign內部Get接口請求參數過長導致400異常
1、問題場景
業務正常的feign接口調用,突然拋出400異常,且對應服務上下游業務都沒有拋出異常
且只對某條數據出現400,其他數據均正常
2、問題排查
1、懷疑參數沒有判空導致,于是加了判空邏輯和日志,打印請求參數
發現請求參數并不為空,只是很多,那么就是定義的內部接口有問題
2、看到定義的feign接口請求類型為GET,復制出請求參數后,發現請求參數過長
接口請求改為post,參數接收使用請求體接收后,該問題消失
3、問題原因:
feign內部調用其實也是轉為http調用,自然會存在http接口調用類似的問題;
此處就是get請求中,url最大長度超出限制,導致了無法正常傳入參數,接收方沒有接到參數
拋出400,參數沒有傳遞的異常
20221207 由于業務采用純數值id過長,導致解析為Long類型是超出Long類型最大值
用戶分為兩部分,A,B
倆用戶分表存,一個唯一主鍵為Long類型
一個唯一主鍵為字符串類型,且長度很長,在業務邏輯中,倆種主鍵對應的業務含義一樣,
均為用戶唯一標志
在一張業務主表中,用戶標志字段會存在A、B倆種id值
這就導致查詢去A模塊查詢A用戶信息時,出現Long解析異常,因為B的長度太長了
此處應根據業務主表的類型,去分類用戶id查詢,避免出現該異常
20230105 通過網關調用服務接口,接口間歇性異常返回500
1、問題場景
通過網關調用某模塊接口時,接口偶現500異常,connection time out ,2、問題排查
1、網關與服務模塊為容器化部署,懷疑可能容器內網絡有問題,排查后網絡正常;
2、查看調用服務模塊日志,服務正常,且沒有異常日志輸出;
3、查看網關模塊,網關輸出日志如下:顯示服務網絡不可達;排查網關后發現網關nacos配置
可能有問題,修改部署后,問題依然存在;
4、nacos排查,查看相應模塊服務有沒有注冊到nacos,注冊狀態也正常;
于是在發生異常時,查看nacos服務狀態,nacos服務健康狀態為false,即服務不健康
但是查看相應服務模塊,服務模塊運行正常,且在幾分鐘后,nacos健康狀態自動恢復;
將nacos中對應服務下線后,發現又有服務注冊上來,但是這個服務只啟動了一個,
刪除該服務,重新注冊后,問題修復。
3、問題原因:
原因就是nacos中注冊的服務與實際服務不符,具體原因不明,猜測可能為nacos緩存問題,
下線的服務沒有全部刪除,導致新注冊的服務ip被覆蓋,忽隱忽現可能為nacos服務發現機制與緩存
相互覆蓋導致。
20230113 restTemplate調用接口數據返回缺少異常
1、問題場景
業務代碼中,通過restTemplate.getForEntity(url,Map.class)調用接口時,出現了以下情況;
返回的json對象的list中,全部只有一條數據,但是服務提供方響應數據的時候確認了每個list中
都有多條數據。
2、問題排查
1、剛開始懷疑服務提供方數據返回異常,于是查看服務提供方的接口響應日志,發現并沒有問題;
每個list中數據量均正常;
2、在服務調用方打印響應結果,發現打印出的結果中,list數據已經減少,那么問題即出現在服務調用方;
定位到問題出現位置,開始排查為什么缺少,debug時發現解析響應數據時,出現了數據丟失的問題;
3、問題原因
查了一些資料,大概是如下的問題:舉個個例子:是map中嵌入list,Map<String,Object>中Object一旦映射的是List,自動映射的返回數據只會返回List的最后一條數據,原因是map.put()的鍵相同,導致覆蓋。進而導致數據缺失。使用java自動映射的對象類型:Map.class List.class Object.class等,必須保證接口返回的數據類型是單一的某一種,(無論數量多少,只要種量為一即可),而不能是多種數據類型嵌套的復雜數據。一旦為復雜數據只能手動創建對應實體類。總的來說就是遠程接口返回的數據類型是使用了泛型,或者返回數據所使用的實體類中數據類型不唯一,那么restTemplate接收的時候也只能使用對應實體類,而不能讓java自己去映射。4、解決方案,目前有如下倆種:
1、配置restTemplate序列化配置,具體方案可以自行查詢;
2、通過restTemplate的exchange方法來解決:可以參考如下代碼:
5、參考鏈接:
https://www.bbsmax.com/A/1O5EY7PW57/
https://www.cnblogs.com/yzyBalance/p/13546552.html
https://blog.csdn.net/qq_37855749/article/details/117691268
20230129 xxljob日志拋出中文異常導致任務無法停止,一直重試
xxljob執行的時候拋出的異常日志包含中文字段
重新拉取解析重試的時候 無法解析成json
所以就一直出錯 一直重試
在這里插入圖片描述
20230207 skywalking agent引入后,項目啟動時Controller初始化異常
1、問題描述
- 項目引入skywalking agent后,部署服務時啟動失敗,拋如下異常
- 本地引入skywalking agent后,項目可正常啟動
- skywalking agent版本為8.9.0
1.1 異常日志核心內容為實例化bean失敗,缺少需要空參構造,但在本地引入agent后沒有出現該異常
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:1270)at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1164)at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:538)at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:498)at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:320)at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:318)at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199)at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:846)at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:863)at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:546)at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:142)at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:775)at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:397)at org.springframework.boot.SpringApplication.run(SpringApplication.java:316)at org.springframework.boot.SpringApplication.run(SpringApplication.java:1260)at org.springframework.boot.SpringApplication.run(SpringApplication.java:1248)1.2 controller代碼如下,此處采用了構造注入的方式實例化Service
2、問題排查
2.1 skywalking-agent版本與插件檢查
3、問題原因
20230214 @Aspect日志攔截器無法攔截api請求異常
1、問題場景:
在排查一次線上問題時,突然發現異常的接口(a)沒有輸出請求與響應日志,但是其他接口(b)請求響應日志正常輸出,
且這倆個接口在同一個controller中
2、問題排查
1、a、b兩接口在同一個controller中,那么先檢查@Aspect日志攔截器,看是否做了特殊處理,
排查后發現沒有特殊處理;
2、對比兩個接口,使用的注解、路徑、請求參數等信息,均無異常;
在反復對比的過程中,發現a接口沒有修飾符,而b接口有public修飾符;
a接口加上public修飾符后,日志攔截器正常工作;
3、問題原因
1、沒有加修飾符時,api提供類中的方法的作用域為default,其他包無法訪問;
也就導致了日志攔截類沒有訪問到該api,定義為public時,就可以攔截到了。
息空指針異常
1、問題場景:
正常業務中使用RequestContextHolder.getRequestAttributes()時可以獲取到請求頭中的一些用戶信息,
在一次接口優化時,需要優化響應時間,目前網關設置響應時間默認為2分鐘,但涉及要處理的數據量大時,
2分鐘不夠了,且直接返回了超時異常(實際業務正在處理中),導致用戶體驗很差,
于是將部分耗時業務使用異步的方式去處理(該業務為實際處理數據),先返回結果,提示處理中;
但是異步線程中使用了RequestContextHolder.getRequestAttributes()獲取時無法獲取用戶信息,就拋出了空指針異常
2、問題排查:
1、空指針異常較好排查,直接把報空的對象打印一下,發現通過RequestContextHolder.getRequestAttributes()獲取的對象就為空;
但是不是用異步注解時,程序無異常
3、問題原因
1、問題原因比較明顯,使用異步注解時,會開啟一個新線程去執行業務,新線程中沒有傳遞Request相關的信息;
那么在新線程中肯定無法獲取到相應的值使用如下方法可以解決:
1:將要獲取的對象作為值傳遞到異步方法與業務中,但不會從根本上解決問題;
2:在使用異步方法前的業務加上如下代碼:
RequestContextHolder.setRequestAttributes(RequestContextHolder.getRequestAttributes(), true);
通過該方法可以將主線程的上下文數據共享給子線程
NamedInheritableThreadLocal為可繼承線程,子線程會繼承改線程中的內容,當setRequestAttributes設置為true時
子線程就可以使用父線程中的RequestAttribute信息了。
20230407 記一次接口速度調優過程
1、問題場景:
有一個歷史綜合信息查詢接口,響應速度很慢,已經到了快10s才會響應,導致前端界面加載過慢,必須得優化。
2、問題排查與解決:
列表查詢的業務比較明確,即查詢一個主體的不同的附屬信息,需要查詢mongo、mysql以及rpc遠程接口調用,才能獲取到全部信息;分析業務代碼后,發現在查詢到基礎數據后,會進行for循環調用查詢mongo、mysql、以及調用遠程rpc接口,這都有可能降低響應速度;排查后大概以下業務可能會導致響應慢:1、循環調用rpc接口查詢了主體日志信息,且該rpc接口中查詢了mysql,然后累加獲取到mysql數據;2、循環查詢mongo,且使用了類似sql查詢,limit1的操作針對以上問題進行優化:1、rpc接口改為一次查詢多條數據,并在獲取結果時使用sql對數據進行聚合統計;此處修改后,響應速度平均在4s左右降了一大半;2、循環查詢mongo,且使用了類似sql查詢,limit1的操作,此處改為使用mongo聚合查詢,類似sql中的group by+sum此處修改后,速度優化了300ms左右,接口響應速度平均大概在3.7s左右目前根據業務分析不出來哪里還可能需要優化了,開始上科技:arthas```trace -E class_path method|method2|.... ```1、先直接用arthas的trace命令追了接口,發現追蹤到的一些方法耗時都很短,基本就是幾毫秒,不會影響速度;那么就是有方法沒有追到;2、仔細排查業務代碼,發現如果類的set方法中的入參是一個方法,那么這個方法就不會被追蹤到,這些比較隱蔽;花了點時間一個個都找了出來,然后再用trace進行追蹤,慢的方法一目了然。3、也是在for循環的時候進行查詢了mongo,查出每一個主體信息在該mongo中的全部數據,然后根據查出來的數據進行分類統計;這樣如果某一個主體在mongo中有大量數據時,就會非常耗時,數據量小的主體,響應速度就很快;總結
以上是生活随笔為你收集整理的日常踩坑记录-汇总版的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 弘辽科技:如何制定淘宝店铺推广计划?店铺
- 下一篇: 每个人的商学院--管理基础(第三章:管理