Рекомендации по созданию пользовательских действий в средстве разработки Service Manager

Важно!

Поддержка этой версии Service Manager завершена. Рекомендуем выполнить обновление до Service Manager 2022.

Service Manager автоматизирует различные ит-процессы. Например, для процесса управления инцидентами Service Manager включает различные автоматизированные шаги, такие как автоматическое уведомление пользователей о создании или разрешении инцидентов и автоматическая маршрутизация инцидентов в различные очереди на основе классификации. Данная автоматизация реализуется при помощи рабочих процессов, определенных для различных решений и использует функции Windows Workflow Foundation (WF) для описания, выполнения и отслеживания автоматизированных операций.

Клиенты и партнеры могут расширить стандартную автоматизацию, определяя новые рабочие процессы и добавляя их в общий процесс. Рабочие процессы могут быть запланированы выполняться с определенным графиком или при соблюдении определенного условия в базе данных (например, при создании инцидента или при его переходе в определенное состояние, такое как Активный или Разрешен).

Средство разработки Service Manager предоставляет простой в использовании метод создания новых рабочих процессов. Он предоставляет библиотеку различных действий рабочего процесса, таких как "Создание инцидента" и "Обновление инцидента", а также использующий операцию перетаскивания графический конструктор, который можно использовать для упорядочивания этих действий в последовательности рабочего процесса. Затем средство разработки компилирует новый рабочий процесс в набор определений, кода и содержимого пакета управления. При импорте этих сведений в Service Manager новый рабочий процесс интегрируется в указанное решение.

Понимание того, что происходит за кулисами средства разработки, может помочь более опытным пользователям. Во-первых, клиенты и партнеры могут использовать эти сведения для расширения библиотеки действий рабочих процессов в Service Manager с помощью действий рабочих процессов, которые применяются к конкретным процессам. Во-вторых, разработчики могут использовать эти сведения для создания пользовательских или расширенных рабочих процессов, совместимых с Service Manager с помощью выбранного средства разработки, например системы разработки Microsoft Visual Studio.

Действия рабочего процесса и класс WorkflowActivityBase

Service Manager рабочие процессы используют действия WF. Для бесперебойной работы со средством разработки эти действия являются производными от базового класса WorkflowActivityBase, который принадлежит пространству имен Microsoft.EnterpriseManagement.Workflow.Common . Базовый класс WorkflowActivityBase содержит свойства и методы, недоступные в универсальном базовом классе Activity для действий WF. Дополнительные сведения об определении действий WF с помощью универсального базового класса Activity см. в разделе Activity Class.

Преимущества использования класса WorkflowActivityBase

Пользователи могут импортировать действия WF из библиотеки действий Visual Studio и работать с этими действиями в области Разработка средств разработки . Однако эти действия демонстрируют такое же поведение, как в проектировочной среде Visual Studio. У них нет настроек, встроенных в библиотеку действий Service Manager.

Примечание

Не все действия WF Visual Studio были проверены на совместимость со средством разработки, и некоторые действия WF Visual Studio могут работать неправильно в средстве разработки.

В представленной ниже таблице перечислены различия в поведении действий WF, основанных на базовом классе WorkflowActivityBase и действий WF, основанных на универсальном базовом классе Activity .

Сценарий Действие WF средства разработки (базовый класс WorkflowActivityBase ) Действие WF из Visual Studio (базовый классActivity )
Пользователь привязывает свойства действия (к Service Manager свойствам объекта или к свойствам из других действий). Вызывает свойство Bind для диалогового окна, настроенного для Service Manager пользователей. Вызывает свойство Bind для диалогового окна, предназначенного для разработчиков.
Пользователь добавляет действие к действию Петля For-Each . Добавляет свойства Propertytobind (индекс петли) и CurrentItem, необходимые для участия в операциях петли (CurrentItem является внутренним свойством). Ведет себя одинаково для каждой итерации цикла и не взаимодействует со свойством, которое индексирует цикл.

