`
yunzhu
  • 浏览: 1140729 次
  • 性别: Icon_minigender_1
  • 来自: 南京
博客专栏
B2b19957-cda7-3a9e-83a0-418743feb0ca
监控应用服务器
浏览量:109032
2e8be8be-e51f-346c-bcdd-12623c9aa820
Web前端开发
浏览量:119213
Bfa5df64-a623-34b9-85b8-ef3ce2aed758
经典异常的解决
浏览量:203938
社区版块
存档分类
最新评论

监控Tomcat解决方案(监控应用服务器系列文章)

阅读更多

前言:做了一个监控应用服务器的项目(支持Tocmat、WebSphere、WebLogic各版本), 过程也算是磕磕绊绊,由于网上缺少相关资料,或者深陷于知识的海洋难以寻觅到有效的资料,因而走过不少弯路,遇过不少困难。为了留下点印记,给后来人留下 点经验之谈,助之少走弯路,故将这些经验整理出来,与大家分享。水平有限,难免疏漏,还望指正。如有疑问,欢迎留言,或者加入Q群参与讨 论:35526521



监控Tomcat的常见方案有两种,比较如下:

 

方案一、使用Tomcat提供的manager应用进行数据采集
◆ 可以使用现有的成熟代码,减少工作量
◆ 支持各不同版本时无差别
◆ 可能存在特殊需求而manager不能满足的情况

◆ 最重要的一个优点是,配置比较简单

方案二、使用JMX接口开发监控程序
◆ 全部代码需要从零开始,代码量较大
◆ 支持各不同版本比较麻烦,每个版本可能有差异
◆ 可支配性强

◆ 最重要的一个缺点是,配置比较麻烦

 


方案一、使用 Tomcat提供的manager应用进行数据采集
Applications Manager(又称opManager)就是通过这种方式实现的。
使用这种方式,所监控Tomcat必须运行manager应用,缺省情况下,该应用总是运行在服务器中的。

增加manager角色用户

 

访问manager应用的用户的角色权限必须是 manager.
修改<TOMCAT_HOME>/conf目录下的tomcat-users.xml文件,在<tomcat-users>节点下添加一个user节点,即可创建一个用户。

Tomcat版本不同配置也有差异,5.x和6.x创建的用户角色应为manager,7.x创建的用户角色为manager-jmx,举例如下:

1、在5.x和6.x中创建一个manager角色的用户,用户名为admin,密码为chenfeng:
    <user username="admin" password="chenfeng" roles="manager"/>

2、在7.x中创建一个manager角色的用户,用户名为admin,密码为
chenfeng
    <user username="
admin" password="chenfeng" roles="manager-jmx,manager-script,manager-status"/>

修改配置后,需要重新启动 Tomcat 服务器。
连接manager时将用户名/密码指定为
admin/chenfeng

通过浏览器访问JMX Proxy Servlet

详见官方说明文档:
http://tomcat.apache.org/tomcat-6.0-doc/manager-howto.html#Using_the_JMX_Proxy_Servlet

What is JMX Proxy Servlet

The JMX Proxy Servlet is a lightweight proxy to get and set the tomcat internals. (Or any class that has been exposed via an MBean) Its usage is not very user friendly but the UI is extremely help for integrating command line scripts for monitoring and changing the internals of tomcat. You can do two things with the proxy: get information and set information. For you to really understand the JMX Proxy Servlet, you should have a general understanding of JMX. If you don't know what JMX is, then prepare to be confused.

 

JMX Query command

This takes the form:
http://webserver/manager/jmxproxy/?qry=STUFF

Where STUFF is the JMX query you wish to perform. For example, here are some queries you might wish to run:

◆ qry=*%3Atype%3DRequestProcessor%2C* --> type=RequestProcessorwhich will locate all workers which can process requests and report their state.

◆ qry=*%3Aj2eeType=Servlet%2c* --> j2eeType=Servletwhich return all loaded servlets.

◆ qry=Catalina%3Atype%3DEnvironment%2Cresourcetype%3DGlobal%2Cname%3DsimpleValue --> Catalina:type=Environment,resourcetype=Global,name=simpleValuewhich look for a specific MBean by the given name.

You'll need to experiment with this to really understand its capabilites. If you provide no qry parameter, then all of the MBeans will be displayed. We really recommend looking at the tomcat source code and understand the JMX spec to get a better understanding of all the queries you may run.

 

通过浏览器访问http://localhost:8080/manager/jmxproxy ,输入用户名密码,然后就可以看到返回了所有的监控信息

添加查询参数,返回特定的监控信息:
例如:

http://localhost:8080/manager/jmxproxy?qry=*%3Atype%3DRequestProcessor%2C*

 

其中 *%3Atype%3DRequestProcessor%2C* 其实就是 *:type=RequestProcessor,*

 

又如:

http://localhost:8080/manager/jmxproxy?qry=*%3Aj2eeType%3DWebModule%2Cname%3D//localhost/ajaxrpc%2C*

 


在代码中访问JMX Proxy Servlet


通过浏览器访问JMX Proxy Servlet需要输入用户名密码,所以通过Java访问JMX Proxy Servlet的URL也需要授权访问:
URL url = new URL("http://localhost:8080/manager/jmxproxy?qry=*%3Atype%3DManager%2C*");

URLConnection conn = (URLConnection) url.openConnection();

// URL授权访问 -- Begin
String password = "admin:chenfeng"; // manager角色的用户
String encodedPassword = new BASE64Encoder().encode(password.getBytes());
conn.setRequestProperty("Authorization", "Basic " + encodedPassword);
// URL授权访问 -- End

InputStream is = conn.getInputStream();
BufferedReader bufreader = new BufferedReader(new InputStreamReader(is));
String line = null;
while ((line = bufreader.readLine()) != null) {
    System.out.println(line);
}

 

 

几个具体的例子

下面展示两个例子,一个是采集服务器基本信息,一个是采集Web应用列表信息,注意Tomcat 7.x和Tomcat 5.x、6.x之间存在很大的区别。

◆ 采集服务器基本信息

通过serverinfo命令查看服务器基本信息
     http://localhost:8080/manager/serverinfo

Tomcat 7.x的查询URL有变化:
     http://localhost:8080/manager/text/serverinfo

返回信息:

OK - Server info
Tomcat Version: Apache Tomcat/7.0.11
OS Name: Windows Vista
OS Version: 6.1
OS Architecture: x86
JVM Version: 1.6.0_13-b03
JVM Vendor: Sun Microsystems Inc.

 


◆ 采集Web应用列表信息

通过list命令查看Web应用列表和会话数信息
     http://localhost:8080/manager/list

Tomcat 7.x的查询URL有变化:
     http://localhost:8080/manager/text/list

返回信息:

OK - Listed applications for virtual host localhost
/:running:0:ROOT
/manager:running:1:manager
/docs:running:0:docs
/examples:running:0:examples
/host-manager:running:0:host-manager

 

方案二、使用JMX 接口开发监控程序

Tomcat激活JMX远程配置

 

① 先修改Tomcat的启动脚本,window下tomcat的bin/catalina.bat(linux为catalina.sh),添加以下内 容,8999是jmxremote使用的端口号,第二个false表示不需要鉴权:

set JMX_REMOTE_CONFIG=-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=8999 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false
set CATALINA_OPTS=%CATALINA_OPTS% %JMX_REMOTE_CONFIG%

 

可以加在if "%OS%" == "Windows_NT" setlocal 一句后的大段的注释后面。

参考官方说明:
http://tomcat.apache.org/tomcat-6.0-doc/monitoring.html#Enabling_JMX_Remote

② 上面的配置是不需要鉴权的,如果需要鉴权则添加的内容为:

set JMX_REMOTE_CONFIG=-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=8999 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=true -Dcom.sun.management.jmxremote.password.file=../conf/jmxremote.password -Dcom.sun.management.jmxremote.access.file=../conf/jmxremote.access
set CATALINA_OPTS=%CATALINA_OPTS% %JMX_REMOTE_CONFIG%

 

然后复制并修改授权文件,$JAVA_HOME/jre/lib/management下有 jmxremote.access和jmxremote.password的模板文件,将两个文件复制到$CATALINA_BASE/conf目录下
● 修改$CATALINA_BASE/conf/jmxremote.access 添加内容:
     monitorRole readonly
     controlRole readwrite

● 修改$CATALINA_BASE/conf/jmxremote.password 添加内容:
     monitorRole tomcat
     controlRole tomcat

注意:如果只做第一步没有问题,进行了第二步Tomcat就启动不了,那么很可能是密码文件的权限问题!
需要修改jmxremote.password文件的权限,只有运行Tomcat的用户有访问权限:
Windows的NTFS文件系统下,选中文件,点右键 -->“属性”-->“安全”--> 点“高级”--> 点“更改权限”--> 去掉“从父项继承....”--> 弹出窗口中选“删除”,这样就删除了所有访问权限。再选“添加”--> “高级”--> “立即查找”,选中你的用户,例administrator,点“确定",“确定"。来到权限项目窗口,勾选“完全控制”,点“确定”,OK了。

官方的提示
The password file should be read-only and only accessible by the operating system user Tomcat is running as.


③ 重新启动Tomcat,在Windows命令行输入“netstat -a”查看配置的端口号是否已打开,如果打开,说明上面的配置成功了。

④ 使用jconsole测试JMX。

 

运行$JAVA_HOME/bin目录下的jconsole.exe,打开J2SE监视和管理控制台,然后建立连接,如 果是本地的Tomcat则直接选择然后点击连接,如果是远程的,则进入远程选项卡,填写地址、端口号、用户名、口令即可连接。Mbean属性页中给出了相 应的数据,Catalina中是tomcat的,java.lang是jvm的。对于加粗的黑体属性值,需双击一下才可看内容。

 


使用JMX监控Tomcat示例代码:

String jmxURL = "service:jmx:rmi:///jndi/rmi://192.168.10.93:8999/jmxrmi";
JMXServiceURL serviceURL = new JMXServiceURL(jmxURL);

Map map = new HashMap();
// 用户名密码,在jmxremote.password文件中查看
String[] credentials = new String[] { "monitorRole", "tomcat" };
map.put("jmx.remote.credentials", credentials);
JMXConnector connector = JMXConnectorFactory.connect(serviceURL, map);
MBeanServerConnection mbsc = connector.getMBeanServerConnection();

// 端口最好是动态取得
ObjectName threadObjName = new ObjectName("Catalina:type=ThreadPool,name=http-8080");
MBeanInfo mbInfo = mbsc.getMBeanInfo(threadObjName);

// tomcat的线程数对应的属性值
String attrName = "currentThreadCount";
MBeanAttributeInfo[] mbAttributes = mbInfo.getAttributes();
System.out.println("currentThreadCount:" + mbsc.getAttribute(threadObjName, attrName));

 

 

完整的示例代码文件:

import java.lang.management.MemoryUsage;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Formatter;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

import javax.management.MBeanAttributeInfo;
import javax.management.MBeanInfo;
import javax.management.MBeanServerConnection;
import javax.management.ObjectInstance;
import javax.management.ObjectName;
import javax.management.openmbean.CompositeDataSupport;
import javax.management.remote.JMXConnector;
import javax.management.remote.JMXConnectorFactory;
import javax.management.remote.JMXServiceURL;

/**
 * 使用JMX监控Tomcat示例
 * 
 * @author 陳峰
 */
public class JMXTest {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		try {

			String jmxURL = "service:jmx:rmi:///jndi/rmi://127.0.0.1:8999/jmxrmi";

			JMXServiceURL serviceURL = new JMXServiceURL(jmxURL);

			Map map = new HashMap();
			String[] credentials = new String[] { "monitorRole", "tomcat" };
			map.put("jmx.remote.credentials", credentials);
			JMXConnector connector = JMXConnectorFactory.connect(serviceURL,
					map);
			MBeanServerConnection mbsc = connector.getMBeanServerConnection();

			// 端口最好是动态取得
			ObjectName threadObjName = new ObjectName(
					"Catalina:type=ThreadPool,name=http-8080");
			MBeanInfo mbInfo = mbsc.getMBeanInfo(threadObjName);

			String attrName = "currentThreadCount";// tomcat的线程数对应的属性值
			MBeanAttributeInfo[] mbAttributes = mbInfo.getAttributes();
			System.out.println("currentThreadCount:"
					+ mbsc.getAttribute(threadObjName, attrName));

			// heap
			for (int j = 0; j < mbsc.getDomains().length; j++) {
				System.out.println("###########" + mbsc.getDomains()[j]);
			}
			Set MBeanset = mbsc.queryMBeans(null, null);
			System.out.println("MBeanset.size() : " + MBeanset.size());
			Iterator MBeansetIterator = MBeanset.iterator();
			while (MBeansetIterator.hasNext()) {
				ObjectInstance objectInstance = (ObjectInstance) MBeansetIterator
						.next();
				ObjectName objectName = objectInstance.getObjectName();
				String canonicalName = objectName.getCanonicalName();
				System.out.println("canonicalName : " + canonicalName);
				if (canonicalName
						.equals("Catalina:host=localhost,type=Cluster")) {
					// Get details of cluster MBeans
					System.out.println("Cluster MBeans Details:");
					System.out
							.println("=========================================");
					// getMBeansDetails(canonicalName);
					String canonicalKeyPropList = objectName
							.getCanonicalKeyPropertyListString();
				}
			}
			// ------------------------- system ----------------------
			ObjectName runtimeObjName = new ObjectName("java.lang:type=Runtime");
			System.out.println("厂商:"
					+ (String) mbsc.getAttribute(runtimeObjName, "VmVendor"));
			System.out.println("程序:"
					+ (String) mbsc.getAttribute(runtimeObjName, "VmName"));
			System.out.println("版本:"
					+ (String) mbsc.getAttribute(runtimeObjName, "VmVersion"));
			Date starttime = new Date((Long) mbsc.getAttribute(runtimeObjName,
					"StartTime"));
			SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
			System.out.println("启动时间:" + df.format(starttime));

			Long timespan = (Long) mbsc.getAttribute(runtimeObjName, "Uptime");
			System.out.println("连续工作时间:" + JMXTest.formatTimeSpan(timespan));
			// ------------------------ JVM -------------------------
			// 堆使用率
			ObjectName heapObjName = new ObjectName("java.lang:type=Memory");
			MemoryUsage heapMemoryUsage = MemoryUsage
					.from((CompositeDataSupport) mbsc.getAttribute(heapObjName,
							"HeapMemoryUsage"));
			long maxMemory = heapMemoryUsage.getMax();// 堆最大
			long commitMemory = heapMemoryUsage.getCommitted();// 堆当前分配
			long usedMemory = heapMemoryUsage.getUsed();
			System.out.println("heap:" + (double) usedMemory * 100
					/ commitMemory + "%");// 堆使用率

			MemoryUsage nonheapMemoryUsage = MemoryUsage
					.from((CompositeDataSupport) mbsc.getAttribute(heapObjName,
							"NonHeapMemoryUsage"));
			long noncommitMemory = nonheapMemoryUsage.getCommitted();
			long nonusedMemory = heapMemoryUsage.getUsed();
			System.out.println("nonheap:" + (double) nonusedMemory * 100
					/ noncommitMemory + "%");

			ObjectName permObjName = new ObjectName(
					"java.lang:type=MemoryPool,name=Perm Gen");
			MemoryUsage permGenUsage = MemoryUsage
					.from((CompositeDataSupport) mbsc.getAttribute(permObjName,
							"Usage"));
			long committed = permGenUsage.getCommitted();// 持久堆大小
			long used = heapMemoryUsage.getUsed();//
			System.out.println("perm gen:" + (double) used * 100 / committed
					+ "%");// 持久堆使用率

			// -------------------- Session ---------------
			ObjectName managerObjName = new ObjectName(
					"Catalina:type=Manager,*");
			Set<ObjectName> s = mbsc.queryNames(managerObjName, null);
			for (ObjectName obj : s) {
				System.out.println("应用名:" + obj.getKeyProperty("path"));
				ObjectName objname = new ObjectName(obj.getCanonicalName());
				System.out.println("最大会话数:"
						+ mbsc.getAttribute(objname, "maxActiveSessions"));
				System.out.println("会话数:"
						+ mbsc.getAttribute(objname, "activeSessions"));
				System.out.println("活动会话数:"
						+ mbsc.getAttribute(objname, "sessionCounter"));
			}

			// ----------------- Thread Pool ----------------
			ObjectName threadpoolObjName = new ObjectName(
					"Catalina:type=ThreadPool,*");
			Set<ObjectName> s2 = mbsc.queryNames(threadpoolObjName, null);
			for (ObjectName obj : s2) {
				System.out.println("端口名:" + obj.getKeyProperty("name"));
				ObjectName objname = new ObjectName(obj.getCanonicalName());
				System.out.println("最大线程数:"
						+ mbsc.getAttribute(objname, "maxThreads"));
				System.out.println("当前线程数:"
						+ mbsc.getAttribute(objname, "currentThreadCount"));
				System.out.println("繁忙线程数:"
						+ mbsc.getAttribute(objname, "currentThreadsBusy"));
			}

		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public static String formatTimeSpan(long span) {
		long minseconds = span % 1000;

		span = span / 1000;
		long seconds = span % 60;

		span = span / 60;
		long mins = span % 60;

		span = span / 60;
		long hours = span % 24;

		span = span / 24;
		long days = span;
		return (new Formatter()).format("%1$d天 %2$02d:%3$02d:%4$02d.%5$03d",
				days, hours, mins, seconds, minseconds).toString();
	}
}

 

 

分享到:
评论
8 楼 yunzhu 2013-01-23  
焦志广 写道
tomcat7 修改完就是起不来啊,权限也是按照你说的操作的啊?

你完全没有描述问题的症状,所以我只能靠猜的了。

你是采用方案二,在激活JMX远程配置的时候出现问题的吧,那么“注意:如果只做第一步没有问题,进行了第二步Tomcat就启动不了,那么很可能是密码文件的权限问题!”这部分内容,你看了没有。如果你是在Linux环境下,那么也要做相应的配置,因为文中引用的这句官方的提示很重要:
The password file should be read-only and only accessible by the operating system user Tomcat is running as.

如果不是这样的问题,请把问题描述一下
7 楼 焦志广 2013-01-22  
tomcat7 修改完就是起不来啊,权限也是按照你说的操作的啊?
6 楼 yunzhu 2012-12-04  
weizhi_0213 写道
哦,明白了。还有一个问题,您说opManager的tomcat是用它自带的manager应用监控的,那其他的应用服务器呢?JBoss、WebLogic、WebSphere等,这些服务器JMX能够实现对他们的监控,那他们也像tomcat似的,有自己的manager应用吗?如果没有的话,您知道opManager里边是用的什么方法实现的吗?谢谢~

关于opManager,监控WebSphere是通过perfServletApp,类似于Tomcat的manager,监控WebLogic则是通过JMX,至于JBoss没有研究过,不清楚。

关于监控WebSphere请看:http://yunzhu.iteye.com/blog/971254

关于监控WebLogic 8.x请看这里:http://yunzhu.iteye.com/blog/975279

关于监控WebLogic 9.x/10.x请看这里:http://yunzhu.iteye.com/blog/1552623
5 楼 weizhi_0213 2012-12-04  
哦,明白了。还有一个问题,您说opManager的tomcat是用它自带的manager应用监控的,那其他的应用服务器呢?JBoss、WebLogic、WebSphere等,这些服务器JMX能够实现对他们的监控,那他们也像tomcat似的,有自己的manager应用吗?如果没有的话,您知道opManager里边是用的什么方法实现的吗?谢谢~
4 楼 yunzhu 2012-12-04  
weizhi_0213 写道
请问,你用jmx接口实现的监控,是能监控网络中任意一台机器上的tomcat吗?比如,我输入我要监控的tomcat所在机器的ip就能监控。

你好,使用jmx监控,tomcat端是需要进行一些配置的,要开启jmx,还要配置鉴权信息,详见上面的文章
3 楼 weizhi_0213 2012-12-03  
请问,你用jmx接口实现的监控,是能监控网络中任意一台机器上的tomcat吗?比如,我输入我要监控的tomcat所在机器的ip就能监控。
2 楼 yunzhu 2012-11-27  
weizhi_0213 写道
您好。请问,如果想要监控网络上任意一台应用服务器的相关性能,比如用snmp能够实现。那您说的那个opManager是用tomcat自带的manager实现的,那他底层是用的什么协议呢?也是snmp吗?还是telnet或是其他什么?

你好,SNMP不了解。使用Tomcat自带的manager实现不需要什么底层协议,只要访问manager应用的加密URL,即可取得包含监控数据的文本信息,然后解析文本就行了。
1 楼 weizhi_0213 2012-11-27  
您好。请问,如果想要监控网络上任意一台应用服务器的相关性能,比如用snmp能够实现。那您说的那个opManager是用tomcat自带的manager实现的,那他底层是用的什么协议呢?也是snmp吗?还是telnet或是其他什么?

相关推荐

    Tomcat服务器部署+Web项目搭建.zip

    从Tomcat服务器的介绍,到服务器的下载、安装、配置,再到Web项目的创建、打包、部署,以及常见的部署问题和解决方案,本博客为读者提供了一个清晰的学习路径。此外,还涵盖了Tomcat的高级功能,如安全性、性能监控...

    GPS车辆监控系统

    一、适用行业:公安、物流、...(2)提供GPS知识、行业应用、行业解决方案等一系列的咨询 (3)免费提供数据加工服务(源数据客户提供或者从我处购买得到) 五、联系我 手机 :13764380157(徐) QQ :172835883

    服务器运维工程师的主要职责.docx

    5、通过撰写并记录相应的技术难题及解决方案,完善并丰富公式的软件资产及知识库系统。 任职要求: 1、六年以上IT相关的工作经验; 2、成功的大型的IT项目经验; 3、具有跨国公司团队领导经验优先考虑; 4、具有中大型...

    基于SSHI架构的开发平台技术方案

    基于J2EE平台软件的终级解决方案,采用最新的J2EE技术 平台特点思路:技术先进、架构安全、稳定、高效、易快速上手 底层为成熟的J2EE开源技术框架Spring3、Struts2、Hibernate3.6 数据访问层采用Hibernate 结合...

    Visio 2007 Web控件模板

    最佳的基于web的工作流设计器、工作流流程监视器解决方案。 可广泛应用于包括:电力、 军工、煤炭、化工、科研、能源等各种监控软件、电力、化工、煤炭、工控组态软件、仿真、 地理信息系统、工作流、复杂报表 工业...

    腾讯开源的分布式毫秒服务引擎 msec.zip

    它是一整套解决方案,但也可以拆分的来使用其中的监控、key-value存储单品。 应用场景web console:整个系统的运营管理中心。 主要是:① LB是名字发现服务和负载均衡。② remote_shell是远程文件传输与远程命令...

    Loadrunner报错日志

    解决方案: 修改“运行时设置-HTTP请求连接超时、HTTP请求接收超时”的值为600s或者更长时间 Run-Time Setting(运行时设置) -- Internet Protocol -- Preferences -- Option -- Step download timeout(sec)改为...

    智能云平台需求书及技术方案.docx

    1.2.2系统运行环境及其应用软件 操作系统:Windows 系统 Web服务器:阿里云服务器 数据库:SQLserver2008 系统构架:B/S架构 开发语言:前端开发语言为JavaScript .后台开发语言为.net C# 其他要求:硬件与平台通讯...

    《MyEclipse 6 Java 开发中文教程》前10章

    6.6.2监控服务器启动过程 103 6.6.3停止服务器 103 6.6.4调试发布的企业应用 104 6.7小结 104 6.8 参考资料 104 第七章 开发Hibernate应用 105 7.1介绍 105 7.2 Hibernate 一览 105 7.2.1简介 105 7.2.2 Hibernate...

    Jpom项目监控软件-其他

    3、cpu、ram 监控、导出堆栈信息、查看项目进程端口、服务器状态监控 4、多节点管理、多节点自动分发 5、实时监控项目状态异常自动报警 6、在线构建项目发布项目一键搞定 7、多用户管理,用户项目权限独立(上传、...

    超级有影响力霸气的Java面试题大全文档

    多态性语言具有灵活、抽象、行为共享、代码共享的优势,很好的解决了应用程序函数同名问题。 5、String是最基本的数据类型吗?  基本数据类型包括byte、int、char、long、float、double、boolean和short。  java....

    H3C SDN典型经验案例集汇总.rar

    02 SDN下手动创建浮动IP和CloudOS公网IP地址冲突解决方案 03 ADDC方案SDN控制器在虚拟路由器 04 云平台没有配置防火墙下行网络地址池导致SDN控制器创建网关资源失败问题 05 H3C SDN网络overlay组网Oracle 11g RAC...

    Docker镜像大礼包.zip

    首先,运维工作包括基础设施的部署与配置,如服务器、网络设备、存储设备等硬件资源的安装调试与监控,同时还需要安装操作系统、数据库和其他应用软件,并进行性能调优以满足业务需求。 其次,运维人员承担着日常...

    springboot-docker-swagger:使用 Spring Boot、JPA、Gradle 和 Swagger 编写的模板 Restful Web 服务

    这个 jar 文件还包括应用程序服务器(tomcat/jetty)。 我们称 Spring Boot Production 就绪的原因是因为它提供了许多开箱即用的功能。 其中很少有例子是 autoconfig,可以将其视为生产配置的约定。 用于监控和衡量...

    springboot参考指南

    在前端代理服务器后使用Tomcat ix. 64.9. 使用Jetty替代Tomcat x. 64.10. 配置Jetty xi. 64.11. 使用Undertow替代Tomcat xii. 64.12. 配置Undertow xiii. 64.13. 启用Undertow的多监听器 xiv. 64.14. 使用Tomcat7 i...

    Java数据编程指南

    软件、对象、数据设计与建模 第1章 软件开发的方法与过程 为什么我们需要方法与过程 什么是软件方法与过程 方法的内容 过程模型 源代码管理的要素 软件缺陷与修改的跟踪和解决方案 软件品质...

    java开源包1

    JSTUN 是另外一个用来解决穿越 NAT 进行通讯的 Java 解决方案,是 STUN 协议的 Java实现。 在浏览器上运行Java程序 Doppio DoppioVM 是一个可在浏览器上直接运行 Java 项目的系统,无需任何插件支持。目前它包含一...

    java开源包11

    JSTUN 是另外一个用来解决穿越 NAT 进行通讯的 Java 解决方案,是 STUN 协议的 Java实现。 在浏览器上运行Java程序 Doppio DoppioVM 是一个可在浏览器上直接运行 Java 项目的系统,无需任何插件支持。目前它包含一...

    java开源包2

    JSTUN 是另外一个用来解决穿越 NAT 进行通讯的 Java 解决方案,是 STUN 协议的 Java实现。 在浏览器上运行Java程序 Doppio DoppioVM 是一个可在浏览器上直接运行 Java 项目的系统,无需任何插件支持。目前它包含一...

    java开源包3

    JSTUN 是另外一个用来解决穿越 NAT 进行通讯的 Java 解决方案,是 STUN 协议的 Java实现。 在浏览器上运行Java程序 Doppio DoppioVM 是一个可在浏览器上直接运行 Java 项目的系统,无需任何插件支持。目前它包含一...

Global site tag (gtag.js) - Google Analytics