相关文章推荐
老实的橙子  ·  Day 11 : psycopg2 操作 ...·  6 小时前    · 
风流的松树  ·  Unity ...·  4 天前    · 
强悍的牛排  ·  Android中的加密 - 知乎·  1 年前    · 

This browser is no longer supported.

Upgrade to Microsoft Edge to take advantage of the latest features, security updates, and technical support.

Download Microsoft Edge More info about Internet Explorer and Microsoft Edge

The asynchronous service executes long-running operations independent of the main Microsoft Dataverse core operation. This results in improved overall system performance and improved scalability. The asynchronous service features a managed first-in, first-out (FIFO) queue for the execution of asynchronous registered plug-ins, workflows, and operations such as bulk mail, bulk import, and campaign activity propagation. These operations are registered with the asynchronous service and executed periodically when the service processes its queue.

After an event occurs and any synchronous extensions have been processed, the platform serializes the context for any asynchronous extensions and saves it to the database as a System Job in the AsyncOperation Table . The system job defines and tracks the execution of the asynchronous operation. As resources become available system jobs are processed and the operations they define are executed. Any data operations defined in the extension will again be processed by the event execution pipeline, but this time as a synchronous operation.

Execution order and dependencies

System jobs are evaluated as a queue using the CreatedOn date. If there are no conditions to defer execution they will be executed as soon as resources are available. Execution is not guaranteed to be performed in the order set by the CreatedOn date because different types of operations require different resources.

A system job can be dependent on another system job so that it will begin only after the other system job completes. This dependency is established by the DependencyToken column value. Dependencies are established when a system job is created. If the DependencyToken value is null, the system job has no dependencies. Dependent system jobs will have the same DependencyToken value and will be executed in the order they were created. If a system job is postponed, all subsequent dependent system jobs will continue to wait until the postponed system job executes.

This dependency system cannot be used by plug-ins registered to run asynchronously because the system jobs for them are created by the system.

Managing system jobs

