Tomcat配置远程debug

在tomcat的启动脚本中添加

-server -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,address=9865,server=y,suspend=n

其中 address=9865是没被使用的端口号。连接方式有两种,为dt_shmem和dt_socket,分别表示本机调试和远程调试。

idea中配置

debug

杀掉nginx进程后丢失nginx.pid,如何重新启动nginx

nginx进程被意外关闭,使用nginx -s reload重启时报如下错误:
nginx: [error] open() “/var/run/nginx.pid” failed (2: No such file or directory)
这是因为nginx进程被杀死后pid丢失了,下一次再开启nginx -s reload时无法启动
解决办法:
nginx -s reload 只是用来告诉运行中的nginx进程加载配置,进程关闭以后,没有进程发送信号,应该使用
nginx -c /path/to/config/nginx.conf

Jetty 9 正式版发布!!!

jetty

Jetty 9 正式版来了!!!版本标签:Jetty 9.0.0.v20130308

Jetty 9 支持 SPDY 和 WebSocket。

下载地址:

http://download.eclipse.org/jetty/stable-9/dist/
Maven:

http://search.maven.org/#search%7Cga%7C1%7Cg%3A%22org.eclipse.jetty%22%20AND%20v%3A%229.0.0..v20130308%22

<groupId>org.eclipse.jetty</groupId>
<version>9.0.0.v20130308</version>

Jetty 9.x 特性:

Completely overhauled I/O layer
Servlet API 3.0
JSP 2.2
SPDY/3
WebSocket (RFC-6455)
移植到 Jetty 9.x 的要求: 阅读详细 »

Tomcat启动时自动加载一个类

    有时候在开发Web应用的时候,需要tomcat启动后自动加载一个用户的类,执行一些初始化方法,如从数据库中加载业务字典到内存中,因此需要在tomcat启动时就自动加载一个类,或运行一个类的方法。 可以采用在WEB-INF/web.xml中添加一个监听程序(ServletContextListener配置项),步骤如下:
 1) 增加一个监听程序 MyServletContextListener.java,实现javax.servlet.ServletContextListener接口
 package test.startup;

 import javax.servlet.ServletContextEvent;
 import javax.servlet.ServletContextListener;

 public class MyServletContextListener implements ServletContextListener 
 {

  public void contextDestroyed(ServletContextEvent arg0) 
  {

  }

  public void contextInitialized(ServletContextEvent arg0) 
  {
   System.out.println("加载业务字典");
   try 
   {
    com.eos.common.dict.DictMap.loadData();
   }
   catch(Exception e) 
   {
    System.out.println("加载业务字典失败!");
    e.printStackTrace();
   }
  }
 }

 2) 配置监听器web.xml:

 <listener>
  <listener-class>test.startup.MyServletContextListener</listener-class>
 </listener>


 注意:应用事件监听器程序是建立或修改servlet环境或会话对象时通知的类。它们是servlet规范的版本2.3中的新内容。注册一个监听程序涉及在 web.xml的web-app元素内放置一个listener元素。虽然listener元素的结构很简单,但请不要忘记,必须正确地给出web- app元素内的子元素的次序。listener元素位于所有的servlet 元素之前以及所有filter-mapping元素之后。此外,因为应用生存期监听程序是serlvet规范的2.3版本中的新内容,所以必须使用 web.xml DTD的2.3或以后版本,而不是2.2版本,如下:
 <web-app id="WebApp_ID" version="2.4"
 xmlns="http://java.sun.com/xml/ns/j2ee"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
  ...
 </web-app>

apache AB测试

ab是apache附带的一个命令行工具,可以让你对服务器做非常基本的性能测试。

执行命令:ab -n 10 -c 10 -T “application/x-www-form-urlencoded” -p post.txt http://localhost:8080/ClusterService/queryInterface
命令的意思:向http://localhost:8080/ClusterService/queryInterface发送10个请求(-n 10) ,并每次发送10个请求(-c 10),也就是说一次性发送10个请求

