java子線(xiàn)程解決獲取主線(xiàn)程的request對(duì)象問(wèn)題
java子線(xiàn)程獲取主線(xiàn)程的request對(duì)象
問(wèn)題描述
業(yè)務(wù)系統(tǒng),多線(xiàn)程處理業(yè)務(wù)是提供性能方法之一,在使用中,我們會(huì)將某些數(shù)據(jù)存儲(chǔ)在request中,傳給后面的組件使用,不需要在方法中定義變量來(lái)傳遞,提高代碼的美觀可讀性,
我們使用request.setAttribute(“xxxx”, “xxxx”)方式傳遞參數(shù),后面的組件或方法使用如下代碼獲取參數(shù):
ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); HttpServletRequest request = servletRequestAttributes.getRequest(); Object param = request.getAttribute(“xxxx”);
在主線(xiàn)程下這么寫(xiě)是沒(méi)問(wèn)題的,但是子線(xiàn)程下request 對(duì)象是空的,子線(xiàn)程不共享主線(xiàn)程的request對(duì)象
解決辦法
在啟動(dòng)線(xiàn)程前,執(zhí)行以下代碼即可,子線(xiàn)程也可以共享主線(xiàn)程的request對(duì)象
ServletRequestAttributes sra = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); RequestContextHolder.setRequestAttributes(sra, true);
示例
多線(xiàn)程子線(xiàn)程獲取不到主線(xiàn)程的request
使用多線(xiàn)程時(shí)有時(shí)候會(huì)碰到子線(xiàn)程獲取不到主線(xiàn)程的request
原因是子線(xiàn)程還未執(zhí)行完成而主線(xiàn)程已經(jīng)執(zhí)行完畢則導(dǎo)致子線(xiàn)程獲取不到
我們只需要加上兩句代碼即可
// RequestAttributes對(duì)象設(shè)置為子線(xiàn)程共享 // 解決開(kāi)啟多線(xiàn)程時(shí)子線(xiàn)程獲取不到主線(xiàn)程的request ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); RequestContextHolder.setRequestAttributes(attributes, true);
我還遇到一個(gè)問(wèn)題則是即時(shí)按照上面設(shè)置共享,但是獲取不到主線(xiàn)程的header,目前使用了一個(gè)笨方法則是把主線(xiàn)程的header需要使用的參數(shù)在主線(xiàn)程內(nèi)拿出來(lái)定義一個(gè)變量提供給子線(xiàn)程使用。。。
mysql觸發(fā)器語(yǔ)法注意事項(xiàng)
注意點(diǎn):
1. 在if條件里的必須是變量(@xxx)
2. set分號(hào)結(jié)尾
3. end if注意分號(hào)結(jié)尾
4. 條件中執(zhí)行的sql語(yǔ)句注意分號(hào)結(jié)尾例子:Navicat 創(chuàng)建觸發(fā)器
BEGIN set @dataTime = date(new.dataTime); set @nowTime = date(now()); set @yearDT = year(new.dataTime); set @monthDT = month(new.dataTime); set @yearN = year(now()); set @monthN = month(now()); if @dataTime = @nowTime then insert into t_senor_data_day values(new.id,new.deviceId,new.senorId,new.tenantId,new.dataValue,new.dataTime,new.receiveTime,new.taskType,new.paramType,new.senorType); end if; if @yearDT = @yearN and @monthDT = @monthN then insert into t_senor_data_month values(new.id,new.deviceId,new.senorId,new.tenantId,new.dataValue,new.dataTime,new.receiveTime,new.taskType,new.paramType,new.senorType); end if; end
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java實(shí)現(xiàn)企業(yè)微信回調(diào)配置的詳細(xì)步驟與測(cè)試
這篇文章主要給大家介紹了關(guān)于Java實(shí)現(xiàn)企業(yè)微信回調(diào)配置的詳細(xì)步驟與測(cè)試,企業(yè)微信回調(diào)是指企業(yè)微信通過(guò)HTTP?POST請(qǐng)求將業(yè)務(wù)數(shù)據(jù)回調(diào)到指定的URL上,文中給出了詳細(xì)的代碼示例,需要的朋友可以參考下2023-09-09基于ThreadPoolTaskExecutor的使用說(shuō)明
這篇文章主要介紹了基于ThreadPoolTaskExecutor的使用說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11Java來(lái)實(shí)現(xiàn)文本轉(zhuǎn)圖片需求示例
本文主要介紹了Java來(lái)實(shí)現(xiàn)文本轉(zhuǎn)圖片需求示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2025-04-04Spring Cloud中Eureka開(kāi)啟密碼認(rèn)證的實(shí)例
這篇文章主要介紹了Spring Cloud中Eureka開(kāi)啟密碼認(rèn)證的實(shí)例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-05-05