heartbeat threads blocks process shutdown because its hashed-wheel-timer is non-daemon thread.
@Override
    public URL getUrl() {
        return channel.getUrl();
    }
    @Override
    public InetSocketAddress getRemoteAddress() {
        return channel.getRemoteAddress();
    }
    @Override
    public ResponseFuture request(Object request, int timeout) throws RemotingException {
        return channel.request(request, timeout);
    }
    @Override
    public ChannelHandler getChannelHandler() {
        return channel.getChannelHandler();
    }
    @Override
    public boolean isConnected() {
        return channel.isConnected();
    }
    @Override
    public InetSocketAddress getLocalAddress() {
        return channel.getLocalAddress();
    }
    @Override
    public ExchangeHandler getExchangeHandler() {
        return channel.getExchangeHandler();
    }
    @Override
    public void send(Object message) throws RemotingException {