RESIN3.1配置说明及常见性问题解决方案_第1页
RESIN3.1配置说明及常见性问题解决方案_第2页
RESIN3.1配置说明及常见性问题解决方案_第3页
RESIN3.1配置说明及常见性问题解决方案_第4页
RESIN3.1配置说明及常见性问题解决方案_第5页
已阅读5页,还剩26页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Resin 3.1 中文文档目录1. Resin 3.1 配置文件说明22. Resin 3.1 FAQ症状81.1. Resin停止响应81.2. Resin不停重启动81.3. java.lang.OutOfMemoryError错误,应用程序内存溢出81.4. 运行一会儿,服务器开始变得非常慢91.5. CPU尖峰,高的CPU使用率91.6. 会话(sessions)变成null,会话丢失101.6.1. 调试日志101.6.2. Resin会话配置101.6.3. 应用程序重载111.6.4. 浏览器cookie的局限111.6.5. cookie域名的问题121.6.6. cooki

2、e名称冲突121.6.7. URL重写131.7. J2EE规范,javax.servlet包规范1.3和Resin不兼容141.8. Unsupported major.minor version 48.0141.9. 读取POST数据的问题142. Resin 3.1 FAQ技巧方法152.1. 启用调试日志152.1.1. 服务器和所有应用程序的完全调试日志152.1.2. 一个web应用程序的完全调试日志152.2. 线程转储162.2.1. 使用JDK5工具转储线程162.2.2. 通过发送一个信号转储线程172.2.3. 如果发送信号无效时的线程转储172.3. 内存溢出和垃圾收集

3、222.3.1. -verbosegc232.3.2. 使用堆转储检查内存使用242.3.3. 理解 java.hprof.txt 文件中的栈信息242.3.4. 理解 java.hprof.txt 文件中的CPU信息262.3.5. 监视垃圾回收272.3.6. 增加堆内存282.4. 清空classpath282.5. 监视HTTP传输282.6. 使用一个外部编译器292.7. 调整栈内存避免线程限制292.8. 使用操作系统的 netstat 命令获得当前 TCP/IP 端口的使用302.8.1. 连接状态302.8.2. 端口使用311. Resin 3.1 配置文件说明<!-

4、 - Resin 3.1 配置文件. -><resin xmlns=" xmlns:resin="<!- 加载resin/lib下的所有.jar文件-><class-loader> <tree-loader path="$resin.home/lib"/> <tree-loader path="$resin.root/lib"/></class-loader><!- - 管理配置 -><management path="$resin.r

5、oot/admin"></management><!- -JDK日志接口的配置. -><log name="" path="stdout:" timestamp="%H:%M:%S.%s "/><!- 日志信息的级别:'info' 生产环境 'fine' 开发环境 'finer' 调试环境 -><logger name="com.caucho" level="info"/>

6、<logger name="com.caucho.java" level="config"/><logger name="com.caucho.loader" level="config"/><!- - 环境上下文的检测时间,对于生产站点, 这个要设置长一点,例如600秒,10分钟 -><dependency-check-interval>2s</dependency-check-interval><!- - 发送邮件通知的SMTP服务器 ->

7、<system-property mail.smtp.host=""/><system-property mail.smtp.port="25"/><!- - 你可以把编译器改成 "javac", "eclipse" 或者 "internal". -><javac compiler="internal" args="-source 1.5"/><!- Security provider

8、s.- <security-provider>- .ernal.ssl.Provider- </security-provider>-><!- 去掉注释,如果你使用resin提供的xml应用- <system-property javax.xml.parsers.DocumentBuilderFactory- ="com.caucho.xml.parsers.XmlDocumentBuilderFactory"/>- <system-property javax.xml.parsers.SAXParserF

9、actory- ="com.caucho.xml.parsers.XmlSAXParserFactory"/>-><cluster id="app-tier"> <!- 设置集群上下文的根, 相对于server.root -> <root-directory>.</root-directory><server-default> <!- HTTP服务的端口-> <http address="*" port="8080"/>

