class CheckpointActor {

    public void feedback(final FeedbackMessage message)
            throws ReadValueException, ChangeValueException, InvalidArgumentException, EntryScheduleException, EntryStorageAccessException {
        try {
            ISchedulerEntry entry = service.getEntryStorage().getEntry(message.getPrevCheckpointEntryId());

            if (null != entry.getState().getValue(completedFieldName)) {
                // If the entry is already completed then ignore the feedback message
                return;
            }

            // Pause entry execution to prevent race between current thread and timer thread
            entry.pause();
            try {

                entry.scheduleNext(System.currentTimeMillis() + COMPLETE_ENTRY_RESCHEDULE_DELAY);

                entry.getState().setValue(gotFeedbackFieldName, true);
                entry.getState().setValue(completedFieldName, true);
            } finally {
                entry.unpause();
            }
        } catch (EntryNotFoundException | EntryPauseException ignore) {
            // There is no entry with required identifier. OK
        }
    }

    public  CheckpointActor(final IObject args);

}