Differenze tra le versioni di "Avvio di sotto-processi"
imported>Root |
imported>Root |
||
(12 versioni intermedie di uno stesso utente non sono mostrate) | |||
Riga 23: | Riga 23: | ||
===Il primo sottoprocesso vince=== | ===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. | 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. | ||
===Immediata (avvio asincrono)=== | |||
L'attività di avvio sottoprocesso terminerà immediatamente dopo l'avvio dei sottoprocessi. I sottoprocessi proseguiranno per la loro strada senza che il processo chiamante sia obbligato ad attenderne la terminazione. Data la natura dell'operazione, il processo chiamante non sarà in grado di recuperare i valori di output dei sottoprocessi in quanto i sottoprocessi saranno ancora in esecuzione quando l'azione di avviamento terminerà. | |||
Sarà comunque possibile sincronizzarsi con la terminazione dei sotto processi avviati, utilizzando l'attività [[Attesa sotto processo asincrono]]. | |||
'''''Nota:''' Il comportamento standard è "Attendere tutti i sottoprocessi", ma ci sono dei casi particolari per i quali si rivela necessaria la seconda opzione. Si pensi ad esempio a complesse regole di assegnamento attività che non siano esprimibili direttamente nel pannello "Attore". In tal caso una suddivisione delle attività tra sottoprocessi può essere la soluzione, a patto che la visibilità sia ben calibrata in modo che non ci siano utenti che vedono più attività (non che questo causi dei malfunzionamenti, ma è poco elegante). L'utilizzo comunque non si limita a questo tipo di casistiche.'' | |||
==Unione delle istanze== | |||
Quando vengono definiti dei parametri di output come "unione delle istanze" (vedi più avanti la sezione '''parametri di output''') vengono creati degli array assemblando i valori scalari tornati dalle singole istanze. E' possibile definire l'ordine con cui questi valori scalari compariranno nell'array finale: se in ordine di terminazione dei sotto processi oppure in ordine di creazione degli stessi. La selezione di questa voce dipende molto dal tipo di effetto finale che il progettista vuole ottenere. | |||
'''''Nota:''' Questa impostazione compare solamente quando la regola di uscita è "Attendere tutti i sottoprocessi". Infatti questo è l'unico caso in cui possono esistere più valori scalari da assemblare in array.'' | |||
==Comunicazione con il sotto-processo== | ==Comunicazione con il sotto-processo== | ||
Riga 53: | Riga 65: | ||
====Unione delle istanze==== | ====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. | 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==== | ====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. | 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. | ||
====ID sottoprocessi completati/avviati==== | |||
Indipendentemente dalla regole di uscita, viene tornata la lista degli ID dei sottoprocessi avviati con le seguenti distinzioni: | |||
Se la regola di uscita obbliga l'attesa della terminazione di tutti i sottoprocessi, verrà tornata la lista degli ID di tutti i sottoprocessi una volta che questi saranno terminati. | |||
Se la regola di uscita forza la terminazione di tutti i processi non terminati non appena un processo termina, verrà tornata una lista contenente solamente l'ID del processo terminato correttamente. | |||
Se la regola di uscita causa un avvio asincrono dei sottoprocessi, verrà tornata la lista degli ID di tutti i sottoprocessi appena avviati, indipendentemente dal loro stato di esecuzione. | |||
==L'opzione Desumi dai parametri== | ==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. | 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. |
Versione attuale delle 17:06, 26 set 2013
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.
Immediata (avvio asincrono)
L'attività di avvio sottoprocesso terminerà immediatamente dopo l'avvio dei sottoprocessi. I sottoprocessi proseguiranno per la loro strada senza che il processo chiamante sia obbligato ad attenderne la terminazione. Data la natura dell'operazione, il processo chiamante non sarà in grado di recuperare i valori di output dei sottoprocessi in quanto i sottoprocessi saranno ancora in esecuzione quando l'azione di avviamento terminerà.
Sarà comunque possibile sincronizzarsi con la terminazione dei sotto processi avviati, utilizzando l'attività Attesa sotto processo asincrono.
Nota: Il comportamento standard è "Attendere tutti i sottoprocessi", ma ci sono dei casi particolari per i quali si rivela necessaria la seconda opzione. Si pensi ad esempio a complesse regole di assegnamento attività che non siano esprimibili direttamente nel pannello "Attore". In tal caso una suddivisione delle attività tra sottoprocessi può essere la soluzione, a patto che la visibilità sia ben calibrata in modo che non ci siano utenti che vedono più attività (non che questo causi dei malfunzionamenti, ma è poco elegante). L'utilizzo comunque non si limita a questo tipo di casistiche.
Unione delle istanze
Quando vengono definiti dei parametri di output come "unione delle istanze" (vedi più avanti la sezione parametri di output) vengono creati degli array assemblando i valori scalari tornati dalle singole istanze. E' possibile definire l'ordine con cui questi valori scalari compariranno nell'array finale: se in ordine di terminazione dei sotto processi oppure in ordine di creazione degli stessi. La selezione di questa voce dipende molto dal tipo di effetto finale che il progettista vuole ottenere.
Nota: Questa impostazione compare solamente quando la regola di uscita è "Attendere tutti i sottoprocessi". Infatti questo è l'unico caso in cui possono esistere più valori scalari da assemblare in array.
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.
ID sottoprocessi completati/avviati
Indipendentemente dalla regole di uscita, viene tornata la lista degli ID dei sottoprocessi avviati con le seguenti distinzioni:
Se la regola di uscita obbliga l'attesa della terminazione di tutti i sottoprocessi, verrà tornata la lista degli ID di tutti i sottoprocessi una volta che questi saranno terminati.
Se la regola di uscita forza la terminazione di tutti i processi non terminati non appena un processo termina, verrà tornata una lista contenente solamente l'ID del processo terminato correttamente.
Se la regola di uscita causa un avvio asincrono dei sottoprocessi, verrà tornata la lista degli ID di tutti i sottoprocessi appena avviati, indipendentemente dal loro stato di esecuzione.
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.