You can perform the following operations to manage system jobs using the AsyncOperation Table .

  • Retrieve system jobs
  • Delete system jobs
  • Manage system job states
  • Postpone system jobs
  • Creating system jobs with code is not supported. Although the AsyncOperation table supports several writeable columns and create operations, only the following columns are supported for update:

  • StateCode
  • StatusCode
  • PostPoneUntil
  • Retrieve system jobs

    You can view system jobs in the application by navigating to Settings > System > System Jobs and you can also search them using advanced find.

    Using code, you can retrieve system jobs like any other table. The following table lists selected columns which are important in understanding system jobs:

    Column Description DependencyToken Execution of all operations with the same dependency token is serialized. More information: Execution order and dependencies Depth Number of SDK calls made since the first call. ErrorCode Error code returned from a canceled system job. ExecutionTimeSpan Time that the system job has taken to execute. FriendlyMessage Message provided by the system job. IsWaitingForEvent Indicates that the system job is waiting for an event. Message Message related to the system job. MessageName Name of the message that started this system job. ModifiedBy Unique identifier of the user who last modified the system job. ModifiedOn Date and time when the system job was last modified. Name of the system job. OperationType Type of the system job. More information: Operation Types OwnerId Unique identifier of the user or team who owns the system job. OwningBusinessUnit Unique identifier of the business unit that owns the system job. OwningExtensionId Unique identifier of the owning extension with which the system job is associated. OwningTeam Unique identifier of the team who owns the record. OwningUser Unique identifier of the user who owns the record. PostponeUntil Indicates whether the system job should run only after the specified date and time. More information: Postpone system jobs PrimaryEntityType Type of table with which the system job is primarily associated. RecurrencePattern Pattern of the system job's recurrence. More information: Recurrence start times and patterns RecurrenceStartTime Starting time in UTC for the recurrence pattern. More information: Recurrence start times and patterns RegardingObjectId Unique identifier of the object with which the system job is associated. RetryCount Number of times to retry the system job. Sequence Order in which operations were submitted. StartedOn Date and time when the system job was started. StateCode Status of the system job. More information: Manage system job states StatusCode Reason for the status of the system job. More information: Manage system job states UTCConversionTimeZoneCode Time zone code that was in use when the record was created. WorkflowStageName Name of a workflow stage.

    Examples

    You can use the following examples to retrieve System Job data

    Web API

    Use the following Web API Query to retrieve the columns in the table above. More information: Query Data using the Web API

    <organization URL>/api/data/v9.0/asyncoperations?
    $select=
    asyncoperationid,
    completedon,
    createdon,
    data,
    dependencytoken,
    depth,
    errorcode,
    executiontimespan,
    friendlymessage,
    iswaitingforevent,
    message,
    messagename,
    modifiedon,
    name,
    operationtype,
    _ownerid_value,
    postponeuntil,
    primaryentitytype,
    recurrencepattern,
    recurrencestarttime,
    _regardingobjectid_value,
    retrycount,
    sequence,
    startedon,
    statecode,
    utcconversiontimezonecode,
    workflowstagename
    &$expand=
    createdby($select=fullname),
    modifiedby($select=fullname),
    owningbusinessunit($select=name),
    owningextensionid($select=name),
    owningteam($select=name),
    owninguser($select=fullname)
    

    With the Web API there is a single-valued navigation property for each table that supports system jobs. The name of this navigation property follows the pattern regardingobjectid_<table logical name>.

    FetchXml

    Use the following FetchXML to retrieve the columns in the table above. More information: Use FetchXML to construct a query

    <fetch>
      <entity name="asyncoperation" >
        <attribute name="asyncoperationid" />
        <attribute name="completedon" />
        <attribute name="createdby" />
        <attribute name="createdon" />
        <attribute name="data" />
        <attribute name="dependencytoken" />
        <attribute name="depth" />
        <attribute name="errorcode" />
        <attribute name="executiontimespan" />
        <attribute name="friendlymessage" />
        <attribute name="iswaitingforevent" />
        <attribute name="message" />
        <attribute name="messagename" />
        <attribute name="modifiedby" />
        <attribute name="modifiedon" />
        <attribute name="name" />
        <attribute name="operationtype" />
        <attribute name="ownerid" />
        <attribute name="owningbusinessunit" />
        <attribute name="owningextensionid" />
        <attribute name="owningteam" />
        <attribute name="owninguser" />
        <attribute name="postponeuntil" />
        <attribute name="primaryentitytype" />
        <attribute name="recurrencepattern" />
        <attribute name="recurrencestarttime" />
        <attribute name="regardingobjectid" />
        <attribute name="retrycount" />
        <attribute name="sequence" />
        <attribute name="startedon" />
        <attribute name="statecode" />
        <attribute name="utcconversiontimezonecode" />
        <attribute name="workflowstagename" />
      </entity>
    </fetch>
    

    Every table that supports system jobs has a listed Many-to-One relationship with the AsyncOperation table via the RegardingObjectId lookup column. The name of this relationship follows the pattern <table schema name>_AsyncOperations.

    Operation Types

    The OperationType column describes categories of system jobs. Many of these types are initiated by the platform to perform maintenance tasks.

    You cannot perform cancel, pause, or resume operations on system jobs generated by the platform.

    Some of the types of these platform generated jobs are included in the following table:

    OperationType Value OperationType Label

    Recurrence start times and patterns

    Recurring system jobs require information about when they should start and how often they will recur. These values are stored in the AsyncOperation table, RecurrenceStartTime and RecurrencePattern columns.

    Because you will not create AsyncOperation records directly with code, you will just need to interpret these values if you query the data. You will only set these properties indirectly by using messages that will create new system jobs. The BulkDelete and BulkDeleteDuplicates messages both include parameters or properties in the corresponding Web API actions or SDK for .NET request classes. More information: BulkDetectDuplicatesRequest Class, BulkDetectDuplicates Action, BulkDeleteRequest Class, and BulkDelete Action

    The RecurrenceStartTime is simply a datetime value to indicate when the system job should start. If it isn’t set, the system job was expected to start immediately.

    The RecurrencePattern column stores information about how frequently recurring system jobs occur. This value may be set by the platform when a new asyncoperation table is created. You may set this value to change the pattern.

    The values for this column use parts of the RFC2445 Internet standard (Internet Calendaring and Scheduling Core Object Specification).

    The following table provides from examples:

    Recurrence pattern Frequency of job execution

    If an INTERVAL value is not set, it will be interpreted as 1.

    Delete system jobs

    You can delete system jobs in the application or in code just like any other table if you have the necessary privileges to do so.

    When registering asynchronous plug-ins, there is an option to automatically delete successful operations. It is recommended that you use it. More information: Write a plug-in

    The common practice is to create a recurring bulk deletion job that will delete those jobs which succeeded. More information Remove a large amount of specific, targeted data with bulk deletion

    Manage system job states

    The status of the system job will change multiple times until the operation is completed. The following are the StateCode and StatusCode options that represent the available state and status reason values:

    StateCode Value StateCode Label StatusCode Value StatusCode Label

    You can change the status of system jobs in the application by navigating to Settings > System > System Jobs and using commands available in the More Actions menu.

    Any action you can perform via this UI can also be performed using code. You cannot perform cancel, pause, or resume operations on system jobs generated by the platform. More information: Operation types

    Together with options to manage views, the following options to manage system jobs are available:

    Option Description Bulk Delete Using the More Actions menu.
    Opens a wizard to define conditions and create a new Bulk Deletion system job to delete the matching system jobs. Cancel Using the More Actions menu.
    Cancels the system job. Resume Using the More Actions menu.
    Resumes a paused system job. Postpone Using the More Actions menu.
    Reschedules a system job Pause Using the More Actions menu.
    Pauses a system job.

    Whether the requested operation will occur depends on the state of the system job. For example, you cannot pause a job that has already completed or hasn’t started yet. The table below describes the conditions for each change and what will happen when they are selected.

    Option Valid StateCode values Change Cancel 0 (Ready)
    1 (Suspended)
    2 (Locked) StateCode changed to 3 (Completed) and StatusCode changed to 32 (Cancelled) Resume 1 (Suspended) StateCode changed to 0 (Ready) Postpone 0 (Ready)
    2 (Locked) Postpone Job dialog prompts user for datetime value to postpone the system job. More information: Postpone system jobs Pause 2 (Locked) StateCode changed to 1 (Suspended)

    Postpone system jobs

    The PostPoneUntil column contains a datetime value when the system job will change state from 1 (Suspended) to 0 (Ready). Together with the StateCode and StatusCode columns, these are the only columns supported for update when using the AsyncOperation table.

    See also

    Write a plug-in
    Write plug-ins to extend business processes