2011-03-16 55 views
2

我使用tomcat作为我的web服务器。我的应用程序需要用户点击编辑按钮后重新启动tomcat服务器。对于我已经写了代码我控制器上如下:Tomcat问题:java.net.BindException:地址已经在使用<null>:8080 at org.apache.tomcat.util.net.JIoEndpoint.init(JIoEndpoint.java:549)

if (updateResult ==1) 
{ 
    //String command = "/home/sunil_shiwankar/Tempo/apache-tomcat-6.0.32/startup.sh";//for linux use .sh 
    String command = this.getClass().getResource("/").getPath(); 
    System.out.println("{{{{{{{{{{{{{{{{{{{{{{{{{{{"+ command); 
    command = command.replace(command.substring(command.lastIndexOf("webapps"), command.length()), ""); 
    System.out.println("{{{{{{{{{{{{{{{{{{{{{{{{{{{ AFTER MODIFYING COMMAND IS "+ command); 
    try 
    { 
     String shutDownCommand = command+"bin/shutdown.sh"; 
     Process child = Runtime.getRuntime().exec(shutDownCommand); 
     System.out.println("{{{{{{{{{{{{{{{{{{{{{{{{{{{ SHUTDOWN TOMCAT SUCCESSFULLY }}}}}}}}}}}}}}"); 
    } catch (Exception e) 
    { 
     String inExceptionStartCommand = command+"bin/startup.sh"; 
     Process child = Runtime.getRuntime().exec(inExceptionStartCommand); 
     System.out.println("{{{{{{{{{{{{{{{{{{{{{{{{{{{ TOMCAT STARTED WITH EXCEPTION SUCCESSFULLY }}}}}}}}}}}}}}"); 
     e.printStackTrace(); 
    } 
     String normalStartCommand = command+"bin/startup.sh"; 
     Process child = Runtime.getRuntime().exec(normalStartCommand); 
     System.out.println("{{{{{{{{{{{{{{{{{{{{{{{{{{{ TOMCAT STARTED WITOUT EXCEPTION SUCCESSFULLY }}}}}}}}}}}}}}"); 
} 

我的Tomcat版本6.0.32,虽然乳宁我的应用程序关闭它Tomcat服务器proparly并开始与异常

java.net.BindException: Address already in use <null>:8080 
    at org.apache.tomcat.util.net.JIoEndpoint.init(JIoEndpoint.java:549) 
    at org.apache.coyote.http11.Http11Protocol.init(Http11Protocol.java:176) 
    at org.apache.catalina.connector.Connector.initialize(Connector.java:1022) 
    at org.apache.catalina.core.StandardService.initialize(StandardService.java:703) 
    at org.apache.catalina.core.StandardServer.initialize(StandardServer.java:838) 
    at org.apache.catalina.startup.Catalina.load(Catalina.java:538) 
    at org.apache.catalina.startup.Catalina.load(Catalina.java:562) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at org.apache.catalina.startup.Bootstrap.load(Bootstrap.java:261) 
    at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:413) 
Caused by: java.net.BindException: Address already in use 
    at java.net.PlainSocketImpl.socketBind(Native Method) 
    at java.net.PlainSocketImpl.bind(PlainSocketImpl.java:365) 
    at java.net.ServerSocket.bind(ServerSocket.java:319) 
    at java.net.ServerSocket.<init>(ServerSocket.java:185) 
    at java.net.ServerSocket.<init>(ServerSocket.java:141) 
    at org.apache.tomcat.util.net.DefaultServerSocketFactory.createSocket(DefaultServerSocketFactory.java:50) 
    at org.apache.tomcat.util.net.JIoEndpoint.init(JIoEndpoint.java:538) 
    ... 12 more 
16 Mar, 2011 10:17:43 AM org.apache.catalina.core.StandardService initialize 
SEVERE: Failed to initialize connector [Connector[HTTP/1.1-8080]] 
LifecycleException: Protocol handler initialization failed: java.net.BindException: Address already in use <null>:8080 
    at org.apache.catalina.connector.Connector.initialize(Connector.java:1024) 
    at org.apache.catalina.core.StandardService.initialize(StandardService.java:703) 
    at org.apache.catalina.core.StandardServer.initialize(StandardServer.java:838) 
    at org.apache.catalina.startup.Catalina.load(Catalina.java:538) 
    at org.apache.catalina.startup.Catalina.load(Catalina.java:562) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at org.apache.catalina.startup.Bootstrap.load(Bootstrap.java:261) 
    at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:413) 

请帮助我解决

预先感谢

+0

http://stackoverflow.com/questions/5310945/deployment-errorstarting-of-tomcat-failed-the-server-port-8080-is-already-in-us/5310993#5310993 – 2011-03-16 05:53:04

回答

3

该代码虽然难以阅读,但似乎并未等待关机发生。我怀疑当您尝试重新启动时,它仍处于关闭过程中。当然,异常表明它仍在运行,因为它的http端口仍在使用中。要暂时追踪问题,请尝试在关机和启动之间进行休眠,以查看是否可以解决问题。

+0

我试着给1000毫秒的睡眠,但异常是相同的 – Chitresh 2011-03-16 05:44:04

+0

尝试10或100次。某些servlet可能需要做一些不重要的工作(例如,在服务器关闭之前,“完成请求”并将状态刷新到磁盘)。 – 2011-03-16 06:25:14

+0

感谢斯蒂芬和梅尔夫因为你的帮助。你的帮助对我有用。 – Chitresh 2011-03-16 07:52:15

2

其他一些应用程序已经在侦听端口8080杀死该进程,然后运行您的服务器。一次只能附加一个进程。查找已经绑定到该端口的进程是特定于操作系统的。

+0

但正如我所说所有关于用户操作,所以我如何在运行时杀死进程。首先当我运行我的应用程序服务器启动端口8080.但在用户编辑操作我重新启动我的服务器,然后这个异常即将到来,在这之间我可以杀死进程。有计时器任务正在后台运行任何计时器任务的问题 – Chitresh 2011-03-16 05:37:34

+0

它的计时器任务是一个守护进程线程,它不应该阻止JVM关闭。如果不 ...以及您的servlet需要倾听相关的生命周期事件并以适当的方式关闭计时器任务。 – 2011-03-16 06:28:38

0

我面临的BindException的8080端口上同样的问题我按照这些步骤:

netstat -tulpn 

它列出了所有的进程ID,他们被监听的端口。然后我在列表中搜索端口8080,然后查找其PID。该PID为1654然后我用以下命令杀死进程:

kill -9 1654 

然后,我开始Tomcat服务器,它工作得很好。希望能帮助到你! :)

0

我也有这个问题,在我的情况下,在尝试配置Tomcat时,我创建了2个“引擎”。我曾在./conf/server.xml这样一行:

<Engine name="Catalina" defaultHost="localhost">

我改变了这种设置,在更早的server.xml中匹配的设置如下:

<Engine name="Standalone" defaultHost="localhost">

我没有意识到的是,这在./conf/Catalina/和./conf/Standalone/中创建了两个独立的配置。这两个相互冲突,给了我与本文相同的错误。

我关闭了tomcat,删除了./conf/Catalina/和./conf/Standalone子目录,并重新启动。 Tomcat创建了新的,没有更多的冲突!

相关问题