10、 <!- - SSL端口配置: - - <http address="*" port="8443"> - <openssl> - <certificate-file>keys/gryffindor.crt</certificate-file> - <certificate-key-file>keys/gryffindor.key</certificate-key-file> - <password>test123</password> - </op

11、enssl> - </http> -> <!- - JVM参数设置 -> <jvm-arg>-Xmx256m</jvm-arg> <jvm-arg>-Xss1m</jvm-arg> <jvm-arg>-Xdebug</jvm-arg> <jvm-arg>-Dcom.sun.management.jmxremote</jvm-arg> <!- Uncomment to enable admin heap dumps 去掉这个如果你想管理内存堆的倾倒 - <

12、;jvm-arg>-agentlib:resin</jvm-arg> -> <watchdog-arg>-Dcom.sun.management.jmxremote</watchdog-arg> <!- 强制resin强制重起时的最小空闲内存 -> <memory-free-min>1M</memory-free-min> <!- 最大线程数量. -> <thread-max>256</thread-max> <!- 套接字等待时间 -> <socket-t

13、imeout>65s</socket-timeout> <!- 配置 keepalive -> <keepalive-max>128</keepalive-max> <keepalive-timeout>15s</keepalive-timeout> <!- - 如果使用的是UNIX,这里是启动的帐号和用户组. - <user-name>resin</user-name> - <group-name>resin</group-name> -></ser

14、ver-default> <!- 定义群集服务器 -><server id="" address="" port="6800"/> <!- Configures the persistent store for single-server or clustered 配置独立服务器或者群集的持久化存储,专业版的功能 -> <resin:if test="$resin.isProfessional()"> <persistent-store

15、type="cluster"> <init path="session"/> </persistent-store></resin:if> <!- 为了安全, 你可以为SSL会话(SSL sessions)定义一个不同的cookie. - <ssl-session-cookie>SSL_JSESSIONID</ssl-session-cookie> -> <!- 缓存启用 (专业版的功能) -> <resin:if test="$isResinPro

16、fessional"> <cache path="cache" memory-size="64M"> <!- Vary header rewriting for IE -> <rewrite-vary-as-private/> </cache></resin:if> <!- 启用周期性的服务器状态检查和死锁检查,所有的服务器可以添加 <url> 来检查。 -> <resin:if test="$isResinProfessional&quo

17、t;> <ping> <!- <url>http:/localhost:8080/test-ping.jsp</url> -> </ping></resin:if> <!- 包含web应用的默认行为 -><resin:import path="$resin.home/conf/app-default.xml"/> <!- 每一个web应用的默认参数 -><<SPAN class=hilite1>web-app-default</SPAN&

18、gt;> <!- 扩展库的公共jar文件,扩展是安全的即使没有类装载器知道的jars,装载的类将为每个应用分别装载,也就是这些类都是不同的-> <class-loader> <tree-loader path="$server.root/ext-webapp"/> </class-loader> <!- 设置缓存页、静态也的延时值 -> <cache-mapping url-pattern="/" expires="5s"/> <cache-mappi

19、ng url-pattern="*.gif" expires="60s"/> <cache-mapping url-pattern="*.jpg" expires="60s"/> <cache-mapping url-pattern="*.png" expires="60s"/> <!- 启用EL表达式 -> <allow-servlet-el/> <!- 安全原因, 默认禁用了会话的URLs -> <s

20、ession-config> <enable-url-rewriting>false</enable-url-rewriting> </session-config> <!- 安全原因, 在cookies中设置HttpOnly标志 - <cookie-http-only/> -> <!-一些JSP包有不正确的 .tld文件。可以把validate-taglib-schema设置成false,可能继续正常工作 - Some JSP packages have incorrect .tld files. It's po

21、ssible to set validate-taglib-schema to false to work around thesepackages. -> <jsp> <validate-taglib-schema>true</validate-taglib-schema> <fast-jstl>true</fast-jstl> <fast-jsf>true</fast-jsf> </jsp> </<SPAN class=hilite1>web-app-default<

22、;/SPAN>> <!- 简单的数据池配置 - The JDBC name is java:comp/env/jdbc/test <database> <jndi-name>jdbc/mysql</jndi-name> <driver type="org.gjt.mm.mysql.Driver"> <url>jdbc:mysql:/localhost:3306/test</url> <user></user> <password></passw

