@Override public void run() { try { ReservationStatus currentStatus = null; // No need to retrieve status when there is no reservationId while (numberOfTries < maxPollingTries && reservation.getReservationId() != null) { // Get the latest version of the reservation.. Reservation reservationFresh = reservationService.find(reservation.getId()); logger.debug( "Checking status update for: '{}' (try {})", reservation.getReservationId(), numberOfTries); currentStatus = reservationService.getStatus(reservationFresh); logger.debug("Got back status {}", currentStatus); if (!currentStatus.equals(startStatus)) { logger.info( "Status change detected {} -> {} for reservation {}", new Object[] {startStatus, currentStatus, reservationFresh.getReservationId()}); reservationFresh = reservationService.updateStatus(reservationFresh, currentStatus); Optional<NsiRequestDetails> requestDetails; if (reservationFresh.getConnection().isPresent()) { requestDetails = Optional.fromNullable( reservationFresh.getConnection().get().getProvisionRequestDetails()); } else { requestDetails = Optional.absent(); } reservationEventPublisher.notifyListeners( new ReservationStatusChangeEvent(startStatus, reservationFresh, requestDetails)); return; } numberOfTries++; Uninterruptibles.sleepUninterruptibly(pollingIntervalInMillis, TimeUnit.MILLISECONDS); } } catch (Exception e) { logger.error( "The poller failed for reservation " + reservation.getId() + "/" + reservation.getReservationId(), e); emailSender.sendErrorMail(e); } }