Avvio di sotto-processi

Da wiki.maggioli.it.
Versione del 11 mag 2010 alle 10:45 di imported>Root
Jump to navigation Jump to search

Descrizione

Questa attività permette di avviare uno o più sotto-processi. L'attività rimane in sospensione in attesa della terminazione di tutti i sotto-processi avviati. La terminazione dell'ultimo sotto-processo in ordine temporale causa lo sblocco della sospensione del processo chiamante e la sua prosecuzione con le attività successive.

Selezione del processo

Qualsiasi processo già inserito nel sistema può essere utilizzato come sotto-processo. Se il processo scelto definisce dei parametri in entrata e/o in uscita, sarà possibile interfacciarsi utilizzando gli attributi della classe corrente.

La selezione del processo da utilizzare come sotto-processo avviene specificando i campi Applicazione e Classe. Una volta impostato il primo campo, il secondo campo offrirà i valori corrispondenti. I processi di workflow sono catalogati sempre per applicazione e classe.

Molteplicità

Il parametro Numero di sotto processi permette di scegliere quante copie del sotto-processo (molteplicità) avviare. Il valore può essere impostato manualmente oppure tramite il valore di un attributo della classe corrente in modo da rendere dinamico il comportamento. E' possibile anche attivare la funzionalità Desumi dai parametri, ma questa possibilità viene spiegata più avanti perchè necessita di ulteriori nozioni.

Nota: Il valore 0 (zero) è accettabile e in sostanza fa proseguire il processo chiamante senza fare nulla.

Descrizione sottoprocessi

Il parametro Descrizione sottoprocessi permette di impostare una descrizione che verrà visualizzata nelle interfacce di amministrazione che mostrano le istanze in esecuzione.

Regola di uscita

Questo parametro definisce come l'attività di avvio sottoprocesso si deve comportare a fronte della terminazione di uno o più sotto processi da essa avviati. Le possibilità sono:

Attendere tutti i sottoprocessi

L'attività di avvio sottoprocesso attenderà la terminazione di tutti i sottoprocessi avviati prima di proseguire nel processo chiamante. Si veda successivamente nel paragrafo dei parametri di output come i valori di ritorno dei sottoprocessi vengono gestiti.

Il primo sottoprocesso vince

L'attività di avvio sottoprocesso attenderà la terminazione del primo sottoprocesso. A questo punto tutti i rimanenti sottoprocessi verranno automaticamente interrotti e terminati e l'attività proseguirà nel processo chiamante. Si veda successivamente nel paragrafo dei parametri di output come i valori di ritorno dei sottoprocessi vengono gestiti.

Comunicazione con il sotto-processo

Una volta selezionata la classe di processo da avviare, nella tabella sottostante compaiono i parametri di input (icona rossa) e di output (icona verde) di tale processo. Tramite questo pannello è possibile passare delle informazioni al sotto-processo e successivamente leggere i risultati che questo produce.

Parametri in input

I parametri di input (icona rossa) sono tutti i parametri che il sotto-processo può accettare. I valori in input possono essere digitati manualmente oppure possono essere degli attributi della classe corrente. L'impostazione avviene nella colonna Valore.

La colonna Comportamento permette di definire come il dato in entrata viene passato a tutte le istanze di sotto-processo che verranno avviate. Le possibilità sono Copia su ogni istanza e Distribuisci su istanze.

Copia su ogni istanza

Questo comportamento implica una copia esatta per ogni sotto-processo del valore digitato oppure contenuto dell'attributo di classe. Questo significa che ogni sotto-processo avviato avrà nel parametro specificato lo stesso valore.

Distribuisci su istanze

Questo comportamento permette invece di passare ad ogni istanza un differente valore per il parametro specificato. La funzionalità è attiva solamente quando il valore viene passato tramite un attributo della classe corrente, ed in particolare tramite un attributo di tipo array (quindi Long[], Double[], Date[], String[]). Se l'attributo utilizzato invece è di tipo scalare (quindi Long, Double, Date, String) il comportamento è identico a Copia su ogni istanza.

