Опубликован: 14.08.2008 | Уровень: специалист | Доступ: платный
Лекция 10:

Реализация. Создание процесса Request External Reports

10.5 Контроль пути через процесс

Следующие этапы конфигурирования посвящены логике контроля пути через процесс. Эта задача делится на две части:

  1. В разделе 10.5.1, "Проверка результатов, полученных от RequestAvailability", если система управления оценщиками не находит оценщиков для выполнения оценки, управление для выбора оценщика передается специалисту по обработке претензий, а не системе бизнес-правил.
  2. В разделе 10.5.2, "Создание операции While для проверки согласования оценки", мы имеем дело с ситуацией, когда выбранный оценщик в конце концов решил не выполнять оценку.

10.5.1 Проверка результатов, полученных от RequestAvailability

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

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

Тем не менее нас интересует получение от оценщиков предложений по проведению оценки. Первый этап – это анализ ответов и проверка, все ли ответы получены. ESB ожидает ответов оценщиков в течение согласованного периода времени, а затем собирает предложения в единый список. ESB отправляет ответ обратно, используя автоматизированный процесс для работы с оценщиками. Автоматизированный процесс работы с оценщиками ждет, пока операция AssessorAvailability Receive передаст список системе бизнес-правил для автоматического выбора оценщика.

Мы должны проверить, были ли вообще получены предложения. Если предложения отсутствуют, мы передаем проблему специалисту по обработке претензий, чтобы он решил ее вручную. Если предложения были получены, то управление передается в автоматизированную операцию SelectAssessor, которая вызывает службу Business Rules для выбора наилучшего оценщика из списка.

Как можно сказать, были ли получены предложения? Единственный способ – это проверить, есть ли элементы в массиве assessorEstimationArray ( рис. 10.35).

Массив assessorEstimationArray

увеличить изображение
Рис. 10.35. Массив assessorEstimationArray

Результаты этой проверки используются для того, чтобы задать значение для ссылок А и В на рис. 10.38. Для каждой ссылки мы можем открыть закладку свойств и задать условие, которое должно быть выполнено для перехода по ссылке. Для определения данного условия мы планируем использовать либо простой редактор выражений, либо визуальный редактор выражений. Однако казалось, что ни тот, ни другой редактор выражений не может обрабатывать выражения достаточно сложные, чтобы можно было проверить существование массива AssessorEstimationArray. Вместо использования редакторов мы напишем немного Java-кода для установки глобальной переменной. Затем каждая ссылка в простом выражении сможет проверять эту переменную, чтобы можно было установить для ссылки условие истинности.

Общий план реализации следующий:

  1. Создать глобальную переменную для хранения длины массива AssessorAutomationArray.
  2. Создать Java-фрагмент, устанавливающий значение глобальной переменной.
  3. Создание визуального выражения для ссылок А и В с целью тестирования значения глобальной переменной и определения условия истинности для каждой из ссылок.
Создание глобальной переменной EstimationArrayLength

Чтобы создать глобальную переменную EstimationArrayLength, выполните следующие шаги:

  1. В редакторе процесса RequestExternalReports нажмите кнопку Variable +, чтобы создать новую глобальную переменную с именем EstimationArrayLength.
  2. Этой переменной нужно присвоить тип xsd:int, чтобы она могла хранить значение длины. Для этого мы должны определить WSDL-сообщение, которое мы назовем EstimationArrayLength, в котором содержится часть xsd:int с именем lengthValue. Это сообщение будет храниться в том же WSDL-файле, что и переменные AssessorID и URL:
    • Создайте сообщение EstimationArrayLength и его часть lengthValue:
      • Откройте файл RequestExternalReportsInterface.wsdl в графическом редакторе WSDL.
      • Нажмите Messages (Сообщение) \to Add Child (Добавить потомок) \to EstimationArrayLength \to Add Child (Добавить потомок). Назовите часть lengthValue. В поле Type (Тип) введите xsd:int ( рис. 10.36).
      Создание сообщения EstimationArrayLength

      Рис. 10.36. Создание сообщения EstimationArrayLength
    • Создание сообщения EstimationArrayLength
      • Выберите глобальную переменную EstimationArrayLength в процессе RequestExternalReport и откройте закладку Message (Сообщение) в редакторе свойств.
      • С помощью кнопки Browse (Обзор) выберите файл RequestExternalReports Interface.wsdl и укажите сообщение EstimationArrayLength в раскрывающемся окне Message (Сообщение) ( рис. 10.37).
      Тип переменной EstimationArrayLength

      Рис. 10.37. Тип переменной EstimationArrayLength
Создание Java-фрагмента "Any Assessors?" для установки значения lengthValue

