Vic
Vic

Reputation: 22041

Exclusively bind to a port with Jetty

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

Answers (3)

mihmig
mihmig

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

Zorg
Zorg

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

Jayan
Jayan

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

Related Questions