91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

系統(tǒng)完成熱部署,并切換該接口的實(shí)現(xiàn)

Android編程精選 ? 來源:zhangzhiqiang_0912 ? 作者:Android編程精選 ? 2022-07-23 11:03 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

近期開發(fā)系統(tǒng)過程中遇到的一個(gè)需求,系統(tǒng)給定一個(gè)接口,用戶可以自定義開發(fā)該接口的實(shí)現(xiàn),并將實(shí)現(xiàn)打成jar包,上傳到系統(tǒng)中。系統(tǒng)完成熱部署,并切換該接口的實(shí)現(xiàn)。

定義簡單的接口

這里以一個(gè)簡單的計(jì)算器功能為例,接口定義比較簡單,直接上代碼。

publicinterfaceCalculator{
intcalculate(inta,intb);
intadd(inta,intb);
}

該接口的一個(gè)簡單的實(shí)現(xiàn)

考慮到用戶實(shí)現(xiàn)接口的兩種方式,使用spring上下文管理的方式,或者不依賴spring管理的方式,這里稱它們?yōu)樽⒔夥绞胶头瓷浞绞健?/span>calculate方法對(duì)應(yīng)注解方式,add方法對(duì)應(yīng)反射方式。計(jì)算器接口實(shí)現(xiàn)類的代碼如下:

@Service
publicclassCalculatorImplimplementsCalculator{
@Autowired
CalculatorCorecalculatorCore;
/**
*注解方式
*/
@Override
publicintcalculate(inta,intb){
intc=calculatorCore.add(a,b);
returnc;
}
/**
*反射方式
*/
@Override
publicintadd(inta,intb){
returnnewCalculatorCore().add(a,b);
}
}

這里注入CalculatorCore的目的是為了驗(yàn)證在注解模式下,系統(tǒng)可以完整的構(gòu)造出bean的依賴體系,并注冊(cè)到當(dāng)前spring容器中。CalculatorCore的代碼如下:

@Service
publicclassCalculatorCore{
publicintadd(inta,intb){
returna+b;
}
}

反射方式熱部署

用戶把jar包上傳到系統(tǒng)的指定目錄下,這里定義上傳jar文件路徑為jarAddress,jar的Url路徑為jarPath。

privatestaticStringjarAddress="E:/zzq/IDEA_WS/CalculatorTest/lib/Calculator.jar";
privatestaticStringjarPath="file:/"+jarAddress;

并且可以要求用戶填寫jar包中接口實(shí)現(xiàn)類的完整類名。接下來系統(tǒng)要把上傳的jar包加載到當(dāng)前線程的類加載器中,然后通過完整類名,加載得到該實(shí)現(xiàn)的Class對(duì)象。然后反射調(diào)用即可,完整代碼:

/**
*熱加載Calculator接口的實(shí)現(xiàn)反射方式
*/
publicstaticvoidhotDeployWithReflect()throwsException{
URLClassLoaderurlClassLoader=newURLClassLoader(newURL[]{newURL(jarPath)},Thread.currentThread().getContextClassLoader());
Classclazz=urlClassLoader.loadClass("com.nci.cetc15.calculator.impl.CalculatorImpl");
Calculatorcalculator=(Calculator)clazz.newInstance();
intresult=calculator.add(1,2);
System.out.println(result);
}

注解方式熱部署

如果用戶上傳的jar包含了spring的上下文,那么就需要掃描jar包里的所有需要注入spring容器的bean,注冊(cè)到當(dāng)前系統(tǒng)的spring容器中。其實(shí),這就是一個(gè)類的熱加載+動(dòng)態(tài)注冊(cè)的過程。

直接上代碼:

/**
*加入jar包后動(dòng)態(tài)注冊(cè)bean到spring容器,包括bean的依賴
*/
publicstaticvoidhotDeployWithSpring()throwsException{
SetclassNameSet=DeployUtils.readJarFile(jarAddress);
URLClassLoaderurlClassLoader=newURLClassLoader(newURL[]{newURL(jarPath)},Thread.currentThread().getContextClassLoader());
for(StringclassName:classNameSet){
Classclazz=urlClassLoader.loadClass(className);
if(DeployUtils.isSpringBeanClass(clazz)){
BeanDefinitionBuilderbeanDefinitionBuilder=BeanDefinitionBuilder.genericBeanDefinition(clazz);
defaultListableBeanFactory.registerBeanDefinition(DeployUtils.transformName(className),beanDefinitionBuilder.getBeanDefinition());
}
}
}