Esempio: Viene passato un array String[] contenente gli elementi ["primo","secondo","terzo"] e vengono avviate tre istanze di sotto-processo. Ogni sotto processo riceverà in input uno dei valori, in ordine di avvio. Quindi il primo sotto-processo avrà il parametro valorizzato con "primo", il secondo con "secondo" e così via.

Attenzione: Quando si utilizza questo comportamento è necessario che il numero di elementi contenuti nell'array passato come parametro sia maggiore o uguale alla molteplicità (numero di sotto-processi). In caso negativo il flusso si blocca segnalando l'errore.

Parametri in output

Una volta che tutti i sotto-processi sono terminati l'attività di avvio sotto-processo termina ed il flusso dell'istanza chiamante procede ai passi successivi. E' possibile utilizzare i valori di ritorno prodotti dai sotto-processi per ulteriori elaborazioni. Per fare questo è sufficiente impostare nella colonna Valore del parametro di output (icona verde) su quale attributo della classe corrente copiare il risultato, e se tale risultato dev'essere utilizzato anche per pilotare delle condizioni di uscita.

Mentre se si avvia un solo sotto-processo il flusso dei dati è semplice, il problema si pone quando si avviano più sotto processi: come recuperare i risultati di tutti i sotto processi? La regola da utilizzare viene specificata sempre nella colonna Comportamento. Le possibilità sono Valore ultima istanza e Unione delle istanze.

Valore ultima istanza

Questo comportamento istruisce il workflow ad utilizzare come risultato solamente quello prodotto dall'ultimo sotto-processo terminato (quello che in effetti causa la prosecuzione del flusso chiamante). In questa modalità i risultati di tutti gli altri sotto-processi vengono semplicemente ignorati. Questo è il default e garantisce un funzionamento intuitivo nel caso in cui venga avviato un singolo sotto-processo.

Unione delle istanze

Questo comportamento invece è simile al Distribuisci su istanze dei paramerti di input, solo che funziona al contrario. Questo significa che tutti i valori del parametro di output vengono presi da tutti i sotto-processi terminati (in ordine di terminazione) e vengono assemblati in un array. La funzionalità è attiva solo se il valore viene copiato in un attributo di tipo array. Se il sotto-processo torna a sua volta un array come risultato, tutti gli array vengono concatenati in uno unico, ma questo impedisce di capire quale elemento dell'array arriva da quale sotto-processo.

Esempio: Supponiamo di avviare 3 sotto-processi. Ognuno di questi sotto-processi risponde con un parametro di output che indica "OK" oppure "FALLITO" per indicare, ad esempio, l'esito di un accertamento. Se utilizziamo un attributo di tipo array, potremo ottenere in output, ad esempio, un risultato del tipo ["OK","OK","FALLITO"]. Tale collezione di risultati potrà essere esaminata dal processo chiamante tramite altre attività di gestione dati oppure passata ad un nuovo avvio di sotto processi che gestirà in modo parallelo i vari risultati.

Regola di uscita

Il comportamento "Unione delle istanze" funziona come appena spiegato nel caso in cui la regola di uscita sia "Attendere tutti i sottoprocessi". Nel caso in cui sia stato impostato "Il primo sottoprocesso vince" il comportamento è simile, ma l'unione dei risultati si limiterà ai valori del primo sottoprocesso terminato, eventualmente generando array di dimensione unaria.

L'opzione Desumi dai parametri

Torniamo ora all'opzione che avevamo tralasciato prima. Quando si attiva questa opzione, scompare il campo di input che permette di specificare la molteplicità. Il valore verrà dedotto da come vengono mappati i parametri in input. Se nessun parametro ha comportamento Distribuisci su istanze il valore dedotto sarà 1. Se invece ci sono dei parametri che vengono distribuiti, allora a prima dell'esecuzione dei sotto-processi viene contato il numero di elementi per ognuno di questi parametri e il valore dedotto corrisponderà al minimo tra tutti i conteggi. Quindi se ho un parametro P1 cui vengono passati 10 elementi da distribuire ed un parametro P2 cui vengono passati 3 elementi, verranno avviati 3 sotto-processi.