| At line 1 added 74 lines |
| %%(display:none) |
| {{{ |
| WikiUp |
| }}} |
| /% |
| [{TableOfContents }]\\ |
| Un processo è un insieme di compiti, eseguiti sia da persone, sia in modo automatico, collegate tra loro da precedenze.\\ |
| La rappresentazione delle dinamiche di esecuzione di un processo avviene mediante il modello delle reti di Petri, descritte nel seguito.\\ |
| La definizione di una rete di Petri viene effettuata in uno script collegato al processo.\\ |
| \\ |
| !!! Componenti elementari\\ |
| I componenti elementari che descrivono un processo sono i seguenti:\\ |
| * Transizione: rappresenta un compito da eseguire, graficamente è descritta con un rettangolo.\\ |
| * Luogo: rappresenta una posizione a cui può essere giunto un processo, graficamente descritto con un cerchio.\\ |
| * Arco (orientato) collega una transizione ad un luogo, o viceversa; graficamente viene descritto da una freccia.\\ |
| * Token: rappresenta lo stato di attivazione di un luogo; graficamente è un pallino nero all'interno del luogo. NB: in un dato istante possono essere presenti più token su luoghi diversi in una rete di Petri.\\ |
| \\ |
| Un processo deve iniziare e terminare con dei luoghi.\\ |
| \\ |
| Vediamo di seguito un semplice esempio di processo, costituito dai luoghi L01, L02, L03 e dalle transizioni T01, T02. Il luogo L01 contiene un token.\\ |
| [{Image src='immagini/MBDOC-WFBASE_015/WF-FIG0003.png' caption='' width='100%' style='max-width: 100%;'}]!!! Esecuzione di un processo\\ |
| Un processo viene eseguito eseguendo alcune o tutte le transizioni che lo compongono (svolgimento dei compiti previsti).\\ |
| \\ |
| L'esecuzione di una transizione si compone di due elementi:\\ |
| * I requisiti per cui essa può avvenire. In prima istanza una transizione può scattare quando tutti i luoghi in ingresso sono attivi (presenza di token).\\ |
| * Le conseguenze prodotte quando essa avviene: vengono eliminati tutti i token dei luoghi precedenti, ed aggiunti a tutti i luoghi a cui essa punta.\\ |
| \\ |
| All'inizio del processo tutti i luoghi di partenza contengono un token. Nell'esempio illustrato in queste condizioni la transizione T01 è eseguibile, perchè il suo luogo in ingresso (L01) contiene un token.\\ |
| \\ |
| L'esecuzione della transizione T01 toglie il token dal luogo L01 e ne mette uno nel luogo L02: a questo punto T01 non può più essere eseguita e diventa attiva T02:\\ |
| [{Image src='immagini/MBDOC-WFBASE_015/WF-FIG0004.png' caption='' width='100%' style='max-width: 100%;'}]L'esecuzione di T02 sposta il token da L02 a L03:\\ |
| [{Image src='immagini/MBDOC-WFBASE_015/WF-FIG0005.png' caption='' width='100%' style='max-width: 100%;'}]Dal momento che il luogo L03 è finale (non porta in nessuna transizione) il processo è terminato.\\ |
| \\ |
| L'esempio appena illustrato rappresenta quindi un semplice processo composto da due compiti in sequenza.\\ |
| \\ |
| !!! Esempi\\ |
| \\ |
| !! Mutua esclusione\\ |
| [{Image src='immagini/MBDOC-WFBASE_015/WF-FIG0006.png' caption='' width='100%' style='max-width: 100%;'}]Sia T01 che T02 possono essere eseguite, perchè il luogo in ingresso ad entrambe (L01) contiene un token.\\ |
| L'esecuzione di una delle due transizioni (ad es. T01) toglie il token dal luogo L01 (disattivando così l'altra transizione, ad es. T02) e lo mette nel luogo L02.\\ |
| Dal momento che il luogo L03 è finale (non porta in nessuna transizione) il processo è terminato:\\ |
| \\ |
| !! Parallelismo\\ |
| [{Image src='immagini/MBDOC-WFBASE_015/WF-FIG0007.png' caption='' width='100%' style='max-width: 100%;'}]Sia T01 che T02 possono essere eseguite, perchè l luoghi in ingresso ad entrambe (L01/L02) contiengono un token.\\ |
| L'esecuzione di T01 e di T02 sposta i token, rispettivamente, da L01 a L03 e da L02 a L04; la transizione successiva, T03, può quindi essere eseguita solo dopo l'esecuzione sia di T01 che di T02, perchè deve esserci un token sia in L02 che in L04.\\ |
| \\ |
| !! Diramazioni complesse\\ |
| [{Image src='immagini/MBDOC-WFBASE_015/WF-FIG0008.png' caption='' width='100%' style='max-width: 100%;'}]All'esecuzione della transizione T01 il processo può chiedere all'utente di scegliere in quale luogo, L02 o L03, mettere il token: nel primo caso viene attivata la transizione T02, la cui esecuzione riattiverà la T01 (eseguendo quindi un loop), mentre nel secondo la T03.\\ |
| \\ |
| Si noti che configurazioni alternative della transizione T01 potrebbero implicare:\\ |
| * tutti i luoghi (L02, L03) vengono riempiti automaticamente dall'esecuzione della transizione T01: in questo modo T02 e T03 si attivano contemporaneamente.\\ |
| * i luoghi (uno o più) in cui deve essere posto il token vengono calcolati automaticamente dal motore di workflow, eventualmente sulla base di ragionamenti complessi.\\ |
| \\ |
| Queste diverse configurazioni non sono rappresentate graficamente (sono impostazioni di script) ma danno luogo a comportamenti diversi dei processi.\\ |
| \\ |
| \\ |
| !!! In pratica\\ |
| \\ |
| * Si definisce un processo, compilando in uno script la rete di Petri che lo definisce.\\ |
| * Si possono così istanziare degli ordini di workflow sulla base del modello definito\\ |
| ** un ordine è costituito da più impegni, ognuno modellato da una transizione nella rete di Petri del processo\\ |
| ** si attivano gli impegni per cui è attiva (eseguibile) la relativa transizione nella rete di Petri\\ |
| ** l'esecuzione di un impegno è l'esecuzione della relativa transizione, per cui viene aggiornata la rete di Petri relativa all'ordine e viene effettuato così l'avanzamento (si attivano gli impegni successivi)\\ |
| \\ |
| \\ |
| !!! Accenno alle estensioni\\ |
| \\ |
| !! Requisiti esterni\\ |
| \\ |
| L'esecuzione di un impegno può essere condizionata da fattori esterni alla rete di Petri (es. attributi di oggetti di Sme.up, quando sono modificabili fuori dal workflow).\\ |
| \\ |
| !! Conseguenze esterne\\ |
| \\ |
| L'esecuzione di un impegno, oltre ad agire sulla rete di Petri spostando i token (e facendo così avanzare l'ordine), può avere come conseguenza l'esecuzione di un flusso di programmi funizzati (definiti nello script), che possono modificare ad esempio oggetti di Sme.up.\\ |