Получение данных в экземпляр рабочего процесса Windows

StackOverflow https://stackoverflow.com/questions/421398

  •  05-07-2019
  •  | 
  •  

Вопрос

В настоящее время мы создаем систему, которая абстрагирует все виды технических деталей о веб-сервисах от некоторых других систем. Это немного похоже на Enterprise Bus, но делает это немного больше.

Мы решили использовать Windows Workflow для обработки запросов. Как только мы выясним, какое действие запрашивается, мы запустим рабочий процесс, специально предназначенный для обработки действия. Теперь некоторые веб-сервисы, которые мы будем называть, являются асинхронными, поэтому рабочий процесс должен ждать ответа. Основная идея заключается в том, что мы будем реализовывать веб-сервис обратного вызова с нашей стороны, а когда обратный вызов поступит «каким-то образом», передадим свои данные текущему рабочему процессу, ожидающему ответа.

До сих пор я видел две возможности:

<Ол>
  • ExternalDataExchangeService
  • WorkflowQueuingService
  • Первый сервис относительно прост в использовании, но основан на событиях, поэтому, если вы пропустите событие, вы пропустите данные. Нам нужно решение на основе очередей, потому что технически возможно получить обратный вызов от веб-службы еще до того, как мы получим синхронный ответ, который говорит нам, что мы вскоре получим обратный вызов.

    Второй сервис показался идеальным, но он очень ограничен в том, как его можно использовать. Получить элемент в очередь очень просто, но мы должны убедиться, что очередь существует, прежде чем мы сможем это сделать. И создание очереди представляется возможным только в переопределении выполнения действия. Поскольку у нас много разных рабочих процессов, у нас есть базовый класс рабочих процессов, который выполняет некоторую работу в своем переопределении Initialize и очень хотел бы создать там очередь, поэтому нам не нужно создавать специальный " Initialize " деятельность, с которой должен начинаться каждый рабочий процесс. Мы также хотели бы получить уведомление о том, когда новый элемент получен в базовом классе. Таким образом, конкретный рабочий процесс должен будет ждать только в WaitHandle, чтобы узнать, есть ли данные в очереди. Наконец, мы хотим иметь возможность считывать данные из очереди из кода активности в конкретном рабочем процессе (после того, как WaitHandle сигнализируется).

    У кого-нибудь есть идея, не обязательно быть с двумя упомянутыми мной службами, но нам бы очень хотелось, чтобы все было как можно проще.

    Это было полезно?

    Решение 2

    Оказывается, мое предположение было неверным. Я был на 100% уверен, что проверил сценарий и столкнулся с проблемами, но после обсуждения с коллегой я перепробовал его, и ExternalDataExchangeService работал просто отлично. Поэтому нет необходимости искать более сложное решение, а пока мы просто используем ExternalDataExchangeService.

    Другие советы

    В WF все коммуникации между средой выполнения или службами и фактическими рабочими процессами основаны на очереди. Похоже, что ExternalDataExchangeService использует события, но это всего лишь тонкий слой вокруг механизма WorkflowQueuingService и WorkflowQueue.

    В целом, я предпочитаю использовать WorkflowQueuingService, поскольку он дает полный контроль. Как только вы поймете основы, в большинстве случаев работать с этим ExternalDataExchangeService станет еще проще.

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top