Важно!

Из-за настроек, необходимых для конструктора рабочих процессов средства разработки, действия, основанные на классе WorkFlowActivityBase , не работают должным образом в среде разработки рабочих процессов Visual Studio.

Пользователи могут создавать пользовательские действия WF в Visual Studio для использования в средстве разработки. Однако, чтобы воспользоваться пользовательским поведением средства разработки во время разработки, пользовательские действия должны основываться на классе WorkflowActivityBase , а не на классе Activity .

Действия рабочих процессов и Service Manager автоматизированные действия

Действия WF могут взаимодействовать с другим типом действий, Service Manager действиями, которые используются Service Manager рабочими элементами. Рабочие элементы — это один из main типов объектов, которые используются Service Manager. Рабочие элементы используются для отслеживания рабочих единиц, таких как Инциденты, Запросы на обслуживание, Запросы на изменениеи пр. Большинство рабочих элементов состоит из одного или нескольких Service Manager действий. Например, Запрос на изменение обычно содержит не менее двух действий: Проверка и Выполнение изменения . Рабочий элемент обычно выполняет эти операции по порядку.

При создании рабочего элемента первое действие Service Manager становится активным и остается активным, пока Service Manager (или пользователь) выполняет любую работу, которую представляет действие. После завершения этой работы Service Manager помечает первое действие как завершенное и активирует следующее действие в последовательности. Когда последнее действие в последовательности помечается как Завершено, Service Manager помечает весь рабочий элемент как Завершенный.

Некоторые Service Manager действия можно выполнять вручную, например действие "Проверка" запроса на изменение. Другие Service Manager действия можно автоматизировать, например действие, которое отправляет сообщение электронной почты пользователю. Действие Выполнение изменениязапроса на изменение может быть автоматизировано. Service Manager использует рабочие процессы WF для автоматизации действий Service Manager.

Пример. Присвойте действию состояние завершено.

В этом примере действия рабочего процесса WF в Service Manager используется действие Присвоить состояние действия завершено WF. Это действие WF обычно представляет собой последний шаг в рабочем процессе, который реализует автоматизированное действие Service Manager и устанавливает для него состояние Завершено. Установка данного статуса заставляет систему перейти к следующему действию в рабочем элементе, и данный процесс повторяется до тех пор, пока не будет выполнено последнее действие в рабочем элементе.

Действие Set Activity Status (Присвоить состоянию действия) значение Завершено принимает один входной идентификатор действия, который определяет Service Manager действие, с которым нужно действовать. Затем действие WF подключается к серверу управления Service Manager, извлекает указанное действие Service Manager из базы данных, устанавливает для него состояние Завершено, а затем сохраняет его обратно в базу данных. Большинство примеров кода, включенных в данный пример, взяты из файла SetActivityStatusToCompleted.cs — базового файла, описывающего действие Назначить действию состояние "Выполнено" .

Инициализация примера действия WF

Первый раздел файла SetActivityStatusToCompleted.cs содержит операторы декларации и инициализации. Данное действие основано на классе WorkflowActivityBase , оно использует проверяющий класс SetActivityStatusToCompletedValidator и проектный класс WorkflowActivityBaseDesigner.

Класс WorkflowActivityBaseDesigner содержит настройки, описанные в предыдущем разделе Преимущества использования класса WorkflowActivityBase. Этот класс поддерживает дальнейшее расширение и настройку.

Первый раздел определения данного образца действия содержит следующий код:

