@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(); } } } }