2010-03-09 265 views
4

我在我的服務器應用程序中有一個相當惱人的問題。Apache Mina服務器重啓java.net.BindException:已經在使用的地址

我綁定的Apache米娜用下面的代碼:

acceptor.bind(new InetSocketAddress(PORT)); 

凡受體爲NioSocketAcceptor。 通過HTTP接口,我可以關閉服務器,以便重新啓動它。

Server.ioAcceptor.unbind(new InetSocketAddress(Server.PORT)); 
     for(IoSession session: Server.ioAcceptor.getManagedSessions().values()){ 
      if(session.isConnected() && !session.isClosing()){ 
       session.close(false); 
      } 
     } 
     Server.ioAcceptor.dispose(); 

     Main.transport.stop(); 
     Logger.getRootLogger().warn("System going down. Request from "+context.getRemoteAddress()); 
     System.exit(10);  

這是我用來停止Mina服務器的代碼。但是,如果我嘗試在接下來的幾分鐘內再次啓動服務器。 (5分鐘到15分鐘之間)我在啓動時遇到以下異常: java.net.BindException:已在使用的地址

我也嘗試了一個簡單的ioAcceptor.unbind(),但沒有區別。 服務器在OpenJDK的Centos 5上運行。 Apache Mina版本是2.0 RC1。

非常感謝您提供有關如何解決此問題的任何建議。

回答

0

不是我熟悉的MINA,但如何做

netstat的-apn | grep PORT
ps -ef | grep java

是什麼樣子?

哦,好的。你用root用戶權限命令了嗎?

+0

它們都沒有顯示任何內容。 「lsof -i」也顯示該端口上沒有連接 – Kosaki 2010-03-09 18:41:44

+0

@Kosaki:PS。對不起,我應該做出這個評論,而不是一個答案。 – 2010-03-09 19:45:52

0

您需要小心關閉,否則TCP以這種方式運行。見this

+0

謝謝。我現在正在嘗試,但我必須等待才能看到結果。關於如何在沒有將其放到生產服務器上的情況下進行測試的任何想法?我通常會打開大約2000個套接字,並且很難在測試環境中複製。 – Kosaki 2010-03-11 20:22:10

+0

只需打開並關閉一個插座,看看它是否有效? – LenW 2010-04-01 15:09:49

6

我不知道的根本原因,但我讀的地方這似乎修復工作對我來說:

acceptor.setReuseAddress(true); 

簡單地增加,讓我關閉並重新啓動

3

一對夫婦的事情,我想補充:

  1. 設置你的受重用綁定地址
    acceptor.setReuseAddress(true)
  2. 在您的關閉塊中,而不是
    session.close(false)
    使用
    session.close(true)
    這將立即關閉會話而不是等待刷新。

參考文獻:

會話關閉 - http://mina.apache.org/report/trunk/apidocs/org/apache/mina/core/session/IoSession.html#close(boolean

ServerSocket的複用地址 - http://download.oracle.com/javase/1.5.0/docs/api/java/net/ServerSocket.html?is-external=true#setReuseAddress(boolean

0

添加以下代碼:

acceptor.setReuseAddress(true) 

氏s允許端口被重用。

0

首先通過檢查OS配置 「的sysctl net.ipv4.tcp_fin_timeout」,然後將其修改爲30秒;二「的sysctl -a | grep的net.ipv4.tcp_tw」,修改這樣 值net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_tw_recycle = 1

相關問題