Действия кода Workflow 4.0, вызывающие другие действия (сохраняются, задерживаются и т. Д.) - PullRequest
2 голосов
/ 23 марта 2010

У меня есть множество операций кода Workflow foundation 4.0 RC, которые используют веб-сервисы и общаются с базами данных, в которые я хочу добавить обработку ошибок.

Я действительно хотел бы попытаться вызвать мой веб-сервис / db, отследить любые сбои, такие как сбой связи, а затем повторить ту же операцию через 1 час (после того, как я зарегистрировал исключение).

Есть ли способ сделать что-то подобное?

protected override void Execute(CodeActivityContext context) {

  Persist(); // I would like to invoke the persist activity like this

  if (!AttemptServiceCall()) {

        // I would like to invoke a delay activity like this
        Delay(new TimeSpan(0, 30, 0)); // wait 30 mins before trying again
        Execute(context); // call this activity again
  }
}

private bool AttemptServiceCall() {

  bool serviceCallSuccessful = true;

  try {
        myService.InvokeSomeMethod();
  }
  catch (CommunicationException ex) {
        myEventLogger.Log(ex);
        serviceCallSuccessful = false;
  }

  return serviceCallSuccessful;
}

1 Ответ

2 голосов
/ 23 марта 2010

Да, это совсем не сложно, если вы знаете, как работают мероприятия WF4.

Я мог бы напечатать длинную историю, но поскольку Ричард Блеветт уже писал в блоге об операции Retry, которая выполняет именно то действие повторения, которое вы описываете, я просто собираюсь сослаться на этот пост здесь . Единственное, чего не хватает, так это упорства, но его легко добавить.

Просто создайте свою активность AttemptServiceCall и добавьте ее в качестве тела. Учитывая, что это звучит как потенциально длительное действие, я бы предложил использовать AsyncCodeActivity в качестве базового класса.

...