namespace Microsoft.ServiceManager.WorkflowAuthoring.ActivityLibrary
{
    // ---------------------------------------------------------------------
    /// <summary>
    /// Activity to set an activity's status to complete
    /// </summary>
    // ---------------------------------------------------------------------
    [ToolboxItem(typeof(ActivityToolboxItem))]
    [ActivityValidator(typeof(Validators.SetActivityStatusToCompletedValidator))]
    [Designer(typeof(WorkflowActivityBaseDesigner))]
    public sealed partial class SetActivityStatusToCompleted : WorkflowActivityBase
    {

Входные свойства для примера действия WF

Код объявляет одно свойство, ActivityId, как свойство зависимостей. Это означает, что данное свойство может быть привязано к параметрам, определенным на уровне рабочего процесса. В этом случае идентификатор действия Service Manager передается в рабочий процесс в качестве параметра рабочего процесса и передается в это действие в качестве входных данных.

  // --------------------------------------------------------------------------------
  /// <summary>
  /// Dependency Property for ActivityId property
  /// </summary>
  // --------------------------------------------------------------------------------
  public static DependencyProperty ActivityIdProperty =
      DependencyProperty.Register("ActivityId", typeof(String), typeof(SetActivityStatusToCompleted));

  // --------------------------------------------------------------------------------
  /// <summary>
  /// Activity ID
  /// </summary>
  // --------------------------------------------------------------------------------
  [Browsable(true)]
  [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
  public string ActivityId
  {
      get
      {
          return (string)this.GetValue(ActivityIdProperty);
      }
      set
      {
          this.SetValue(ActivityIdProperty, value);
      }
}

Поведение выполнения в примере действия WF

Метод Execute осуществляет фактическую деятельность данного действия WF. В области метода Execute действие WF выполняет следующие операции:

  • Определяет, работает ли он в действии For-Each Loop , и, если да, задает соответствующие свойства действия WF.

  • Подключается к указанному серверу управления Service Manager и создает объект EnterpriseManagementGroup.

  • Использует свойство ActivityId для получения идентифицированного действия Service Manager из базы данных.

  • Находит определение класса действия Service Manager, получает свойство Status полученного действия Service Manager и задает для свойства значение списка перечисления Completed.

  • Фиксирует изменения в Service Manager действии.

  • Использует метод TrackData (входит в инфраструктуру WF) для сохранения сведений о наблюдении за выполнением и состоянием действия WF.

        // --------------------------------------------------------------------------------
        /// <summary>
        /// The execute method will have the implementation to set the activity status to complete.
        /// </summary>
        // --------------------------------------------------------------------------------
        protected override ActivityExecutionStatus Execute(ActivityExecutionContext executionContext)
        {
            try
            {
                // Initialize the current item if the activity contained within the For-Each loop
                base.Execute(executionContext);

                // Validate Parameters
                if (String.IsNullOrEmpty(ActivityId))
                {
                    throw new ArgumentNullException("ActivityId");
                }

                string SMServer = "localhost";

                Guid TaskGuid = new Guid(ActivityId);
                EnterpriseManagementGroup _mg = new EnterpriseManagementGroup(SMServer);

                EnterpriseManagementObject Activity = _mg.EntityObjects.GetObject
                    <EnterpriseManagementObject>(TaskGuid, ObjectQueryOptions.Default);

                ManagementPack SystemMP = _mg.ManagementPacks.GetManagementPack(
                    SystemManagementPack.System);
                ManagementPack ActivityMP = _mg.ManagementPacks.GetManagementPack(
                    Resources.ActivityManagementMP, SystemMP.KeyToken, SystemMP.Version);

                ManagementPackClass activityClass = _mg.EntityTypes.GetClass(
                    Resources.WorkItemActivityClass, ActivityMP);

                ManagementPackProperty status = activityClass.PropertyCollection["Status"];
                ManagementPackEnumeration Completed =
                    _mg.EntityTypes.GetEnumeration("ActivityStatusEnum.Completed", ActivityMP);

                Activity[status].Value = Completed;
                Activity.Commit();
            }
            catch (ArgumentNullException argNullException)
            {
                // Log to Tracking Service
                TrackData(argNullException.ToString());

                throw;
            }
            catch (EnterpriseManagementException mgmtException)
            {
                TrackData(mgmtException.ToString());
                throw;
            }

            return ActivityExecutionStatus.Closed;
        }
    }
}

Поведение проверки в примере действия WF

Файл SetActivityStatusToCompletedValidator.cs определяет проверочное поведение действия WF. Данное поведение определяет, каким образом конструктор указывает, является ли определение действия WF полным или требуется дополнительно указать одно или несколько входных значений. Средство разработки указывает на ошибку проверки аналогично Visual Studio с помощью красного восклицательного знака (!) на действии рабочего процесса в области разработки .

namespace Microsoft.ServiceManager.WorkflowAuthoring.ActivityLibrary.Validators
{
    // --------------------------------------------------------------------------------
    /// <summary>
    /// Validator for the SetActivityStatusToCompleted activity
    /// </summary>
    // --------------------------------------------------------------------------------
    internal class SetActivityStatusToCompletedValidator : ActivityValidator
    {
        // --------------------------------------------------------------------------------
        /// <summary>
        /// Validator for the SetActivityStatusToCompleted activity
        /// </summary>
        // --------------------------------------------------------------------------------
        public override ValidationErrorCollection Validate(ValidationManager manager, object obj)
        {
            // Performing default validation
            ValidationErrorCollection errorColl = base.Validate(manager, obj);

            SetActivityStatusToCompleted setActivityStatusToCompletedObj =
                (SetActivityStatusToCompleted)obj;

            // Check if validation is happening during compilation of activity and
            // not during the hosting of an activity
            if (setActivityStatusToCompletedObj.Parent == null)
            {
                return errorColl;
            }

            string propertyName = Common.GetPropertyName(setActivityStatusToCompletedObj);

            // Add validation error if ActivityId is null or empty
            if (setActivityStatusToCompletedObj.ActivityId == null
                &&
                setActivityStatusToCompletedObj.GetBinding(SetActivityStatusToCompleted.ActivityIdProperty) == null
                &&
                String.Compare(propertyName, "ActivityId", false, CultureInfo.InvariantCulture) != 0)
            {
                errorColl.Add(new ValidationError(
                    Resources.SetActivityStatusToCompleted_ActivityId_DesignTimeValidation, 10, false));
            }

            return errorColl;
        }
    }
}

Использование примера действия WF в рабочем процессе

Действие Set Activity Status (Присвоить состояние действия завершено ) включено в область панели элементов действий средства разработки по умолчанию. Дополнительные сведения о добавлении настраиваемых действий на панель элементов действий см. в разделе How to Install a Custom Activity Assembly.

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

