Create a Deferred Event Generation Operation from a Script

Hello,

We are migrating a client from 6.1.2 to 7.1.1. In their 6.1.2 environment they have a script that creates deferred operations to generate an event for process generation using classes from the VI.DB.DeferredOperations namespace. Here is the code snippet:

 

 
Dim newEffDate As DateTime = resEffectiveDate.AddHours(1.0)

Dim saveTask As DeferredOperations.DeferredJobGenTask
saveTask = New DeferredOperations.DeferredJobGenTask("SAVE_LATER", params)

Dim op As DeferredOperations.DeferredOperation
op = New DeferredOperations.DeferredOperation(obj, saveTask, newEffDate)

op.Save()
 

However, v7.1.1 does not have the DeferredOperation and DeferredJobGenTask classes. Is there an alternative approach to get this done in v7.1.1?

 

This is similar to the forum post below where the OP is trying to create deferred operations to save objects instead of generating events:

https://www.quest.com/community/products/one-identity/f/identity-manager/6894/delayed-save-deferred-operations-via-dialogscript

 

Thanks in advance,

Febin

  • Hi Febin,

    just to ensure that everyone knows how-to do it.

     

    How-to create deferred operations in V7

    Introduction

    Starting with version 7 the deferred operations had to be restructured for the new object layer. An usage analysis led to the conclusion that the costs for keeping the class VI.DB.DeferredOperations.DeferredOperation in the compatibility layer were too high to keep it.

    Migration from 6 to 7

    If you used the class VI.DB.DeferredOperations.DeferredOperation in your scripts in version 6 or below, you have to change the usage accordingly in version 7.

    Samples

    The following two code samples demonstrate the use of the class VI.DB.DeferredOperations.DeferredBlock in version 7.

    Sample: Using a Deferred Block for IEntities

    ' Create a new DeferredBlock for a point in time.
    Using New VI.DB.DeferredOperations.DeferredBlock(Session, DateTime.UtcNow.AddDays(45), "Optional description for operation")
        ' Operations done here are done deferred
        Dim dbObj = Session.Source().CreateNew("PersonInOrg")
        dbObj.PutValue("UID_Person""a76311be-c2cd-4be3-be5d-b8d85c3bb863")
        dbObj.PutValue("UID_Org""b0b4be5a-bcc1-453d-aaf5-b5a7d8531224")
     
        Using uow = Session.StartUnitOfWork()
            uow.Put(dbObj)
            uow.Commit()
        End Using
    End Using
    

    Sample: Using a deferred block for ISingleDBObjects

    ' Create a new DeferredBlock for a point in time.
    Using New VI.DB.DeferredOperations.DeferredBlock(Connection, DateTime.UtcNow.AddDays(45), "Optional description for operation")
        ' Operations done here are done deferred
        Dim dbObj = Connection.CreateSingle("PersonInOrg")
        dbObj.PutValue("UID_Person""a76311be-c2cd-4be3-be5d-b8d85c3bb863")
        dbObj.PutValue("UID_Org""b0b4be5a-bcc1-453d-aaf5-b5a7d8531224")
        dbObj.Save()
    End Using
  • Thanks Markus. This is very close to what I need. However, I need to defer the generation of an event on an ISingleDBObject (obj in my code above).

    I know the IUnitOfWork has a Generate method that lets you generate an event. Is there something similar for ISingleDBObject?

    Thanks,
    Febin
  • The deferred operations do not support this.

    But you can generate an event with the start time of the first process step set to the future.

    The following code sample demonstrates this for ISingleDBObject and for IEntity.

    #If Not SCRIPTDEBUGGER Then
        Imports System.Collections.Generic
    #End If
    Public Sub SDK_GenerateEvent_StartingInTheFuture()
        Dim htParameter = New Dictionary(Of String, Object)(StringComparer.OrdinalIgnoreCase) ' Dictionary for any additional parameters
     
        Dim dbObj As ISingleDbObject = Connection.CreateSingle("DialogTimeZone""QBM-FF60FBBFC1C18061DF4456004F7B34D2")
     
        ' Add parameter __STARTTIME with the start time of your choice.
        htParameter.Add("__STARTTIME"DateTime.UtcNow.AddDays(10))
     
        ' OPTION 1: Generation using ISingleDBObject
        VI.DB.JobGeneration.JobGen.Generate(dbObj, "UPDATEUTCOFFSET", htParameter)
     
         ' OPTION 2: Generation using UnitOfWork and iEntity
        Using uow As IUnitOfWork = Session.StartUnitOfWork()
            uow.Generate(dbObj.GetEntity(), "UPDATEUTCOFFSET", htParameter)
            ' Commit the changes         uow.Commit()     End Using End Sub
  • Thanks Markus!

    This is definitely a great solution.
  • What would be the parameter name for defining queue name? (just queuename) ? ....I need to start some fire event generations in a queue other than primary SQL processing queue!

  • I think you are getting it all wrong. You do not specify a queue during the event generation, the queue to use will be defined by the settings for the execution server in your process steps. So if you want to execute a process on a different queue based on some parameter, you need to use a custom script to generate the execution server in the process steps of your process.

    • Yes...that is clear. But firegen process that generate event is fired in the SQL processing queue by default. Is there a way to change that? This is needed for a client request to achieve a low latency andWink we think about a dedicated queue with a retry time of 5 sec.... And This would not be a wise idea for SQL processing queue! Wink
  • If you are firing an event using the Object Layer, there will be no intermediate FireGenEvent in the job queue. This additional step is only necessary if you are using SQL to generate the event or if the DB Queue Processor has to generate events.