在這個(gè)過程中,將jar加載到當(dāng)前線程類加載器的過程和之前反射方式是一樣的。然后掃描jar包下所有的類文件,獲取到完整類名,并使用當(dāng)前線程類加載器加載出該類名對(duì)應(yīng)的class對(duì)象。判斷該class對(duì)象是否帶有spring的注解,如果包含,則將該對(duì)象注冊(cè)到系統(tǒng)的spring容器中。

DeployUtils包含讀取jar包所有類文件的方法、判斷class對(duì)象是否包含sping注解的方法、獲取注冊(cè)對(duì)象對(duì)象名的方法。代碼如下:

/**
*讀取jar包中所有類文件
*/
publicstaticSetreadJarFile(StringjarAddress)throwsIOException{
SetclassNameSet=newHashSet<>();
JarFilejarFile=newJarFile(jarAddress);
Enumerationentries=jarFile.entries();//遍歷整個(gè)jar文件
while(entries.hasMoreElements()){
JarEntryjarEntry=entries.nextElement();
Stringname=jarEntry.getName();
if(name.endsWith(".class")){
StringclassName=name.replace(".class","").replaceAll("/",".");
classNameSet.add(className);
}
}
returnclassNameSet;
}
/**
*方法描述判斷class對(duì)象是否帶有spring的注解
*/
publicstaticbooleanisSpringBeanClass(Classcla){
if(cla==null){
returnfalse;
}
//是否是接口
if(cla.isInterface()){
returnfalse;
}
//是否是抽象類
if(Modifier.isAbstract(cla.getModifiers())){
returnfalse;
}
if(cla.getAnnotation(Component.class)!=null){
returntrue;
}
if(cla.getAnnotation(Repository.class)!=null){
returntrue;
}
if(cla.getAnnotation(Service.class)!=null){
returntrue;
}
returnfalse;
}
/**
*類名首字母小寫作為spring容器beanMap的key
*/
publicstaticStringtransformName(StringclassName){
Stringtmpstr=className.substring(className.lastIndexOf(".")+1);
returntmpstr.substring(0,1).toLowerCase()+tmpstr.substring(1);
}

刪除jar時(shí),需要同時(shí)刪除spring容器中注冊(cè)的bean

在jar包切換或刪除時(shí),需要將之前注冊(cè)到spring容器的bean刪除。spring容器的bean的刪除操作和注冊(cè)操作是相逆的過程,這里要注意使用同一個(gè)spring上下文。

代碼如下:

/**
*刪除jar包時(shí)需要在spring容器刪除注入
*/
publicstaticvoiddelete()throwsException{
SetclassNameSet=DeployUtils.readJarFile(jarAddress);
URLClassLoaderurlClassLoader=newURLClassLoader(newURL[]{newURL(jarPath)},Thread.currentThread().getContextClassLoader());
for(StringclassName:classNameSet){
Classclazz=urlClassLoader.loadClass(className);
if(DeployUtils.isSpringBeanClass(clazz)){
defaultListableBeanFactory.removeBeanDefinition(DeployUtils.transformName(className));
}
}
}

測(cè)試

測(cè)試類手動(dòng)模擬用戶上傳jar的功能。測(cè)試函數(shù)寫了個(gè)死循環(huán),一開始沒有找到j(luò)ar會(huì)拋出異常,捕獲該異常并睡眠10秒。這時(shí)候可以把jar手動(dòng)放到指定的目錄下。

代碼如下:

ApplicationContextapplicationContext=newClassPathXmlApplicationContext("applicationContext.xml");
DefaultListableBeanFactorydefaultListableBeanFactory=(DefaultListableBeanFactory)applicationContext.getAutowireCapableBeanFactory();
while(true){
try{
hotDeployWithReflect();
//hotDeployWithSpring();
//delete();
}catch(Exceptione){
e.printStackTrace();
Thread.sleep(1000*10);
}
}

-End-

審核編輯 :李倩


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 接口
    +關(guān)注

    關(guān)注

    33

    文章

    9521

    瀏覽量

    157042
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4968

    瀏覽量

    73981

原文標(biāo)題:動(dòng)態(tài)上傳jar包熱部署實(shí)戰(zhàn)

