@Override
    public void run() {
      while (running) {

        AbstractMessage message = null;

        try {
          message = pipeline.pollFirst();
          // final AbstractMessage finalMessage = message;

          long t0 = Clock.getMainClock().getTimeInMillis(false);
          logger.debug("Got message: " + message);

          processMessage(message);

          logger.debug(
              "Done with message: "
                  + message
                  + ", took "
                  + (Clock.getMainClock().getTimeInMillis(false) - t0)
                  + " ms");
        } catch (Exception e) {
          logger.error(
              "Exception processing message "
                  + e.getMessage()
                  + " caught, continuing with next message");
          e.printStackTrace();
        } finally {
          if (message != null)
            synchronized (message) {
              logger.debug("setting processed: " + message);
              message.setProcessed();
              message.notify();
            }
        }
      }
    }