class KafkaRaftClient implements RaftClient {

    public void poll() throws IOException {
        GracefulShutdown gracefulShutdown = shutdown.get();
        if (gracefulShutdown != null) {
            pollShutdown(gracefulShutdown);
        } else {
            long currentTimeMs = time.milliseconds();
            long pollTimeoutMs = pollCurrentState(currentTimeMs);

            kafkaRaftMetrics.updatePollStart(currentTimeMs);
            List<RaftMessage> inboundMessages = channel.receive(pollTimeoutMs);

            currentTimeMs = time.milliseconds();
            kafkaRaftMetrics.updatePollEnd(currentTimeMs);

            for (RaftMessage message : inboundMessages) {
                handleInboundMessage(message, currentTimeMs);
                currentTimeMs = time.milliseconds();
            }
        }
    }

    public  KafkaRaftClient(RaftConfig raftConfig,
                           NetworkChannel channel,
                           ReplicatedLog log,
                           QuorumState quorum,
                           Time time,
                           FuturePurgatory<LogOffset> fetchPurgatory,
                           FuturePurgatory<LogOffset> appendPurgatory,
                           LogContext logContext);
    public  KafkaRaftClient(NetworkChannel channel,
                           ReplicatedLog log,
                           QuorumState quorum,
                           Time time,
                           Metrics metrics,
                           FuturePurgatory<LogOffset> fetchPurgatory,
                           FuturePurgatory<LogOffset> appendPurgatory,
                           Map<Integer, InetSocketAddress> voterAddresses,
                           int electionBackoffMaxMs,
                           int retryBackoffMs,
                           int requestTimeoutMs,
                           int fetchMaxWaitMs,
                           LogContext logContext,
                           Random random);

}