public void run() {

    while (true) {

      IResponse resp = responseQueue.removeResponse();

      Integer respId = (Integer) resp.getId();
      SPFSession session = sessions.remove(respId);
      FutureSPFResult result = results.remove(respId);

      DNSLookupContinuation cont =
          (DNSLookupContinuation) session.getAttribute(ATTRIBUTE_STAGED_EXECUTOR_CONTINUATION);

      DNSResponse response;
      if (resp.getException() != null) {
        response = new DNSResponse((TimeoutException) resp.getException());
      } else {
        response = new DNSResponse(resp.getValue());
      }

      try {
        cont = cont.getListener().onDNSResponse(response, session);

        if (cont != null) {
          invokeAsynchService(session, result, cont, false);
        } else {
          execute(session, result, false);
        }

      } catch (Exception e) {
        SPFChecker checker = null;
        while (e != null) {
          while (checker == null || !(checker instanceof SPFCheckerExceptionCatcher)) {
            checker = session.popChecker();
          }
          try {
            ((SPFCheckerExceptionCatcher) checker).onException(e, session);
            e = null;
          } catch (SPFResultException ex) {
            e = ex;
          } finally {
            checker = null;
          }
        }
        execute(session, result, false);
      }
    }
  }