heartbeat threads blocks process shutdown because its hashed-wheel-timer is non-daemon thread.
}
    @Override
    public boolean isBound() {
        return server.isBound();
    }
    @Override
    public InetSocketAddress getLocalAddress() {
        return server.getLocalAddress();
    }
    @Override
    public URL getUrl() {
        return server.getUrl();
    }
    @Override
    public ChannelHandler getChannelHandler() {
        return server.getChannelHandler();
    }
    @Override
    public void reset(URL url) {
        server.reset(url);
        try {
            if (url.hasParameter(Constants.HEARTBEAT_KEY)
                    || url.hasParameter(Constants.HEARTBEAT_TIMEOUT_KEY)) {
                int h = url.getParameter(Constants.HEARTBEAT_KEY, heartbeat);
                int t = url.getParameter(Constants.HEARTBEAT_TIMEOUT_KEY, h * 3);
                if (t < h * 2) {
                    throw new IllegalStateException("heartbeatTimeout < heartbeatInterval * 2");
                }
                if (h != heartbeat || t != heartbeatTimeout) {
                    heartbeat = h;