class JdbcRequestHandlerWorker extends GridWorker {
    /** Requests queue.*/
    private final LinkedBlockingQueue<T2<JdbcRequest, GridFutureAdapter<ClientListenerResponse>>> queue =
        new LinkedBlockingQueue<>();

    /** Handler.*/
    private final JdbcRequestHandler hnd;

    /** Context.*/
    private final GridKernalContext ctx;

    /** Response */
    private static final ClientListenerResponse ERR_RESPONSE = new JdbcResponse(IgniteQueryErrorCode.UNKNOWN,
        "Connection closed.");

    /**
     * Constructor.
     * @param igniteInstanceName Instance name.
     * @param log Logger.
     * @param hnd Handler.
     * @param ctx Kernal context.
     */
    JdbcRequestHandlerWorker(@Nullable String igniteInstanceName, IgniteLogger log, JdbcRequestHandler hnd,
        GridKernalContext ctx) {
        super(igniteInstanceName, "jdbc-request-handler-worker", log);

        A.notNull(hnd, "hnd");

        this.hnd = hnd;

        this.ctx = ctx;
    }

    /**
     * Start this worker.
     */
    void start() {
        new IgniteThread(this).start();
    }

    /** {@inheritDoc} */
    @Override protected void body() throws InterruptedException, IgniteInterruptedCheckedException {<FILL_FUNCTION_BODY>}

    /**
     * Initiate request processing.
     * @param req Request.
     * @return Future to track request processing.
     */
    GridFutureAdapter<ClientListenerResponse> process(JdbcRequest req) {
        GridFutureAdapter<ClientListenerResponse> fut = new GridFutureAdapter<>();

        queue.add(new T2<>(req, fut));

        return fut;
    }
}

        try {
            while (!isCancelled()) {
                T2<JdbcRequest, GridFutureAdapter<ClientListenerResponse>> req = queue.take();

                GridFutureAdapter<ClientListenerResponse> fut = req.get2();

                try {
                    JdbcResponse res = hnd.doHandle(req.get1());

                    fut.onDone(res);
                }
                catch (Exception e) {
                    fut.onDone(e);
                }
            }
        }
        finally {
            // Notify indexing that this worker is being stopped.
            try {
                ctx.query().onClientDisconnect();
            }
            catch (Exception ignored) {
                // No-op.
            }

            // Drain the queue on stop.
            T2<JdbcRequest, GridFutureAdapter<ClientListenerResponse>> req = queue.poll();

            while (req != null) {
                req.get2().onDone(ERR_RESPONSE);

                req = queue.poll();
            }
        }
    
<methods>public void blockingSectionBegin() ,public void blockingSectionEnd() ,public void cancel() ,public long heartbeatTs() ,public java.lang.String igniteInstanceName() ,public boolean isCancelled() ,public boolean isDone() ,public void join() throws java.lang.InterruptedException,public java.lang.String name() ,public final void run() ,public java.lang.Thread runner() ,public java.lang.String toString() ,public void updateHeartbeat() <variables>private static final AtomicLongFieldUpdater<org.apache.ignite.internal.util.worker.GridWorker> HEARTBEAT_UPDATER,private volatile boolean finished,private volatile long heartbeatTs,private final non-sealed java.lang.String igniteInstanceName,protected final java.util.concurrent.atomic.AtomicBoolean isCancelled,protected final non-sealed org.apache.ignite.IgniteLogger log,private final non-sealed org.apache.ignite.internal.util.worker.GridWorkerListener lsnr,private final java.lang.Object mux,private final non-sealed java.lang.String name,private volatile java.lang.Thread runner