23、ord> </driver> <prepared-statement-cache-size>8</prepared-statement-cache-size> <max-connections>20</max-connections> <max-idle-time>30s</max-idle-time> </database> -> <!- 定义所有虚拟主机的默认配置 -> <host-default> <!- 如果和别的web服务器整合,这个可以被去掉,因

24、为web服务器也可以记录这些信息。 -> <access-log path="logs/access.log" format='%h %l %u %t "%r" %s %b "%Refereri" "%User-Agenti"' rollover-period="1W"/> <!- war 文件的布置目录 -> <web-app-deploy path="webapps"/> <!- ear文件的布置目录 -&g

25、t; <ear-deploy path="deploy"> <ear-default> <ejb-server> <config-directory>WEB-INF</config-directory> <data-source>jdbc/test</data-source> </ejb-server> </ear-default> </ear-deploy> <!- rar文件的布置目录 -> <resource-deploy path

26、="deploy"/> </host-default> <!- 虚拟主机的布置目录 -> <host-deploy path="hosts"> <host-default> <resin:import path="host.xml" optional="true"/> </host-default> </host-deploy> <!- 默认的虚拟主机配置 -> <host id="" r

27、oot-directory="."> <!- 配置默认的应用 webapp's ROOT -> <web-app id="/" root-directory="webapps/ROOT"/> <web-app id="/resin-admin" root-directory="$resin.home/php/admin"> <!- - 管理应用程序 /resin-admin - password is the md5 hash of the

28、 password。md5码的密码。 - localhost is true to limit access to the localhost。localhost设置成true,这样只有localhost才能访问 -> <prologue> <resin:set var="resin_admin_user" value=""/> <resin:set var="resin_admin_password" value=""/> <resin:set var="

29、resin_admin_external" value="false"/> </prologue> </web-app> </host></cluster><!- - Configuration for the web-tier/load-balancer -><resin:if test="$resin.isProfessional()"> <cluster id="web-tier"> <server-default>

30、<!- The http port -> <http address="*" port="9080"/> </server-default> <server id="web-a" address="" port="6700"/> <cache path="cache" memory-size="64M"/> <host id=""> <web

31、-app id="/"> <rewrite-dispatch> <load-balance regexp="" cluster="app-tier"/> </rewrite-dispatch> </web-app> </host> </cluster></resin:if></resin>2. Resin 3.1 FAQ症状1.1. Resin停止响应可能是一个线程死锁的问题,应该进行线程转储。启用完全调试日志模式,检查日志最后的纪录

32、看看发生了什么。 1.2. Resin不停重启动启用完全调试日志模式,检查记录看看Resin为什么不停的重启它。 1.3. java.lang.OutOfMemoryError错误,应用程序内存溢出使用JVM启动参数增加堆(heap)内存。转储堆,看看那个对象无法被垃圾回收器无法回收。转储线程,检查占用着对象的不能释放的线程一个OutOfMemoryError错误通常意味着堆(heap)内存被用尽。一般是应用程序代码保持了对不在使用的对象的引用,垃圾回收器无法对其进行回收。转储堆,能够查到什么代码和什么种类的对象被占用了。如果对转储或者其它监视工具显示服务器和你的程序实际没有超出堆内存,那么

33、OutOfMemoryError意味着JVM超出了虚拟内存,也就是底层的malloc()调用失败。通常这种情况,通过使用操作系统工具显示内存使用,JVM自己能够显示其自己的堆内存,但是操作系统工具确显示进程占用了大量的内存。在Windows下使用任务管理器,Unix下使用top或者ps 命令。 JVM无法进行堆内存分配可能有如下原因:线程,特别是线程堆占用虚拟内存。JNI库可能调用malloc或者nmap占用虚拟内存。这包括很多数据库驱动,也包含一些Resin使用的JNI代码。对于.jar/.zip文件,JDK要分配虚拟内存。如果你打开了大量的jar文件,你可能会遇到问题。可以想到用于打开ja

