private void evalOp(final Context context) throws OpProcessorException {
    if (logger.isDebugEnabled()) {
      final RequestMessage msg = context.getRequestMessage();
      logger.debug(
          "Sessionless request {} for eval in thread {}",
          msg.getRequestId(),
          Thread.currentThread().getName());
    }

    evalOpInternal(context, context::getGremlinExecutor, bindingMaker.apply(context));
  }
  protected void evalOp(final Context context) throws OpProcessorException {
    final RequestMessage msg = context.getRequestMessage();
    final Session session = getSession(context, msg);

    // place the session on the channel context so that it can be used during serialization.  in
    // this way
    // the serialization can occur on the same thread used to execute the gremlin within the
    // session.  this
    // is important given the threadlocal nature of Graph implementation transactions.
    context.getChannelHandlerContext().channel().attr(StateKey.SESSION).set(session);

    evalOpInternal(
        context,
        session::getGremlinExecutor,
        () -> {
          final Bindings bindings = session.getBindings();

          // parameter bindings override session bindings if present
          Optional.ofNullable((Map<String, Object>) msg.getArgs().get(Tokens.ARGS_BINDINGS))
              .ifPresent(bindings::putAll);

          return bindings;
        });
  }