文章出處:【微信號(hào):AndroidPush,微信公眾號(hào):Android編程精選】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    開源媒體服務(wù)器 Komga本地部署實(shí)現(xiàn)遠(yuǎn)程訪問

    Komga是一款支持多種格式的數(shù)字閱讀平臺(tái),可本地部署支持內(nèi)網(wǎng)穿透實(shí)現(xiàn)跨設(shè)備訪問。
    的頭像 發(fā)表于 02-26 20:53 ?851次閱讀
    開源媒體服務(wù)器 Komga本地<b class='flag-5'>部署</b>,<b class='flag-5'>并</b><b class='flag-5'>實(shí)現(xiàn)</b>遠(yuǎn)程訪問

    CoolMonitor 監(jiān)控系統(tǒng)部署及公網(wǎng)訪問方案

    現(xiàn)代的界面設(shè)計(jì)。 功能特點(diǎn) 多種監(jiān)控類型:支持HTTP/HTTPS網(wǎng)站、API接口、HTTPS證書過期、TCP端口、MySQL/Redis數(shù)據(jù)庫等多種監(jiān)控 推送監(jiān)控:支持被動(dòng)接收客戶端的心跳推送,實(shí)現(xiàn)不可直接訪問設(shè)備的監(jiān)控 精美界面:深色/淺色主題
    的頭像 發(fā)表于 01-19 14:42 ?847次閱讀
    CoolMonitor 監(jiān)控<b class='flag-5'>系統(tǒng)</b><b class='flag-5'>部署</b>及公網(wǎng)訪問方案

    本地部署微信公眾號(hào)文章搜索MCP服務(wù)實(shí)現(xiàn)遠(yuǎn)程訪問

    本文介紹如何在本地部署基于FastAPI的微信公眾號(hào)文章搜索MCP服務(wù),通過內(nèi)網(wǎng)穿透實(shí)現(xiàn)公網(wǎng)訪問,支持關(guān)鍵詞搜索。
    的頭像 發(fā)表于 01-12 14:58 ?884次閱讀
    本地<b class='flag-5'>部署</b>微信公眾號(hào)文章搜索MCP服務(wù)<b class='flag-5'>并</b><b class='flag-5'>實(shí)現(xiàn)</b>遠(yuǎn)程訪問

    尼日利亞MTN攜手華為完成RuralCow全球首商用部署

    近日,尼日利亞MTN攜手華為完成普惠聯(lián)接RuralCow解決方案商用部署方案實(shí)現(xiàn)了“一盒子一站點(diǎn)”的極簡創(chuàng)新突破,可助力偏遠(yuǎn)農(nóng)村地區(qū)低成本、高效率地
    的頭像 發(fā)表于 12-08 13:41 ?882次閱讀

    電能質(zhì)量在線監(jiān)測(cè)裝置自診斷功能的硬件層實(shí)時(shí)監(jiān)測(cè)的冗余切換是如何實(shí)現(xiàn)的?

    硬件層冗余切換的核心是 通過專用切換電路 + 硬件觸發(fā)信號(hào) + 同步機(jī)制 ,實(shí)現(xiàn)主備模塊(如電源、ADC、通信)的毫秒級(jí)無縫切換,全程不依賴復(fù)雜軟件,僅通過硬件邏輯
    的頭像 發(fā)表于 11-06 10:54 ?873次閱讀

    如何利用XPIO構(gòu)建實(shí)現(xiàn)帶有Strobe的高速接口設(shè)計(jì)

    在 AMD Versal 自適應(yīng) SoC 器件中,SelectIO 是實(shí)現(xiàn)高速接口的重要組成部分。它為器件提供了靈活且高性能的通用 I/O 資源,支持多種工作模式,能夠滿足源同步接口、異步接口
    的頭像 發(fā)表于 10-17 09:22 ?2520次閱讀
    如何利用XPIO構(gòu)建<b class='flag-5'>并</b><b class='flag-5'>實(shí)現(xiàn)</b>帶有Strobe的高速<b class='flag-5'>接口</b>設(shè)計(jì)

    功率器件設(shè)計(jì)基礎(chǔ)(十四)----成像儀測(cè)溫度概述

    摘要功率半導(dǎo)體熱設(shè)計(jì)是實(shí)現(xiàn)IGBT、SiC高功率密度設(shè)計(jì)的基礎(chǔ),只有掌握功率半導(dǎo)體的設(shè)計(jì)基礎(chǔ)知識(shí)和測(cè)試的基本技能,才能完成精確設(shè)計(jì),提高功率器件的利用率,降低
    的頭像 發(fā)表于 09-12 17:05 ?949次閱讀
    功率器件<b class='flag-5'>熱</b>設(shè)計(jì)基礎(chǔ)(十四)----<b class='flag-5'>熱</b>成像儀測(cè)溫度概述

    本地部署openWebUI + ollama+DeepSeek 打造智能知識(shí)庫實(shí)現(xiàn)遠(yuǎn)程訪問

    以在Ubuntu 系統(tǒng)為例,部署 ZeroNews +Open WebUI + Ollama,構(gòu)建自己的 DeepSeek 平臺(tái) 部署步驟 我們通過Docker 容器的
    的頭像 發(fā)表于 09-10 16:41 ?5390次閱讀
    本地<b class='flag-5'>部署</b>openWebUI + ollama+DeepSeek 打造智能知識(shí)庫<b class='flag-5'>并</b><b class='flag-5'>實(shí)現(xiàn)</b>遠(yuǎn)程訪問

    HT 流暢過渡動(dòng)畫 × 場(chǎng)景切換實(shí)現(xiàn)方案

    在圖撲 HT 項(xiàng)目中,尤其是復(fù)雜應(yīng)用里,單一場(chǎng)景或圖紙通常難以承載所有需求,因此在多個(gè)圖紙或場(chǎng)景之間進(jìn)行切換是一種常見的實(shí)現(xiàn)方式。本文將深入解析圖撲 HT 項(xiàng)目中場(chǎng)景/圖紙切換的核心實(shí)現(xiàn)
    的頭像 發(fā)表于 09-03 14:49 ?869次閱讀
    HT 流暢過渡動(dòng)畫 × 場(chǎng)景<b class='flag-5'>切換</b><b class='flag-5'>實(shí)現(xiàn)</b>方案

    曙光存儲(chǔ)支持西湖大學(xué)高性能計(jì)算中心部署完成全新存儲(chǔ)系統(tǒng)

    近日,曙光存儲(chǔ)支持西湖大學(xué)高性能計(jì)算中心部署完成全新存儲(chǔ)系統(tǒng),為AI研發(fā)、科學(xué)計(jì)算和信息化平臺(tái)等提供存力支持。性能實(shí)測(cè)顯示,該系統(tǒng)單節(jié)點(diǎn)帶寬可達(dá)150GB/s,是國際友商的近4倍,充分
    的頭像 發(fā)表于 08-25 11:48 ?1244次閱讀

    深度解析:雙卡切換的SIM卡電路設(shè)計(jì)原則與實(shí)現(xiàn)!

    實(shí)現(xiàn)穩(wěn)定的雙卡切換功能,電路設(shè)計(jì)必須遵循嚴(yán)格的技術(shù)規(guī)范。本文系統(tǒng)梳理SIM卡接口的電氣特性、時(shí)序要求及ESD防護(hù)策略,揭秘雙卡切換背后的電
    的頭像 發(fā)表于 07-17 16:14 ?951次閱讀
    深度解析:雙卡<b class='flag-5'>切換</b>的SIM卡電路設(shè)計(jì)原則與<b class='flag-5'>實(shí)現(xiàn)</b>!

    Context接口切換介紹

    ; isUpdatingConfigurations():Promise;Stage模型無對(duì)應(yīng)接口系統(tǒng)環(huán)境變化時(shí),應(yīng)用不會(huì)重啟,調(diào)用onConfigurationUpdated接口通知應(yīng)用,
    發(fā)表于 06-06 06:12

    HarmonyOS5云服務(wù)技術(shù)分享--Serverless抽獎(jiǎng)模板部署

    名\"} 3?? ??部署執(zhí)行?? 確認(rèn)參數(shù)無誤后點(diǎn)擊\"開始部署\" 若失敗可嘗試清緩存重新部署 建議部署時(shí)截圖保存配置參數(shù) 4?? ??云函數(shù)關(guān)聯(lián)??
    發(fā)表于 05-22 20:25

    無人職守自動(dòng)安裝部署操作系統(tǒng)指南

    當(dāng)組織有服務(wù)器需要部署linux系統(tǒng)時(shí),需要通過網(wǎng)絡(luò)方式安裝結(jié)合自動(dòng)應(yīng)答文件,實(shí)現(xiàn)無人職守自動(dòng)安裝部署操作
    的頭像 發(fā)表于 05-22 13:38 ?981次閱讀
    無人職守自動(dòng)安裝<b class='flag-5'>部署</b>操作<b class='flag-5'>系統(tǒng)</b>指南

    POE交換機(jī)接口詳解

    實(shí)現(xiàn)遠(yuǎn)程開關(guān)控制與亮度調(diào)節(jié),節(jié)能高效。 PoE交換機(jī)接口與傳統(tǒng)接口的對(duì)比 相較于傳統(tǒng)接口,PoE交換機(jī)接口在布線、
    發(fā)表于 03-27 17:17