«Задача» может находиться в состоянии ожидания, пройдена или не выполнена.
«Ожидающая» задача, переходящая в «пройденное» состояние, будет обрабатываться иначе, чем «невыполненная» задача, выполняющая тот же переход.
Это кажется довольно странным набором состояний. Я ожидал бы, что задача займет некоторое время для выполнения, поэтому переход от ожидающего к выполнению затем либо проходит, либо завершается неудачей, а задачи, которые не выполняются до истечения их времени, истекают. Если также существует переход от сбоя к отказу и истечению срока действия, то это может добавить другое состояние.
Нарисуйте конечный автомат, чтобы найти состояния.
Во-первых, нужно ли вам структурно моделировать состояния? Подойдут ли ожидающий / истекший флаг, запланированное время и результат (с неудачей и успехом как два подтипа результата)? Что от этого нужно клиентам задачи?
Во-вторых, вы взаимодействуете с задачей или планировщиком? Весьма обычно дать описание задачи планировщику и вернуть будущее, которое можно спросить о результате задачи. Но сама задача не выставляется, только завершена ли она и результат. Если вам требуется прогресс, вам может потребоваться иметь планировщик, который можно запрашивать по идентификатору задачи, чтобы получить прогресс, а не объект задачи, на который вы ссылаетесь - наличие объекта задачи, который одновременно изменяет состояние, затрудняет получение согласованного набора данных о состоянии от него, пока он не достигнет конечного состояния. Если в «пройденном» состоянии нет информации о сбое, то запрос «есть ли у вас сбой», за которым следует «получить статус сбоя», легко приводит к гонке, если только вы не извлекаете блокировку (ewww), поэтому возвращение объекта информации о состоянии неизменной задачи атомарно становится желательно, когда ваш объект задачи становится более или менее эквивалентным идентификатору, переданному планировщику.