Automic Workload Automation

 View Only
  • 1.  How to count Object in Queues

    Posted Dec 13, 2019 02:54 AM
    Edited by Thomas H Dec 13, 2019 04:14 AM
    Hi,

    i search a way to count object - active, waiting, ..... - in a Queue Object.

    Hope someone has an idea :)

    to explain it otherwise.
    I need to do this java TaskFilter without Java:
    It selects New Tasks - does a filter on the Queue with an Status-Code Range.

    private final static String STATUS_CODES_ACTIVE_TASKS = "1300-1558,1565-1599";

    private TaskList getActiveTasksInQueue(Connection connection) throws AutomicException {

    TaskFilter taskFilter = new TaskFilter();

          UC4ObjectName uc4ObjectName = new UC4ObjectName(queueName);

          taskFilter.addQueueFilter(uc4ObjectName);

          taskFilter.setStatus(STATUS_CODES_ACTIVE_TASKS);

          TaskList taskList = new TaskList(taskFilter);

          send(taskList, connection); 

          return taskList;

    }

    TaskList list = getActiveTasksInQueue(connection);

    if (list.size() > 0) {



    Thanks
    Thomas


  • 2.  RE: How to count Object in Queues

    Posted Dec 13, 2019 08:13 AM
    Hi

    Your explanation is a bit confusing, what do you need exactly?

    i search a way to count object - active, waiting, ..... - in a Queue Object. => A queue object does not hold other objects, do you mean "count active objects in a specific queue"?

    I need to do this java TaskFilter without Java  => in which language do you need it? SQL? Automic Script? another?

    What I understood: you want to count active objects in a queue depending on their status, correct?
    I can help you with an SQL statment if thats ok..

    cheers, Wolfgang

    ------------------------------
    Support Info:
    if you are using one of the latest version of UC4 / AWA / One Automation please get in contact with Support to open a ticket.
    Otherwise update/upgrade your system and check if the problem still exists.
    ------------------------------



  • 3.  RE: How to count Object in Queues
    Best Answer

    Posted Dec 16, 2019 06:10 AM
    Edited by Christopher Hackett Jun 01, 2020 02:51 PM

    Well, i typed it once and it was gone ... ill do it one more time :D

    My Problem:
    We need stop QUEUEs and wait until in that QUEUEs there is no more Object working.

    Solution:
    SCRI Objekt that checks every 60 Seconds if there are Object running in that QUEUEs

    Script Function (Thank to the Support that helped me out with that)
    GET_UC_SETTING (QUEUE,"QUEUE_NAME",ACTIVE_COUNT)

    VARA.PARAMETER
    KEY                                                                      VALUE1                                               VALUE2
    SHOP1_QUEUE_ABBRUCH_ZEIT                    11:30                                                     HH:MM
    SHOP1_QUEUE_LISTE                                      QUEUE_MASTER1#QUEUE5            QUEUE_WORK1#QUEUE_WORK2
    SHOP1_QUEUE_PRUEINTERVALL                   60
    SHOP1_QUEUE_SUM_ERL_OBJ_ANZAHL      0

    First Script that STOPs the QUEUEs from   VARA.PARAMETER
    SCRI.QUEUE_@STOP

    :RSET &VARANAME#              = 'VARA.PARAMETER'
    :RSET &VERFAHREN#             = 'SHOP1'
    
    ! Start / Stop ermitteln
    :DEFINE &ARR_NAME#,STRING,5
    :FILL &ARR_NAME#[]  = STR_SPLIT(&$NAME#,"@")
    :PSET &QSTATUS#  = STR_UC(&ARR_NAME#[2])
    
    ! Queue Liste ermitteln und in Array packen
    :SET &QUEUELISTE#            = GET_VAR(&VARANAME#,"&VERFAHREN#_QUEUE_LISTE")
    :DEFINE &ARR_QLISTE#,STRING,30
    :FILL &ARR_QLISTE#[] = STR_SPLIT(&QUEUELISTE#,"#")
    :SET &USED# = LENGTH(&ARR_QLISTE#[],SIZE)
    :PRINT ****
    :SET &CNT#  =  1
    :WHILE &CNT# LE &USED#
    :  PRINT "&ARR_QLISTE#[&CNT#] Status auf  &QSTATUS#  setzen"
    :  SET &RET# = MODIFY_SYSTEM("MODE", "&ARR_QLISTE#[&CNT#]", "&QSTATUS#")
    :  IF &RET# = "0"
    :    PRINT "Statusänderung [&QSTATUS#] der Queue &ARR_QLISTE#[&CNT#] war erfolgreich"
    :  ELSE
    :    PRINT "&ARR_QLISTE#[&CNT#] Fehler beim ändern des Status [&QSTATUS#]"
    :  ENDIF
    :  SET &CNT#  =  &CNT# + 1
    :ENDWHILE
    :PRINT ENDE
    :PRINT ****


    Script to check if there are Object running:

    SCRI.QUEUES_EMPTY

    :RSET &VARANAME#              = 'VARA.PARAMETER'
    :RSET &VERFAHREN#             = 'SHOP1'
    
    :RSET &QUEUE_ABBRUCH_ZEIT#    =  GET_VAR(&VARANAME#,"&VERFAHREN#_QUEUE_ABBRUCH_ZEIT")
    :RSET &ZEITFORMAT#            =  GET_VAR(&VARANAME#,"&VERFAHREN#_QUEUE_ABBRUCH_ZEIT",2)
    :RSET &JETZT_HHMM#            =  SYS_TIME_PHYSICAL('&ZEITFORMAT#')
    :RSET &QUEUE_ERL_OBJKT_SUM#   =  GET_VAR(&VARANAME#,"&VERFAHREN#_QUEUE_SUM_ERL_OBJ_ANZAHL")
    :RSET &QUEUE_PRUEF_INTERVA#   =  GET_VAR(&VARANAME#,"&VERFAHREN#_QUEUE_PRUEINTERVALL")
    
    ! Queue Liste ermitteln und in Array packen
    :SET &QUEUELISTE#            = GET_VAR(&VARANAME#,"&VERFAHREN#_QUEUE_LISTE",2)
    :DEFINE &ARR_QLISTE#,STRING,30
    :FILL &ARR_QLISTE#[] = STR_SPLIT(&QUEUELISTE#,"#")
    :RSET &ARR_USED# = LENGTH(&ARR_QLISTE#[],SIZE)
    :PRINT ****
    
    ! Initialparameter für WHILE-Schleife setzen
    :SET &PRUEFUNG_AKTIV#  =  "JA"
    :SET &CNT#             =  1
    
    ! So lange die Prüfung &PRUEFUNG_AKTIV# ("JA") aktiv ist durchlaufen wir immer wieder alle &QUEUELISTE# Objekte
    :WHILE &PRUEFUNG_AKTIV#        =  "JA"
    :  PRINT " ____________________________________"
    :  PRINT "| &ARR_QLISTE#[&CNT#] Infos:"
    :  PRINT "|____________________________________"
    :  SET &ACTIVE_COUNT#          =  GET_UC_SETTING (QUEUE,"&ARR_QLISTE#[&CNT#]",ACTIVE_COUNT) 
    :  SET &ACTIVE_COUNT#          =  FORMAT(&ACTIVE_COUNT#)
    :  PRINT "| Aktive Objekte:       &ACTIVE_COUNT#"
    :  SET &CONSIDER_ERT#          =  GET_UC_SETTING (QUEUE,"&ARR_QLISTE#[&CNT#]",CONSIDER_ERT) 
    :  SET &CONSIDER_ERT#          =  FORMAT(&CONSIDER_ERT#)
    :  PRINT "| CONSIDER_ERT:         &CONSIDER_ERT#"
    :  SET &MAX_SLOTS#             =  GET_UC_SETTING (QUEUE,"&ARR_QLISTE#[&CNT#]",MAX_SLOTS) 
    :  IF ISNUMERIC(&MAX_SLOTS#)   =  "Y"
    :    SET &MAX_SLOTS#           =  FORMAT(&MAX_SLOTS#)
    :  ENDIF
    :  PRINT "| MAX_SLOTS:            &MAX_SLOTS#"
    :  SET &PRIORITY#              =  GET_UC_SETTING (QUEUE,"&ARR_QLISTE#[&CNT#]",PRIORITY) 
    :  SET &PRIORITY#              =  FORMAT(&PRIORITY#)
    :  PRINT "| Priorität:            &PRIORITY#"
    :  SET &STATE#                 =  GET_UC_SETTING (QUEUE,"&ARR_QLISTE#[&CNT#]",STATE) 
    :  SET &STATE#                 =  FORMAT(&STATE#)
    :  PRINT "| Status:               &STATE#"
    :  PRINT
    !  Alle aktiven Objekte aller Queues addieren:
    :  SET &SUMME_AKTIVER_OBJ#    =  &SUMME_AKTIVER_OBJ# + &ACTIVE_COUNT#
    :  SET &SUMME_AKTIVER_OBJ#    =  FORMAT(&SUMME_AKTIVER_OBJ#)
    :  IF  &CNT#  =  &ARR_USED#
    !    &CNT# jetzt wieder auf 1 setzen damit von vorne alle Queues durchgeprüft werden
    :    SET &CNT#  =  1 
    :    IF &SUMME_AKTIVER_OBJ#   > &QUEUE_ERL_OBJKT_SUM#
    :      PRINT "!! In Summe gibt es &ACTIVE_COUNT# aktive Objekte. Erlaubt sind &QUEUE_ERL_OBJKT_SUM# !!"
    :      SET &JETZT_HHMM#       =  SYS_TIME_PHYSICAL('&ZEITFORMAT#')
    :      IF &JETZT_HHMM# >= &QUEUE_ABBRUCH_ZEIT#
    :        SET &PRUEFUNG_AKTIV#   =  "NEIN"
    :        PRINT "Wir warten nur bis &QUEUE_ABBRUCH_ZEIT# Uhr und die Zeit ist vorbei. Patchverarbeitung wird,"
    :        PRINT "trotz &SUMME_AKTIVER_OBJ# aktiver Objekte, fortgesetzt!!"
    :      ELSE
    :        PRINT " ---------> &QUEUE_PRUEF_INTERVA# Sekunden bis zur nächsten Prüfung warten [max. bis: &QUEUE_ABBRUCH_ZEIT#Uhr]"
    :        WAIT &QUEUE_PRUEF_INTERVA#
    :      ENDIF
    :    ELSE
    :      PRINT "!! Erlaubt sind &QUEUE_ERL_OBJKT_SUM# aktive Objekte. Derzeit aktiv sind: &SUMME_AKTIVER_OBJ# !!"
    :      PRINT "Beende Script und fahre mit Patchmanagement fort"
    :      SET &PRUEFUNG_AKTIV#   =  "NEIN"
    :    ENDIF
    :    SET  &SUMME_AKTIVER_OBJ#    =  0   
    :  ELSE
    :    SET &CNT#  =  &CNT# + 1
    :  ENDIF
    :ENDWHILE