Чтобы создать Java-фрагмент "Any Assessors?", выполните следующие действия:

  1. Измените пустую операцию "Any Assessors?" на Java-фрагмент, как показано на рис. 10.38. В этом Java-фрагменте мы установим значение lengthValue в глобальной переменной EstimationArrayLength, чтобы его можно было проверять с помощью простых выражений, связанных со ссылками А и В.
    Проверка результатов в RequestAvailability

    Рис. 10.38. Проверка результатов в RequestAvailability
  2. В Java-фрагменте мы должны установить доступ для обновления к глобальной переменной Estimation-ArrayLength:
    • Выделите Java-фрагмент Any Assessors? и откройте закладку Implementation (Реализация) в редакторе свойств.
    • Щелкните правой кнопкой мыши и в появившемся меню выберите пункт Update Variable (Обновить переменную) \to Part (Часть). Укажите EstimationArrayLength: lengthValue: int ( рис. 10.39). При этом будут созданы три инструкции.
      Результаты работы мастера обновления переменной

      увеличить изображение
      Рис. 10.39. Результаты работы мастера обновления переменной

Первая инструкция создает в JVM \text{\texttrademark} новый экземпляр EstimationArrayLengthMessage (поскольку параметр getEstimationArrayLength установлен в true). Это показывает, что Java-фрагменту требуется доступ по обновлению к глобальной переменной EstimationArrayLength.

Вторая инструкция создает новый экземпляр целочисленного значения lengthValue. (Также этот экземпляр инициализируется значением, которое берется из глобальной переменной, но нас здесь это не интересует.)

Третья инструкция использует новое целочисленное значение lengthValue для установки нового значения глобальной переменной. Это также дает побочный эффект – разблокирование переменной, поскольку для обновления она больше не нужна.

Мастер обновления оставляет редактор готовым к заданию значения новой целочисленной переменной lengthValue. ( рис. 10.40).

Выбор части переменной для обновления в Java-фрагменте

Рис. 10.40. Выбор части переменной для обновления в Java-фрагменте

Получите длину массива, хранящего ответы оценщиков. На этот раз мы используем встроенное автозаполнение, чтобы получить значение переменной AssessorEstimationArray. К сожалению, с помощью меню мы не можем добраться до нужной нам части сообщения. Используя Ctrl+Пробел для автозаполнения каждого элемента, мы в итоге получим следующую инструкцию7В нашем коде есть опечатка. Проверьте, чтобы в вашем коде ее не было!:

lengthValue = getListOfAvailableAssessrs()1.getParameters().
getResultAssessorCollection().getAssessorEstimations().length;

Полный код Java-фрагмента приведен в примере 10.5.

EstimationArrayLengthMessage EstimationArrayLength =
   getEstimationArrayLength(true);
int lengthValue =
   getListOfAvailableAssessors()
     .getParameters()
     .getResultAssessorCollection()
     .getAssessorEstimations()
     .length;
EstimationArrayLength.setLengthValue(lengthValue);
Пример 10.5. Фрагмент Java Any Assessors?
Проверка значения lengthValue в ссылках А и В

Последний этап процесса – это добавление визуальных выражений к двум ссылкам, идущим от Java-фрагмента "AddAssessors?", чтобы вызывалась операция ManualSelectAssessor или автоматическая операция SelectAssessor, но не обе сразу.

  1. Щелкните по ссылке, ведущей к операции ManualSelectAssessor, и откройте закладку Condition (Условие) в редакторе свойств. Выберите визуальный редактор выражений для создания следующей инструкции:
    EstimationArrayLength.lengthValue == 0
    • с помощью меню в правой части редактора выберите из списка глобальных переменных переменную EstimationArrayLength.lengthValue;
    • нажмите на оператор равенства (==);
    • нажмите на функцию Number (Число) и введите 0.
  2. Щелкните по ссылке, едущей к операции SelectAssessor, и повторите процедуру, чтобы создать следующую инструкцию:
    EstimationArrayLength.lengthValue ¬= 0

10.5.2 Создание операции While для проверки согласования оценки

Служба RequestAssessment посылает запрос выбранному оценщику на выполнение оценки претензии для LGI. В конечном счете запрос приводит к возврату трех потоков сообщений обратно в процесс RequestExternalReports:

  1. Синхронный ответ от ESB, подтверждающий, что сообщение обрабатывается.
  2. Асинхронное подтверждение от оценщика, что он будет (или не будет) выполнять оценку.
  3. Асинхронный ответ, содержащий отчет об оценке.

Как и в случае запроса готовности оценщиков, мы игнорируем ответ от ESB. Он нужен только для мониторинга и не выходит за рамки данного сценария. Окончательный ответ, содержащий отчет, обрабатывается операцией AssessorSendReport. В этом разделе мы изучим обработку подтверждения, получаемого от оценщика, которое принимается операцией AllocateAssessorResponse.