34、r的getResourceAsStream没有关闭将会耗尽.jar内存。 1.4. 运行一会儿,服务器开始变得非常慢 这可能是一个垃圾回收问题。如果你的内存缺乏,然后又创建了大量的对象,这导致垃圾回收器耗尽CPU。如果你内存溢出,JVM将会慢慢停止(连续地进行垃圾收集)直到它死亡。 监视垃圾收集。 转储堆,看看是否是有对象无法被回收。 参看JVM垃圾回收参数调整的文档获得更多垃圾回收的信息。 可能有一个死循环的线程或者一个请求耗尽资源。回应一个请求的线程如果不能返回,Resin就没法再次利用它,那么可用来服务的线程就会越来越少。 进行线程转储,检查可能占用对象的无法释放的线程。 1.5. CP

35、U尖峰,高的CPU使用率 转储线程,检查那些线程在无限循环。 检查垃圾收集的部分。 1.6. 会话(sessions)变成null,会话丢失 1.6.1. 调试日志首先启用调试日志。特别是浏览器请求提交的头信息能够显示一个客户端的JSESSIONID状态,日志也能说明Resin什么时候识别、创建和失效一个会话。 1.6.2. Resin会话配置另一个可能是session-max设置过低,导致当前用户建立会话的数量大于你设置的这个值。另一个可能是会话超时,你可以通过session-timeout标签来配置它。<web-app id='/'> . <session

36、-config> <!- timeout after 120 minutes -> <session-timeout>120</session-timeout> <!- up to 4096 sessions at once -> <session-max>4096</session-max> </session-config> .</web-app> 1.6.3. 应用程序重载无论何时,一个java源文件、web.xml或者resin.xml改变,Resin都会重启应用程序。如果这个情况发生

37、,你当前的会话就会丢失,除非你配置了一个持久性会话存储。 1.6.4. 浏览器cookie的局限一些用户报告,如果他们的应用程序使用大量的cookie,浏览器将会丢弃旧的cookie为新的腾出空间。这就会出现浏览器丢失了Resin 用来跟踪会话的cookie。IE浏览器用户特别容易遇到这个问题。如果你的应用程序使用大量的cookie,最好的解决方案就是减少cookie数量和 cookie数据的大小。Resin使用一个单一的cookie其存储相对很少的数据用拉跟踪用户的会话ID。应用程序存储在cookie中的信息可以使用HttpSession对象来存储。作为最后的手段,你可以配置Resin总是使

38、用URL重写,这需要把enable-cookies设置成 false。由于安全的原因URL重写式不推荐的,因为重写URL增加了重写某些页面丢失调用的高可能性。<web-app id='/'> . <session-config> <enable-cookies>false</enable-cookies> <enable-url-rewriting>true</enable-url-rewriting> </session-config> .</web-app> 1.6.5. coo

39、kie域名的问题如果你的cookie域名不兼容也可能丢失会话。例如,如果你有一个服务器使用cookie域名"",另一个使用 "",在浏览器中""的cookie会干扰在""上的会话。方法是改变cookie域名""为""。 你可以在session-config标签中设置 cookie域名。 1.6.6. cookie名称冲突如果你使用Resin和另一个应用服务器(例如Tomcat),你可能遇到这个冲突,因为它们使用相同的cookie名称(他通常是 JSESSIONID) 来跟踪会

40、话。Resin提供session-cookie 和 ssl-session-cookie让你可以改变Resin使用的cookie名称。改变用来跟踪会话的cookie名称的片断: <cluster> . <session-cookie>RJESSESSIONID</session-cookie> 1.6.7. URL重写如果你忘记了重写一个URL,一个需要重写的用户当访问到这个URL时将丢失他们的会话。Resin在一个用户浏览器和一个会话 (session)之间建立一个关联,是通过为每一个新请求返回一个惟一的id。这可通过两种方式之一来完成:使用cookie或

