Reputation: 22041
Currently we have a Jetty 7 server started this way
//create a new server listening on the 80
Server server = new Server();
SelectChannelConnector connector = new SelectChannelConnector();
connector.setReuseAddress(false);
connector.setPort(80);
server.setConnectors(new Connector[]{connector});
...
server.start();
And when there's no other application catching the 80 port, all is fine. I've also ensured that two Instances of Jetty can't start listening on the same port because of the setReuseAddress
.
There is however a case when some other application starts listening on port 80 and Jetty server still manages to start (failing to serve connections there).
C:\Users\bacadmin>netstat -anov | find ":80 "
TCP 0.0.0.0:80 0.0.0.0:0 LISTENING 3976
TCP 0.0.0.0:80 0.0.0.0:0 LISTENING 3808
TCP [::]:80 [::]:0 LISTENING 3976
How is that possible and what can be done to insure that Jetty gets an exception during startup if the port isn't open.
Upvotes: 1
Views: 6982
Reputation: 21
You can try to specify IP-address and port by adding this line of code
server = new Server(new InetSocketAddress("127.0.0.1", 8080));
in this case jetty will throw an exception:
java.net.BindException: Address already in use: bind
Upvotes: 2
Reputation: 596
Jetty and any Java based service can bind a busy port with no exception.
If you use Sun JVM 7 as a host JVM be aware of that there is an issue in it related to IPv6 stack. It is still not fixed.
Good news, a workaround exists. Just use -Djava.net.preferIPv4Stack=true
. This works only if you have no plans to support IPv6 in your application.
Thanks.
Upvotes: 4
Reputation: 18458
Jetty throws exception if the port is already in use. Are you catching all exceptions and suppressing it somewhere?
Regarding reserving a port: This is not really possible. If you keep running your jetty application all the time and use 80, then that kind of reserved it for you...
(added code to help in identifying the root cause)
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.Connector;
import org.eclipse.jetty.server.nio.SelectChannelConnector;
public class Main {
public static void main(String[] args) {
Server server = new Server();
SelectChannelConnector connector = new SelectChannelConnector();
connector.setReuseAddress(false);
connector.setPort(80);
server.setConnectors(new Connector[]{connector});
try {
server.start();
} catch (Exception e) {
e.printStackTrace();
}
}
}
In my environment, this definitely get java.net.BindException: Address already in use: bind
Upvotes: 1