Как вызвать событие после завершения множественного параллельного выполнения конвейера CPF? - PullRequest
0 голосов
/ 04 марта 2019

У меня есть список идентификаторов клиентов.Для каждого из них мне нужно собрать некоторую информацию из внешних систем (через веб-сервисы), а затем создать отчет.После того, как все отчеты о клиентах были созданы, я хотел бы автоматически создать сводный документ на основе всех отчетов.

Я планирую использовать инфраструктуру обработки контента (CPF) MarkLogic для обработки веб-запроса и создания отчета для каждого идентификатора клиента.Однако я не знаю, как вызвать действие для итогового документа после завершения всех конвейеров отчетов клиентов.

enter image description here

Обновление основано на ответе Мэри (@mholstege) (2019-03-04)

Исходя из моего понимания предложения Мэри, вместо этого у меня должен быть только один конвейер, работающий непосредственно надидентификаторы клиентов документируют и создают действия для последовательной обработки идентификаторов с последующим действием генерации сводки в состоянии терминала.Моя единственная забота об этом проекте - обработка ошибок, поскольку я больше не могу полагаться на состояния CPF для отслеживания каждого отдельного отчета.Как мне разрабатывать состояния / действия для эффективной обработки ошибок?

enter image description here

Ответы [ 2 ]

0 голосов
/ 06 марта 2019

Дизайн обработки ошибок будет непростым, и есть некоторые компромиссы.Вы можете иметь все ошибки для любого члена пакета, чтобы вызвать сбой всего пакета: простой код сделает это.Или, если вы хотите знать все сбои в пакете, но при этом все равно отказываете в пакете, вы можете собрать все отдельные ошибки и переназначить их как один завернутый сбой, например, в рамках стандартного шаблона try / catch в действии., что-то вроде:

let $errors := 
   for $id in $list-of-ids return
     try { let $work := do-stuff() return () } catch ($e) { <error><id>{$id}</id>{$e}</error> }
return
  if (empty($errors)) then ( (: OK! :) )
  else fn:error((), "MY-BATCHERROR", $errors)

Это делает сложным тегирование отдельных документов с их собственными ошибками, хотя вы можете добавить переход для состояния ошибки, которое делает это: просмотр ошибки пакета и установка ее на каждомссылочных документов.

0 голосов
/ 04 марта 2019

Это будет очень сложно сделать абсолютно правильно.В конечном итоге вы создадите узкие места или пробелы, которые могут привести к пропуску чего-либо или к тому и другому.Общий план будет состоять в том, чтобы переход после «создания отчета» имел условие, которое проверяет состояние всех идентификаторов клиентов и запускает суммарное действие, если они все находятся в нужном месте.Чтобы надежда на это была надежной, вам, вероятно, потребуется создать один документ, представляющий пакет, и иметь конвейеры для отдельных идентификаторов клиентов, чтобы обновить его (это обеспечит наличие единой защелки, на которую вы можете рассчитывать,недостатком является создание единой защелки, на которой все они будут блокироваться.) Однако, я бы не советовал, если вы можете избежать этого.

CPF предназначен для выполнения серии шагов над одним документом.Поэтому сделайте документ, с которым он работает, пакетом, а действия - действиями, работающими с пакетом.Это может означать, что отдельные шаги выполняются дольше (хотя, если у вас есть контроль над API веб-сервиса, вы также можете сделать его ориентированным на пакет, что может помочь), но ваша пропускная способность может в конечном итоге быть лучше.Ни при каких обстоятельствах не порождайте и не вызывайте действия CPF.

...