41、者URL重写。 Resin首先尝试向用户浏览器发送一个包含惟一会话ID的cookie来跟踪一个用户的会话。有时Resin不能建立cookie,不是因为用户在其浏览器禁用了cookies就是因为某些浏览器不支持它们(例如一些HDML和WML浏览器)。如果cookie不能建立那么就会使用URL重写。在这种情况下,Resin重写每一个它提交给用户的URL,让其包含一个名称为_jsessionid的参数。然后为每一个新来的请求做的第一件事就是查找这个参数,如果这个参数存在那么就知道一个会话已经建立,它移出参数并使用它来查找用户会话对象。URL重写需要开发者的协同合作。开发者必须编码每一个URL 引用让

42、Resin有一个合适的机会放置_jsessionid参数。 使用JSTL实现URL重写 <% taglib prefix='c' uri=' %> Time to go <a href="<c:url _fcksavedurl="<c:url _fcksavedurl="<c:url value='home.jsp' />">Home</a>! 使用Java scriptlet实现URL重写 <%String homeUrl = response.e

43、ncodeURL("home.jsp");%> <%- the presentation -%> Time to go <a href="<%= homeUrl %>">Home</a>! 1.7. J2EE规范,javax.servlet包规范1.3和Resin不兼容参看清除classpath环境变量。 1.8. Unsupported major.minor version 48.0这个错误经常在发现一个冲突的jar时发生,参看清除classpath环境变量。 如果环境变量classpath被完全

44、清除,然而一个JDK或者旧Resin的一个jar或者一些其它组件出现在的什么地方,如果你已经在那些地方添加了,在你的JAVA_HOME树里的一些jar可能有一个问题,那里可有一个和你的web程序WEB-INF/lib/目录下冲突的jar。另一种可能是你还没设置JAVA_HOME,或者你使用了一个冲突的JDK的一些组件。如果在Windows上,检查JAVA_HOME之外的java.exe的拷贝,例如C:/WINDOWS/java.exe或者在你PATH路径里其它地方的java.exe。 1.9. 读取POST数据的问题首先启用调试日志。调试日志会显示发送到Resin的请求,提供一些Resin如何

45、处理这些数据的信息。最重要的是确保在读取POST参数之前编码设置正确。浏览器总是发回和输出页面编码相同的参数。因为请求不包含编码,应用程序代码需要确保编码匹配。因此第一件事就是确定发送到浏览器的表单的编码。你的应用程序总应该指定它。一旦你指定了它,你就知道浏览器POST使用编码。(这里UTF-8是个自然的编码选择,我不能确信你为什么使用其它的编码)。在读取POST参数之前确保设置了正确的编码,你可以调用request.setCharacterEncoding(encoding)来设置编码。 2. Resin 3.1 FAQ技巧方法 2.1. 启用调试日志Resin使用JDK日志工具提供了大量的

46、诊断信息。通过使用一个空名称(匹配所有名字)可以启用完全调试日志,调试级别为“全部”。因为将会产生大量信息,把这些信息放在一个单独的文件中比较好。 2.1.1. 服务器和所有应用程序的完全调试日志下面的配置每天创建一个日志,当一个问题出现时用来查找问题出现在什么地方。因为日志配置在resin.xml中,日志的捕捉是服务器和其上所有应用程序的。日志输出的信息在 $RESIN_HOME/log/debug.log。 <!- resin.xml -><resin xmlns=" <log-handler name="" level="a

47、ll" path="log/debug.log" timestamp="%H:%M:%S.%s %thread " /> <logger name="" level="finer" /> </resin>有其它一些的日志配置选项,请参看Resin日志文档。 2.1.2. 一个web应用程序的完全调试日志通常你一般仅需要一个程序输出的调试日志。日志配置记录放在<web-app-root>/WEB-INF/web.xml中,那么仅这个web应用程序的日志信息被输出到日

48、志文件中。下面的配置每天创建一个调试日志,位置<web-app-root>/WEB-INF /work/debug.log。<!- <web-app-root>/WEB-INF/web.xml -> <web-app> . <log name="" path="WEB-INF/work/debug.log" timestamp="%H:%M:%S.%s %thread " /> <logger name="" level="finer&qu