Выбор дизайна

Если оценщик отклоняет запрос, такой вариант является необычным и вместо автоматического выбора второго по рейтингу оценщика система передает задание по поиску другого оценщика специалисту по обработке претензий.

С точки зрения бизнеса важно, чтобы в случае возникновения в процессе необычной ситуации ответственность за принятие решения передавалась специалисту по обработке претензий. Хотя существуют технические возможности использования средств автоматизации для помощи специалисту по обработке претензий в выборе оценщика и в нетипичной ситуации, бизнес-спецификация, как она зафиксирована в BPEL-модели, созданной в WebSphere Business Integration Modeler, указывает на то, чтобы контроль над выбором осуществлял специалист. Эту спецификацию следует учитывать в исполняемом BPEL-коде, который генерирует ИТ-специалист. Однако достижение этой бизнес-цели возможно несколькими путями. Должна ли в процессе использоваться одна или несколько выполняемых вручную операций? Как следует формировать запросы ко второму, а возможно, и к последующим оценщикам? Эти вопросы не учитываются в бизнес-спецификации, и решение по ним должен принимать ИТ-специалист.

Использование существующей ручной операции или добавление новой ручной операции?

В потоке уже есть один пункт, где в выполнение ручной операции вовлекается специалист по обработке претензий, если для оценки претензии не оказывается подходящих оценщиков. Один из подходов к проектированию состоит в использовании этой операции для двух ситуаций:

  • отсутствуют подходящие оценщики;
  • выбранный оценщик отказывается выполнить оценку.

Альтернативным способом проектирования процесса является добавление новой ручной операции, связанной с обработкой отрицательного ответа оценщика. Результаты этой новой операции должны поступать в операцию RequestAssessment для дальнейшей работы процесса.

Если мы изучим спецификацию пользовательского интерфейса процесса Claims, то вопрос о применении одной или двух операций почти наверняка отпадет сам собой – использовать следует две операции, поскольку специалисту в каждом из этих случаев необходима разная информация. Однако для данного сценария мы остановимся на одной операции, в которой специалисту будет предложено указать новый идентификатор оценщика, независимо от того, будет это первая попытка назначить оценщика или не первая.

Проектирование управляющего цикла в BPEL

Нам нужно создать в BPEL-процессе управляющий цикл для передачи управления в ручную операцию, если оценщик отказывается создавать отчет об оценке. Простой возврат управления в предыдущую точку потока путем соединения потока с циклом в BPEL недопустим. Можно использовать две альтернативы:

  • компенсацию;
  • операцию While.

Компенсация (Compensation) – это способ возврата при ошибке в операции. В своей простейшей форме каждая операция содержит такие две службы, как:

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

За дополнительной информацией о компенсационных службах обращайтесь к следующим источникам:

  • к статье Susan Hermann в developerWorks, "Modeling compensation in WebSphere Business Integration Server Foundation Process Choreographer", – хорошее описание использования компенсационных служб в in WebSphere Studio Application Development Integration Edition": http://www-128.ibm.com/developerworks/websphere/techjournal/0412_herrmann/0412_herrmann.html
  • к руководству по использованию компенсации в сценарии с обработкой страховых претензий, реализованном с применением более ранней версии WebSphere Studio Application Development Integration Edition: Larry Yusuf, "Create Compensation in a Business Process": https://www6.software.ibm.com/developerworks/education/i-merge7/index.html

В нашем случае компенсацию можно использовать для вызова операции Manual SelectAssessor вместо автоматической SelectAssessor (как компенсацию ошибки, связанной с отказом выбранного оценщика перейти к выполнению оценки). Однако более подробное исследование должно убедить нас, что наши намерения не вполне соответствуют модели компенсации:

  • Нам не нужно выполнять откат каких-то изменений в ресурсах: ничего не изменилось в результате отказа оценщика от выполнения оценки.
  • Компенсация работает на уровне всего процесса, а мы лишь хотим подкорректировать результаты нескольких операций. Нам пришлось бы выделять компенсируемые операции в отдельный процесс.
  • Выполнение ручной операции Manual SelectAssessor не является компенсационной службой для Automatic SelectAssessor. Мы собираемся выполнить ту же операцию, но несколько иначе.

Операция While предоставляет необходимые нам возможности. На рис. 10.41 показано, какие операции были перенесены в операцию While и в каком месте всего процесса данная операция располагается.

  • Условие для while – это отсутствие положительного ответа от операции AllocateAssessment Response.
  • Операция Automatic SelectAssessors находится внутри цикла, хотя она всегда выполняется только при первой итерации. Это объясняется тем, что при первой итерации может не оказаться выбранных оценщиков и мы будем использовать ручную операцию ManualSelectAssessors уже в первом проходе, если автоматическая операция не нашла оценщика.
  • Мы не уделяем внимания входящим и выходящим данным для ManualSelectAssessor, поэтому ручную часть цикла может понадобиться дополнительно детализовать.
  • В начале операции While была добавлена пустая операция, просто для удобства графического отображения ( рис. 10.41).
