最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

通過weblogic API解析如何獲取weblogic中服務(wù)的IP和端口操作

 更新時(shí)間:2021年06月19日 14:36:25   作者:一步一臺(tái)階  
這篇文章主要介紹了通過weblogic API解析如何獲取weblogic中服務(wù)的IP和端口操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

我們的服務(wù)是部署在weblogic上的,最近遇到一個(gè)需求,需要在代碼中獲取weblogic部署當(dāng)前服務(wù)的IP地址和端口。

后來搜到一段代碼,親測(cè)有效:

public static String getIpAndPort(){
    try {
        InitialContext initialContext = new InitialContext();
		MBeanServer tMBeanServer;
		MBeanServer platformMBeanServer = ManagementFactory.getPlatformMBeanServer();
			tMBeanServer = (MBeanServer) initialContext.lookup("java:comp/env/jmx/runtime");	
		ObjectName tObjectName = new ObjectName(
				"com.bea:Name=RuntimeService,Type=weblogic.management.mbeanservers.runtime.RuntimeServiceMBean");
		ObjectName serverrt = (ObjectName) tMBeanServer.getAttribute(tObjectName, "ServerRuntime");
		String port = String.valueOf(tMBeanServer.getAttribute(serverrt, "ListenPort"));
		String listenAddr = (String) tMBeanServer.getAttribute(serverrt, "ListenAddress");
		String[] tempAddr = listenAddr.split("/");
		if (tempAddr.length == 1) {
			listenAddr = tempAddr[0];
		} else if (tempAddr[tempAddr.length - 1].trim().length() != 0) {
			listenAddr = tempAddr[tempAddr.length - 1];
		} else if (tempAddr.length > 2) {
			listenAddr = tempAddr[tempAddr.length - 2];
		}
		StringBuilder sBuilder = new StringBuilder(listenAddr);
		sBuilder.append(":");
		sBuilder.append(port);
		System.out.print(sBuilder);
		return sBuilder.toString();
		} catch (NamingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (MalformedObjectNameException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (InstanceNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (AttributeNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (ReflectionException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (MBeanException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return null;
	}	

可要理解這段代碼后面的原理和思路,真是費(fèi)勁了,需要了解以下知識(shí):

JMX

JNDI

RMI

EJB

總結(jié)成一句話就是,通過web應(yīng)用通過weblogic提供的JNDI訪問weblogic的JMX中的對(duì)象。JNDI后臺(tái)用的技術(shù)就是EJB,而EJB是RMI在java語言上的實(shí)現(xiàn)。上述幾個(gè)概念的具體含義,讀者可以自行查詢,網(wǎng)上資料很多。

下面回歸正題,先從思路上詳細(xì)分析下標(biāo)題中的內(nèi)容如何實(shí)現(xiàn)。

作為服務(wù)端代碼,最后都是生成一個(gè)war放到服務(wù)器上去運(yùn)行的。那從代碼本身的程序來說,是肯定無法知道自己會(huì)被放到什么類型的web容器中、自己可以被訪問的IP地址和端口號(hào)的。那誰知道的呢?只有web容器知道。換句話說,從這次要解決的問題上看,只有weblogic自己知道在其內(nèi)部部署的應(yīng)用被放到了哪個(gè)IP下,端口是多少。也就是說,解決這個(gè)問題的關(guān)鍵是,我們的服務(wù)程序如何去“問”weblogic容器,自己的IP和端口是多少。

好的,我們繼續(xù)來想這個(gè)問題。能不能從weblogic容器中獲取到服務(wù)的IP和端口號(hào),取決于weblogic愿不愿意把這些信息開放給你,換句話說,取決于weblogic是否對(duì)外開放了可以獲取其內(nèi)部服務(wù)IP和端口的通道。

目前來看,必然是提供了的,查了weblogic的官網(wǎng),發(fā)現(xiàn)了這樣一段說明:

文章的鏈接地址為(oracle的官方文檔):

https://docs.oracle.com/cd/E13222_01/wls/docs81/jmx/overview.html

只要獲取到weblogic的MBeanServer,然后從MBeanServer中取出對(duì)應(yīng)的ObjectName的屬性,就可以獲取到IP和端口了。這里面提到了JMX和RMI的概念,不清楚的,可以從上文找博文鏈接查看。

有一點(diǎn)是比較好理解的,就是weblogic必定會(huì)把自己處在runtime的服務(wù)信息寫入到MBeanServer,然后我們通過MBeanServer把這些信息拿出來就行了。至于為什么要有MBeanServer,又是和JMX相關(guān),這里就不再贅述?,F(xiàn)在的關(guān)鍵問題是,我們的本地程序,如何訪問到weblogic的MBeanServer?答案是通過InitialContext的lookup函數(shù),而lookup函數(shù)最終的訪問方式是JNDI。也就是說,我們最終是通過weblogic對(duì)外提供的JNDI訪問到weblogic的MBeanServer的。MBeanServer在兩個(gè)程序(weblogic和服務(wù)程序)之間的傳遞是通過EJB的。

拿到weblogic的MBeanServer之后,如何獲取程序的IP的端口呢?這個(gè)當(dāng)然要看weblogic是怎么設(shè)置進(jìn)去的。按照設(shè)置進(jìn)去的規(guī)則取出來就可以了。那如何知道weblogic的設(shè)置規(guī)則呢?我們繼續(xù)看weblogic的文檔。

原文鏈接:

https://docs.oracle.com/cd/E13222_01/wls/docs90/jmx/understandWLS.html

發(fā)現(xiàn)了什么問題,紅框中的文字,不就是剛才樣例代碼中的文字嗎?再來看下面這段代碼,通過本地程序訪問Runtime MBean Server

If the classes for the JMX client are located in a J2EE module, such as an EJB or Web application, then the JNDI name for the Runtime MBeanServer is:

java:comp/env/jmx/runtime

翻譯下,如果JMX客戶端(EJB或者Web程序)在J2EE本地,那么通過JNDI訪問Runtime MBean Server的名稱為java:comp/env/jmx/runtime。

Runtime MBean Server是MBeanServer的一種,通過下面的說明可以看到:

所以可以把Runtime MBean Server賦值給MBeanServer.

好,下一步,我們繼續(xù)來調(diào)查,從Runtime MBean Server中如何取到端口和IP。通過以下代碼獲取RuntimeServerMBean的ServerRuntime屬性。

        ObjectName tObjectName = new ObjectName(
                "com.bea:Name=RuntimeService,Type=weblogic.management.mbeanservers.runtime.RuntimeServiceMBean");
        ObjectName serverrt = (ObjectName) tMBeanServer.getAttribute(tObjectName, "ServerRuntime");

點(diǎn)開ServerRuntime屬性,看看它還有什么二級(jí)屬性,果然:

ListenPort和ListenAddress就是ServerRuntime的二級(jí)屬性。通過以下代碼獲取到:

		String port = String.valueOf(tMBeanServer.getAttribute(serverrt, "ListenPort"));
		String listenAddr = (String) tMBeanServer.getAttribute(serverrt, "ListenAddress");

至此,所有代碼解析完畢。

但是仔細(xì)想想,這段代碼其實(shí)是有瑕疵的。換句話說,健壯性還不夠。如果我們用的web容器不是weblogic怎么辦?那代碼豈不是就不管用了。所以我建議,完善下這段代碼,增加對(duì)web容器的判斷。其他web容器中如果獲取IP和端口,還請(qǐng)讀者自己探索。先通過下面的函數(shù)判斷下當(dāng)前的web容器:

public static String getServerName() {
		String serverName = null;
		if (ServerDetector.isWebLogic()) {
			serverName = "WebLogic";
		} else if (ServerDetector.isTomcat()) {
			serverName = "Tomcat";
		} else if (ServerDetector.isWebSphere()) {
			serverName = "WebSphere";
		} else if (ServerDetector.isSupportsComet()) {
			serverName = "SupportsComet";
		} else if (ServerDetector.isResin()) {
			serverName = "Resin";
		} else if (ServerDetector.isOC4J()) {
			serverName = "OC4J";
		} else if (ServerDetector.isJOnAS()) {
			serverName = "JOnAS";
		} else if (ServerDetector.isJetty()) {
			serverName = "Jetty";
		} else if (ServerDetector.isJBoss()) {
			serverName = "JBoss";
		} else if (ServerDetector.isGeronimo()) {
			serverName = "Geronimo";
		} else if (ServerDetector.isGlassfish()) {
			serverName = "Glassfish";
		} else if (ServerDetector.isGlassfish2()) {
			serverName = "Glassfish2";
		} else if (ServerDetector.isGlassfish3()) {
			serverName = "Glassfish3";
		}
		return serverName;
	}
 

ServerDetector需要對(duì)應(yīng)jar包,利用maven引入的配置為:

<dependency>
		    <groupId>com.liferay.portal</groupId>
		    <artifactId>portal-kernel</artifactId>
		    <version>5.2.3</version>
		    <scope>provided</scope>
 
</dependency>

遇到問題,一定要多探索,與其看別人的博文,不如自己深入研究API,找樣例代碼。用一手資料。以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 詳解MyBatis配置typeAliases的方法

    詳解MyBatis配置typeAliases的方法

    這篇文章主要介紹了詳解MyBatis配置typeAliases的方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10
  • java圖片滑動(dòng)驗(yàn)證(登錄驗(yàn)證)原理與實(shí)現(xiàn)方法詳解

    java圖片滑動(dòng)驗(yàn)證(登錄驗(yàn)證)原理與實(shí)現(xiàn)方法詳解

    這篇文章主要介紹了java圖片滑動(dòng)驗(yàn)證(登錄驗(yàn)證)原理與實(shí)現(xiàn)方法,結(jié)合實(shí)例形式詳細(xì)分析了java圖片滑動(dòng)登錄驗(yàn)證的相關(guān)原理、實(shí)現(xiàn)方法與操作技巧,需要的朋友可以參考下
    2019-09-09
  • java對(duì)象和json的來回轉(zhuǎn)換知識(shí)點(diǎn)總結(jié)

    java對(duì)象和json的來回轉(zhuǎn)換知識(shí)點(diǎn)總結(jié)

    在本篇文章里小編給大家分享了一篇關(guān)于java對(duì)象和json的來回轉(zhuǎn)換知識(shí)點(diǎn)總結(jié)內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。
    2021-01-01
  • 聊聊Redis二進(jìn)制數(shù)組Bitmap

    聊聊Redis二進(jìn)制數(shù)組Bitmap

    這篇文章主要介紹了Redis二進(jìn)制數(shù)組Bitmap,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • webuploader在springMVC+jquery+Java開發(fā)環(huán)境下的大文件分片上傳的實(shí)例代碼

    webuploader在springMVC+jquery+Java開發(fā)環(huán)境下的大文件分片上傳的實(shí)例代碼

    這篇文章主要介紹了webuploader在springMVC+jquery+Java開發(fā)環(huán)境下的大文件分片上傳的實(shí)例代碼,需要的朋友可以參考下
    2017-04-04
  • 一文了解Java Log框架徹底搞懂Log4J,Log4J2,LogBack,SLF4J

    一文了解Java Log框架徹底搞懂Log4J,Log4J2,LogBack,SLF4J

    本文主要介紹了一文了解Java Log框架徹底搞懂Log4J,Log4J2,LogBack,SLF4J,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • Java文件上傳下載、郵件收發(fā)實(shí)例代碼

    Java文件上傳下載、郵件收發(fā)實(shí)例代碼

    這篇文章主要介紹了Java文件上傳下載、郵件收發(fā)實(shí)例代碼的相關(guān)資料,非常不錯(cuò)具有參考借鑒價(jià)值,需要的朋友可以參考下
    2016-06-06
  • SpringBoot項(xiàng)目打包部署到Tomcat的操作流程

    SpringBoot項(xiàng)目打包部署到Tomcat的操作流程

    在最近一個(gè)項(xiàng)目中,維護(hù)行里一個(gè)年代較為久遠(yuǎn)的單體項(xiàng)目,需要將項(xiàng)目打包放到的tomcat服務(wù)器下運(yùn)行,所以本文就給大家介紹一下SpringBoot項(xiàng)目打包部署到Tomcat的流程步驟,需要的朋友可以參考下
    2023-08-08
  • Java開發(fā)中的OOM內(nèi)存溢出問題詳解

    Java開發(fā)中的OOM內(nèi)存溢出問題詳解

    這篇文章主要介紹了Java開發(fā)中的OOM內(nèi)存溢出問題詳解,OOM,全稱?Out?Of?Memory,意思是內(nèi)存耗盡或內(nèi)存溢出,當(dāng)JVM因?yàn)闆]有足夠的內(nèi)存來為對(duì)象分配空間并且垃圾回收器也已經(jīng)沒有空間可回收時(shí),就會(huì)拋出這個(gè)?error,需要的朋友可以參考下
    2023-08-08
  • Idea jdk版本問題解決方案

    Idea jdk版本問題解決方案

    這篇文章主要介紹了Idea jdk版本問題解決方案,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-07-07

最新評(píng)論

曲靖市| 汉阴县| 静乐县| 汤阴县| 荥经县| 周口市| 孝义市| 佛坪县| 安化县| 特克斯县| 靖宇县| 临漳县| 石棉县| 寿阳县| 明溪县| 斗六市| 昌黎县| 双流县| 任丘市| 渑池县| 西畴县| 灵寿县| 芦溪县| 安顺市| 六枝特区| 丹东市| 汕头市| 沂源县| 东阳市| 葫芦岛市| 郴州市| 南雄市| 旌德县| 夏津县| 宜良县| 上杭县| 乐亭县| 灵宝市| 安新县| 凤阳县| 广河县|