49、ot; /> .</web-app> 2.2. 线程转储如果应用程序好像有问题或者超出资源泄露,线程转储能够显示服务器的状态。对于服务器调试Java的县城转储是一个重要的工具。因为 Servlet是多线程的,没有处理好的话很可能出现死锁,或者出现死循环和导致内存溢出错误。特别是你使用了第三方软件例如数据库、EJB和Corba ORBs。 2.2.1. 使用JDK5工具转储线程在JDK5里可以使用jps和jstack,一个快捷的命令行方法获得当前所有线程的堆栈跟踪信息。# jps12903 Jps20087 Resin# jstack 20087Attaching to pro

50、cess ID 20087, please wait.Debugger attached successfully.Client compiler detected.JVM version is 1.5.0-beta2-b51Thread 12691: (state = BLOCKED) - java.lang.Object.wait(long) (Compiled frame; information may be imprecise) - com.caucho.util.ThreadPool.runTasks() bci=111, line=474 (Compiled frame) - c

51、om.caucho.util.ThreadPool.run() bci=85, line=423 (Interpreted frame) - java.lang.Thread.run() bci=11, line=595 (Interpreted frame) Thread 12689: (state = BLOCKED) - java.lang.Object.wait(long) (Compiled frame; information may be imprecise) - com.caucho.util.ThreadPool.runTasks() bci=111, line=474 (C

52、ompiled frame) - com.caucho.util.ThreadPool.run() bci=85, line=423 (Interpreted frame) - java.lang.Thread.run() bci=11, line=595 (Interpreted frame) . 2.2.2. 通过发送一个信号转储线程在 Windows, ctrl-break会产生线程转储。在Unix, "kill -QUIT" 会产生线程转储。 2.2.3. 如果发送信号无效时的线程转储你可以在启动JVM时指定附加的参数允许附加一个调试器而不是发送信号来转储线程。你然

53、后在任何时候附加调试器来得到线程转储。 这种方法在所有的操作系统上得到支持。 下面是是逐步的指导: 1. 使用附加的参数启动Resin来允许一个调试器附加: resin.xml for debugging <resin xmlns=" <cluster id=""> <server-default> <jvm-arg>-Xdebug</jvm-arg> <jvm-arg>-Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5432<

54、/jvm-arg> </server-default> <server id="" address="" port="6800" /> </cluster> </resin> 2. 等待,直到你认为应用程序出现了死锁或者失去控制。 3. 打开另一个终端 (window), 使用jdb连接正在运行的Resin实例: $JAVA_HOME/bin/jdb -connect com.sun.jdi.SocketAttach:hostname=localhost,port

55、=5432 jdb会显示类似如下信息: Set uncaught java.lang.Throwable Set deferred uncaught java.lang.Throwable Initializing jdb . > 4. 使用 "suspend" 命令, 然后 "where all"命令获得一个线程转储: 例子: jdbc suspend > suspend All threads suspended. > where all tcpConnection-6862-3: 1 java.lang.Object.wait (

56、native method) 2 com.caucho.server.TcpServer.accept (TcpServer.java:650) 3 com.caucho.server.TcpConnection.accept (TcpConnection.java:208) 4 com.caucho.server.TcpConnection.run (TcpConnection.java:131) 5 java.lang.Thread.run (Thread.java:536) tcpConnection-543-2: 1 java.lang.Object.wait (native meth

57、od) 2 com.caucho.server.TcpServer.accept (TcpServer.java:650) 3 com.caucho.server.TcpConnection.accept (TcpConnection.java:208) 4 com.caucho.server.TcpConnection.run (TcpConnection.java:131) 5 java.lang.Thread.run (Thread.java:536) . 5. 使用 "resume" 命令来恢复进程 > resume Unix 用户(和Windows上的Cyg

58、win用户)可以使用一个脚本:resin-thread-dump.sh #!/bin/shecho -e "suspendnwhere allnresumenquit" | $JAVA_HOME/bin/jdb -connect com.sun.jdi.SocketAttach:hostname=localhost,port=5432 虽然没有进行过严格基准测试,好像使用线程转储参数启动的JVM在性能上影响不大。2.2.4. 理解线程转储在任何情况下,你会最终得到类似如下的跟踪调试信息(不同的JDK有稍微的差别): Full thread dump: "tcpConnectio

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论