  • Пользователи без навыков разработки могут создавать рабочие процессы; им не нужно работать с кодом напрямую.

  • Когда пользователь сохраняет рабочий процесс в средстве разработки, средство создает соответствующий код Visual C# и XOML и компилирует его в файл .dll. Средство также интегрирует рабочий процесс с пакетом управления, который может взаимодействовать напрямую с Service Manager.

Visual C# Code для рабочего процесса

В следующем примере показан код Visual C#, создаваемый средством разработки для примера рабочего процесса, в котором для параметра Установить состояние действия значение Завершено . Этот код объявляет простой последовательный рабочий процесс SetActivityStatusToCompleteWF с одним параметром рабочего процесса — свойством зависимостей ActivityId. Значение ActivityID устанавливается определениями пакета управления, показанными дальше в данном примере. При запуске рабочего процесса Service Manager определяет значение и передает его в рабочий процесс.

namespace WorkflowAuthoring
{
    using System;
    using System.ComponentModel;
    using System.ComponentModel.Design;
    using System.Workflow.ComponentModel.Design;
    using System.Workflow.ComponentModel;
    using System.Workflow.ComponentModel.Serialization;
    using System.Workflow.ComponentModel.Compiler;
    using System.Drawing;
    using System.Collections;
    using System.Workflow.Activities;
    using System.Workflow.Runtime;

    public partial class SetActivityStatusToCompleteWF : System.Workflow.Activities.SequentialWorkflowActivity
    {