Операция While для неподтвержденной оценки

Рис. 10.41. Операция While для неподтвержденной оценки
Создание операции While
Внимание! Для работы с данным разделом обязательно выполните следующие инструкции:
  • Лучше всего начать создание операции While с добавления в поток ручной или автоматической пустой операции (Noop). Вам будет проще выбрать нужные операции и ссылки и сохранить написанные условия.
  • Перед редактированием абсолютно необходимо выполнить экспортирование в файл Project Interchange. В девяти случаях из десяти первая попытка такого редактирования заканчивается неудачно, а отмену выполнить нельзя.
  • Обязательно отключите для редактирования автоматическое размещение (auto arrange). Иначе выполнение вашей задачи станет практически невозможным.
  1. Подключение операции While:
    • Перетащите операцию While из палитры в процесс и назовите ее while no committed assessment.
    • Выделите все операции между Any Assessor? и AssessorSendReport и перетащите их в операцию While.
    • Перетащите, назовите и подсоедините операцию Noop (используйте имя Manual or Automatic?). Обязательно сохраните те же ссылки (А и В) на операции ToSelectAssessors и ManualSelectAssessor с записанными для них условиями.
    Вы получите множество сообщений об ошибках (пример 10.6).
    Error BPED0211E: Link 'Linknn' does not link immediate children of flow
    'RequestExternalReport' of process model 'RequestExternalReports'.
    RequestExternalReports.bpelITSOWorkshop/Claim/TOBE/RequestExternalReports
    Пример 10.6. Сообщения об ошибках при подключении операции While
  2. Чтобы исправить ошибки, выполните следующие шаги:
    • щелкните правой кнопкой мыши по потоку RequestExternalReports.bpel и выберите пункт меню Open with (Открыть с помощью) ... Text editor (Текстовый редактор);
    • вырежьте все неработоспособные определения ссылок из раздела <link> ...</link> главного потока и вставьте их в блокнот;
    • создайте новый раздел <link> ... <.link> в потоке while и вставьте в него все ссылки, как показано в примере 10.7.
    <while condition="DefinedByJavaCode" name="Whilenocommittedassessment"
    wpc:displayName="While no committed assessment" wpc:id="37">
                  <wpc:condition>
    <wpc:javaCode><![CDATA[//@generated
    //
    //AssessorAcknowledgement.Ack.equals("YES")
    return getAssessorAcknowledgement().getAck().equals
    "YES";]]></wpc:javaCode>
                  </wpc:condition>
                  <target linkName="Link27"/>
                  <source linkName="Link5"/>
                  <flow name="Flow" wpc:displayName="Flow" wpc:id="38">
             <links>
    <link name="Link14"/>
                  <link name="Link15"/>
                  <link name="Link4"/>
                  <link name="Link16"/>
                  <link
    name="ManualSelectAssessorOutput_to_RequestAssessmentInput2"/>
                  <link name="Link19"/>
                  <link name="Link18"/>
                  <link name="Link17"/>
                  <link name="Link3"/>
                  <link name="Link25"/>
             </links>
    Пример 10.7. Новый раздел ссылок для операции While
  3. Создайте переменную для хранения условия While:
    • добавьте сообщение AssessorAcknowledgement в файл ProcessMessages.wsdl для соединения с другими внутренними сообщениями, которые были определены доля процесса. создайте часть (Part) с именем Ack и типом xsd:string;
    • добавьте в процесс переменную с именем AssessorAcknowledgement;
    • укажите тип переменной AssessorAcknowledgement с помощью только что созданного сообщения.
  4. Задайте и протестируйте условие для While:
    • добавьте операцию назначения ( Assign activity ) перед циклом While для инициализации переменной AssessorAcknowledgement.Ack значением No Assessors selected yet;
    • откройте закладку Condition (Условие) операции While в редакторе свойств и выберите редактор Visual Expression (Визуальный редактор выражений);
    • введите в качестве условия следующее выражение:
      AssessorAcknowledgement.Ack.equals("YES")!=true

Java имеет свои хитрости. Вы должны проверить, чтобы значение объекта не представляло собой тот же самый объект.

Илья Макаренко
Илья Макаренко
О начале обучения
Александр Медов
Александр Медов
Здравствуйте, какова полная сумма предоставленной услуги с печатью документа и отправкой по почте?
Надежда Белякова
Надежда Белякова
Россия
Pavel Pelevin
Pavel Pelevin
Украина, Одесса