Routage des travaux interactifs

Je vais essayer de vous expliquer le routage des travaux interactifs.

Un travail interactif est routé vers un sous système par rapport au nom de son unité.

Vous l’indiquez dans la commande ADDWSE
Vous avez 2 paramètres
WRKSTN() nom écran ou nom générique
WRKSTNTYPE type d’écran

l’ordre c’est
nom
nom générique
type

Par contre ce n’est pas dynamique un écran affecté ne sera pas réaffecté dynamiquement, si par exemple votre sous système spécifique est démarré après QINTER.

Il peut être important pour des questions d’administration d’avoir les travaux dans le bon système.

On peut donc ajouter un programme SDA (sélection dynamique à l’arrivée), parce que le critère de nom n’est pas forcément suffisant , ou que suite à un redémarrage, on veut replacer le travail dans le bon sous système, ou tout autre raison.

C’est dans les données de routage qu’il va falloir agir, par défaut PGM(QCMD), mais vous pouvez indiquer un programme à vous.
Ce programme ne reçoit pas de paramètre extérieur et il va par rapport à un algorithme que vous aurez déterminé transférer le travail vers une JOBQ, c’est la commande TFRJOB qui permet de transférer
Le plus souvent on utilise comme critère l’utilisateur ou le nom de l’unité, mais on peut ajouter beaucoup d’autres critéres

Voici un exemple très simple et relativement classique, à mettre sur QINTER qui est souvent le sous système par défaut puisqu’il a une entrée par type

/*------------------------------------------------------------------*/
/*     Ce programme est utilisé dans un sous système interactif     */
/* dans les données de routage il va rerouter une jobq              */
/*  ADDRTGE  ... PGM(MALIB/REROOT)                                  */
/* Ce programme doit être en adoption de droit par rapport QSECOFR  */
/*------------------------------------------------------------------*/
PGM
dcl &user *char 10  /* Utilisateur en cours */
dcl &grp  *char 10  /* Groupe de l'utilisateur */
dcl &unit *char 10  /* nom de l'unité          */
dcl &status *char 2
/* information pour adresse ip */
dcl var(&IPV4ADDR) type(*char) len(15)
DCL    VAR(&JOBI) TYPE(*CHAR) LEN(700) VALUE(' ')
DCL    VAR(&JOBILEN) TYPE(*DEC) LEN(4 0) VALUE(700)
DCL    VAR(&FMTNAME) TYPE(*CHAR) LEN(8) VALUE(JOBI0600)
DCL    VAR(&QUALJN) TYPE(*CHAR) LEN(26) VALUE('*')
DCL    VAR(&INJOB) TYPE(*CHAR) LEN(16) VALUE('                ')
/*-------------------------------------------------*/
/* Extraction des informations de routage          */
/* ici Utilisateur, groupe et nom unité            */
/*-------------------------------------------------*/
             RTVJOBA    USER(&USER) job(&unit)
             RTVUSRPRF  GRPPRF(&GRP)
/* Call QUSRJOBI to retrieve job information */
             CALL       PGM(QSYS/QUSRJOBI) PARM(&JOBI &JOBILEN &FMTNAME +
                        &QUALJN &INJOB)
/* Extract data from the output of QUSRJOBI */
             CHGVAR     VAR(&IPV4ADDR) VALUE(%SST(&JOBI 308 15))
/*-------------------------------------------------*/
/* Règles de routage  sur utilisateur  et groupe   */
/*-------------------------------------------------*/
if cond(&GRP  = 'COMPTA') then(do)
             TFRJOB     JOBQ(COMPTA)
enddo
/*-------------------------------------------------*/
/* Règles de routage  sur unité                    */
/* reroutage de l'unité de secours dans QCTL       */
/* Pour faire des operations en mode restreint     */
/*-------------------------------------------------*/
if cond(&UNIT = 'SECOURS') then(do)
             TFRJOB     JOBQ(QCTL)
enddo
/*-------------------------------------------------*/
/* Règles de routage  sur nom d'ecran              */
/* AAAAAAxxxxx vers JOBQ AAAAAAJOBQ                */
/* AAAAAA racine de l'ecran                        */
/* xxxx   numéro                                   */
/*-------------------------------------------------*/
             chgvar &status 'OK'
             CHKOBJ     OBJ((%SST(&UNIT 1 6) *TCAT 'JOBQ')) +
                          OBJTYPE(*JOBQ)
             monmsg cpf9800 exec(do)
             chgvar &status 'KO'
             enddo
/* si JOBQ existe */
if cond(&status = 'OK') then(do)
             TFRJOB     JOBQ((%SST(&UNIT 1 6) *TCAT 'JOBQ'))
enddo
/*-------------------------------------------------*/
/* Règles de routage  sur adresse ip               */
/* Ici controle adresse ip  avec refus si pas reseau*/
/*  172                                            */
/*-------------------------------------------------*/
if cond(%sst(&IPV4ADDR 1 3) *ne '172') +
then(do)
             SNDMSG     MSG('Tentative de connexion refusée,' *BCAT +
                       &IPV4ADDR *BCAT ', sur adresse IP' *BCAT +
                         &UNIT) TOMSGQ(*HSTLOG)
             ENDJOB     JOB(*)
enddo
/*-------------------------------------------------*/
/* Les autres ne sont pas reroutés                  */
/*-------------------------------------------------*/
endpgm

Dans notre exemple, on a ajouté un contrôle sur l’adresse IP avec un blocage si pas le réseau attendu

Remarques :

La limite c’est votre imagination, vous devez bien réfléchir et cibler votre besoin , vous pouvez par exemple ajouter du paramétrage


Vous pouvez également utiliser le programme d’exit (QIBM_QTG_DEVINIT) , mais plus compliqué à mettre en œuvre

Vous devez vous assurer que le programme utilisé pour SDA ne plante pas

Les unités peuvent être créer automatiquement c’est la valeur système QAUTOVRT

Si vous choisissez de l’utiliser, préférez un nombre (exemple : 500 ) plutôt que *NOMAX et tous les 6 mois faites un coup de ménage sur les unités inutilisées

===> DSPOBJD OBJ(ALL) OBJTYPE(DEVD)

Vous pouvez les identifier facilement :

Par défaut les unités s’appellent QPADEVxxxx , ne pas hésiter à les supprimer 2 fois par an