        public static DependencyProperty ActivityIdProperty = DependencyProperty.Register("ActivityId", typeof(string), typeof(SetActivityStatusToCompleteWF));

        [System.ComponentModel.DesignerSerializationVisibilityAttribute(DesignerSerializationVisibility.Visible)]
        [System.ComponentModel.BrowsableAttribute(true)]
        [System.ComponentModel.CategoryAttribute("Misc")]
        public string ActivityId
        {
            get
            {
                return ((string)(this.GetValue(ActivityIdProperty)));
            }
            set
            {
                this.SetValue(ActivityIdProperty, value);
            }
        }
    }
}

Код XOML для рабочего процесса

WF использует формат XOML для некоторых определений рабочего процесса. Для примера рабочего процесса средство разработки создает файл SetActivityStatusToCompleteWF.xoml со следующим содержимым:

<SequentialWorkflowActivity x:Class="WorkflowAuthoring.SetActivityStatusToCompleteWF" x:Name="SetActivityStatusToCompleteWF" xmlns:ns0="clr-namespace:Microsoft.ServiceManager.WorkflowAuthoring.ActivityLibrary;Assembly=Microsoft.ServiceManager.WorkflowAuthoring.ActivityLibrary, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml" xmlns="https://schemas.microsoft.com/winfx/2006/xaml/workflow">
<ns0:SetActivityStatusToCompleted ActivityId="{ActivityBind SetActivityStatusToCompleteWF,Path=ActivityId}" x:Name="setActivityStatusToCompleted1" PropertyToBind="{x:Null}" />
</SequentialWorkflowActivity>

SetActivityStatusToCompleteWF.xoml объявляет, что рабочий процесс SetActivityStatusToCompleteWF выполняет одно действие рабочего процесса, присвоив состояние действия значение Завершено. У этого действие имеется один входной параметр, ActivityId, получающий свое значение из свойства ActivityId в рабочем процессе.

Объявление рабочего процесса и его условия триггера в пакете управления

Service Manager не может использовать изолированный рабочий процесс .dll файл; рабочий процесс должен быть интегрирован с пакетом управления. Пакет управления определяет, когда рабочий процесс должен запускаться и какие входные значения использовать. В то же время, когда он создает код рабочего процесса и компилирует рабочий процесс .dll файл, средство разработки добавляет сведения, связанные с рабочим процессом, в пакет управления.

Образец рабочего процесса ( SetActivityStatusToCompleteWF) сопоставлен с образцом пакета управления — Woodgrove.AutomatedActivity.AddComputerToGroupMP.xml. Этот пакет управления расширяет процесс управления изменениями с помощью нового автоматизированного действия Service Manager. Когда новое действие становится активным в ходе операции управления изменениями, оно активирует рабочий процесс SetActivityStatusToCompleteWF .

Пакет управления определяет триггер рабочего процесса (когда новое действие Service Manager изменяет состояние) и определяет значение, используемое для свойства ActivityId (уникальный идентификатор нового действия Service Manager). При выполнении рабочего процесса состояние нового действия Service Manager изменяется на Завершено. Обратите внимание, что в обычном рабочем процессе это был бы последний шаг, следующий за какой-либо задачей, выполняемой другими определенными в рабочем процессе действиями WF.

Раздел Monitoring в пакете управления содержит определение Rule для рабочего процесса. Само определение Rule поделено на две части: элемент DataSource и элемент WriteAction .

Для примера рабочего процесса элемент DataSource содержит элемент Subscription, который указывает, что рабочий процесс должен выполняться, когда экземпляр класса AddComputerToGroup (пользовательский класс Service Manager) изменит состояние на Активно.

<Monitoring>
    <Rules>
        <Rule ID="SetActivityToCompleteRule" Enabled="true" Target="SystemCenterLibrary!Microsoft.SystemCenter.SubscriptionWorkflowTarget" ConfirmDelivery="false" Remotable="true" Priority="Normal" DiscardLevel="100">
            <Category>Notification</Category>
            <DataSources>
                <DataSource ID="DS" TypeID="Subscriptions!Microsoft.SystemCenter.CmdbInstanceSubscription.DataSourceModule">
                    <Subscription>
                        <InstanceSubscription Type="$MPElement[Name='AddComputerToGroup']$">
                            <UpdateInstance><Criteria><Expression><SimpleExpression>
                                <ValueExpression>
                                    <Property State="Post">$Context/Property[Type='Activity!System.WorkItem.Activity']/Status$</Property>
                                </ValueExpression>
                                <Operator>Equal</Operator>
                                <ValueExpression>
                                    <Value>$MPElement[Name='Activity!ActivityStatusEnum.Active']$</Value>
                                </ValueExpression>
                            </SimpleExpression></Expression></Criteria></UpdateInstance>
                        </InstanceSubscription>
                        <StartWatermark>1</StartWatermark>
                        <PollingIntervalInSeconds>60</PollingIntervalInSeconds>
                        <BatchSize>100</BatchSize>
                    </Subscription>
                </DataSource>
            </DataSources>
        </Rule>
    </Rules>
</Monitoring>

Элемент WriteAction (а именно Microsoft.EnterpriseManagement.SystemCenter.Subscription.WindowsWorkflowTaskWriteAction) определяет, что нужно делать при соблюдении условия активации. В рамках данного элемента элемент Subscription идентифицирует запускаемый файл сборки (SetActivityStatusToCompleteWF.dll) и класс в сборке, представляющий рабочий процесс ( WorkflowTypeName).

Элемент Subscription также содержит элемент WorkflowParameter, который определяет свойство ActivityId и, используя синтаксис $Data/BaseManagedEntityId$, привязывает его к уникальному идентификатору действия Service Manager, записанного в элементе DataSource.

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

<WriteActions>
    <WriteAction ID="WA" TypeID="Subscriptions!Microsoft.EnterpriseManagement.SystemCenter.Subscription.WindowsWorkflowTaskWriteAction">
        <Subscription>
            <WindowsWorkflowConfiguration>
                <AssemblyName>SetActivityStatusToCompleteWF</AssemblyName>
                <WorkflowTypeName>WorkflowAuthoring.SetActivityStatusToCompleteWF</WorkflowTypeName>
                <WorkflowParameters>
                    <WorkflowParameter Name="ActivityId" Type="string">
                        $Data/BaseManagedEntityId$
                    </WorkflowParameter>
                </WorkflowParameters>
                <RetryExceptions></RetryExceptions>
                <RetryDelaySeconds>60</RetryDelaySeconds>
                <MaximumRunningTimeSeconds>300</MaximumRunningTimeSeconds>
            </WindowsWorkflowConfiguration>
        </Subscription>
    </WriteAction>
</WriteActions>

Импорт пакета управления

Чтобы рабочий процесс выполнялся на определенном сервере управления Service Manager, все файлы, связанные с рабочим процессом, должны находиться на этом сервере. Эти файлы включают в себя:

  • Файлы сборки действий WF. Если вы используете только Service Manager действий WF, по умолчанию устанавливаются соответствующие файлы. Если вы используете пользовательские действия, см. статью Установка сборки пользовательского действия.

  • Файл сборки рабочего процесса, в данном случае — SetActivityStatusToCompleteWF.dll. Этот файл необходимо вручную скопировать на сервер управления Service Manager.

  • Файл пакета управления, в данном случае — Woodgrove.AutomatedActivity.AddComputerToGroupMP.xml. Этот файл необходимо вручную скопировать на сервер управления Service Manager.

Когда все файлы будут на месте, импортируйте пакет управления в Service Manager. Это можно сделать с помощью программы командной строки mpimport.exe или консоли Service Manager. После импорта пакета управления рабочий процесс готов к запуску при каждом выполнении условия, определенного как триггер.

Дальнейшие действия