=========================测试报告=========================
#并发级别 10
Concurrency Level: 10
#测试耗费的时间
Time taken for tests: 2.750000 seconds
#完成的请求数
Complete requests: 10
#失败的请求数
Failed requests: 0
#写入错误数
Write errors: 0
#总发送字节数
Total transferred: 137380 bytes
#html内容传输量
HTML transferred: 135970 bytes
#注重的指标之一,相当于LR中的每秒事物数(每秒处理请求数),后面括号中的mean是一个平均值
Requests per second: 3.64 [#/sec] (mean)
#注重的指标之二,相当于LR中的平均事物相应时间,mean表示的是一个平均值
Time per request: 2750.000 [ms] (mean)
#所有并发请求的平均时间
Time per request: 275.000 [ms] (mean, across all concurrent requests)
#平均每秒网络上的流量,可以帮助排除是否存在网络流量过大导致响应时间延长的问题
Transfer rate: 48.73 [Kbytes/sec] received
0.87 kb/s sent
49.65 kb/s total

#连接时间:网络上消耗的时间分解
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 1 4.8 0 15
Processing: 2562 2643 59.2 2687 2734
Waiting: 2562 2641 61.4 2687 2734
Total: 2562 2644 58.5 2687 2734

#在一定时间内送达时间的百分比;在发送中每个请求都有一个响应时间,50%的用户小于2687毫秒
Percentage of the requests served within a certain time (ms)
50% 2687
66% 2687
75% 2687
80% 2687
90% 2734
95% 2734
98% 2734
99% 2734
100% 2734 (longest request)

#每次请求程序耗时(改结果依赖于线程调度,理论时间介于单次请求时间和10*单次请求时间)
总耗时:953ms
总耗时:1157ms
总耗时:1516ms
总耗时:1750ms
总耗时:1813ms
总耗时:2125ms
总耗时:2203ms
总耗时:2235ms
总耗时:2437ms
总耗时:2578ms

#第二次执行
Thread[http-8080-11,5,main]总耗时:1031ms
Thread[http-8080-3,5,main]总耗时:1313ms
Thread[http-8080-10,5,main]总耗时:1484ms
Thread[http-8080-8,5,main]总耗时:1625ms
Thread[http-8080-4,5,main]总耗时:1891ms
Thread[http-8080-7,5,main]总耗时:1969ms
Thread[http-8080-1,5,main]总耗时:2234ms
Thread[http-8080-9,5,main]总耗时:2328ms
Thread[http-8080-6,5,main]总耗时:2391ms
Thread[http-8080-2,5,main]总耗时:2531ms

tomcat报java.lang.UnsupportedClassVersionError错误的原因

 

出现java.lang.UnsupportedClassVersionError 错误的原因,是因为我们使用高版本的JDK编译的Java class文件试图在较低版本的JVM上运行,所报的错误。因为,高版本的JDK生成的class文件使用的格式,可能与低版本的JDK的.class文件格式不同。这样,低版本的JVM无法解释执行这个.class文件,会抛出java.lang.UnsupportedClassVersionError不支持的Class版本错误。

目前,使用新版本的IDE编辑器可能会造成你遭遇java.lang.UnsupportedClassVersionError 错误。MyEclipse9.0这个新版的IDE工具。进入首选项—Java—编译器,可以看到,默认的编译器依从等级是6.0,这里改为5,因为我们的程序需要运行在JDK1.5的JVM上。

同一配置区下的已安装JRE中,不要安装JRE,而是安装JDK,指定1.5的JDK。

在MyEclipse—-应用服务器下,指定Tomcat5。指定Tomcat使用jdk1.5。

这样,就全部指定使用Jdk5来编译和运行程序了。如果全部指定jdk6也是可以的。但是,绝对不能够使用jdk6编译程序,而又在jdk1.5上运行程序,那样将会抛出java.lang.UnsupportedClassVersionError不支持的Class版本错误。