In tal caso, un token da un nodo di un join di attività verrà rifiutato?

0

In un diagramma di attività UML, i join nodes sincronizzano i flussi simultanei regolando il flusso di gettoni. Le specifiche UML prevedono che i token possano essere rifiutati. La sezione 15.3.3.4 Join Nodes dice:

If any tokens are offered to the outgoing ActivityEdge of a JoinNode, they shall be accepted by the target or rejected for traversal over the edge (e.g., due to a failed guard) before any more tokens are offered to the outgoing edge. If tokens are rejected for traversal, they shall no longer be offered to the outgoing edge.

Ma non determina chiaramente cosa può rifiutare il token. Ad esempio selection comportamento e weight proprietà di bordo in uscita e anche l'accettazione del nodo di destinazione (include precondition ) può forzare un token ad attendere prima di attraversare. Quali possono respingere attraversando?

Anche sopra la citazione dice:

... before any more tokens are offered to the outgoing edge

Significa che quando un token viene respinto per attraversamento, viene immediatamente ritirato (e distrutto)? O può aspettare fino a quando viene preparato il prossimo token e quando verrà offerto quel prossimo token, quello vecchio verrà distrutto?

Ad esempio nel diagramma sottostante, cosa succederebbe se left JoinNode riceva token dai rami b1 e b2 e crea token b ma token a non essere ancora creato? b aspetta a ? O sarà ritirato? E se aspetta, cosa succederà se il nodo di join sinistro crea un altro token prima che a sia offerto al JoinNode giusto?

    
posta hasanghaforian 01.10.2018 - 10:04
fonte

3 risposte

2

La citazione menziona non solo respinta ma rifiutata per attraversare oltre il limite. Ciò corrisponde al caso in cui un token non è autorizzato a passare attraverso un bordo e non al caso in cui un bersaglio potrebbe non accettarlo.

In tal caso viene respinto per attraversamento?

Sfortunatamente, a differenza dei termini offerti e accettati che sono ben definiti, il termine respinto non è esplicitamente definito e deve essere interpretato.

Per quanto ne so, può succedere solo nel caso di una guardia, come descritto in 15.2.3.3 :

An ActivityEdge may have a guard, which is a ValueSpecification that is evaluated for each token offered to the edge. An offer shall only pass along an ActivityEdge if the guard for the edge evaluates to true for the offered token.

In tal caso non viene rifiutato per attraversamento?

Per peso, non c'è attraversata respinta. I token vengono accumulati nella sorgente fino a quando non viene raggiunta la soglia. Nel caso in cui una guardia blocchi un token, non è l'attraversamento che fallisce ma l'offerta:

If the guard fails for any of the tokens, and this reduces the number of tokens that can be offered to the target to less than the weight, then all the tokens fail to be offered.

Per la selezione non c'è anche il rifiuto di un attraversamento, ma un ritardo all'accettazione ( 15.2.3.4 ):

selection Behavior is used while offering tokens to the target node, it may be run many times on the same token before the token is accepted by the target node.

Ulteriori osservazioni su 15.3.3.4 e risoluzione del tuo scenario

La seguente dichiarazione ci dice che in caso di attraversamento respinto, il token è definitivamente ritirato:

If tokens are rejected for traversal, they shall no longer be offered to the outgoing edge.

La seguente dichiarazione ci dice che, a meno che un token non venga respinto per attraversarlo, aspetterà che venga accettato dal target (l'accettazione non deve essere immediata):

They shall be accepted by the target or rejected for traversal over the edge

Conseguenza: nel tuo scenario, b attenderà a e verranno entrambi consumati insieme per generare un token di output del nodo di join corretto.

E infine, questa frase spiega che in caso di attraversamento riuscito, i token vengono inviati in sequenza, uno per uno:

before any more tokens are offered to the outgoing edge

Conseguenza: nel tuo scenario, fintanto che b aspetterà un a , nessun nuovo b sarà offerto dal join di sinistra.

Modifica: non c'è un problema con le specifiche UML qui?

La regola "uno per uno" non sembra completamente coerente. IMHO:

  • La regola è scritta sulla parte offerta sull'output, non sulla parte di consumo dell'input. Questo rende il comportamento in caso di un peso sull'output estremamente ambiguo: lo eviterei.
  • La regola sembra scritta con i token di controllo in mente. Non mi è chiaro cosa succederà se sull'input sono presenti 2 diversi token oggetto (o 2 oggetti replicati senza CombinedDuplicates): mi aspetterei che tutti passino il join. Ma cosa succede se uno di questi viene rifiutato: l'altro continuerà la sua strada da solo?

Allo stesso modo, IMHO il rifiuto sulla logica trasversale non sembra coprire tutti i casi. Ad esempio, cosa succede se il limite di uscita passa a un nodo decisionale (quindi non viene rifiutato), ma nessuno dei successivi rami custoditi può accettarlo? Comprendiamo che il token è stato rifiutato (implicitamente l'input della decisione sarebbe protetto dalla combinazione di tutti i possibili output), o dovremmo considerarlo consumato e il token è in attesa nel nodo decisionale?

Quindi penso che ci sia ancora del lavoro da fare per il comitato standard in questo settore.

    
risposta data 02.10.2018 - 00:58
fonte
1

Penso che il problema con la tua foto sia che stai cercando di fare qualcosa di superficiale. Il margine b è assolutamente superfluo. In realtà ciò che dovresti fare è unirti direttamente ai token in un unico posto:

I token attenderanno in Action e quelli che inviano b1 e b2 .

La tua domanda è un sofisma poiché i fatti sono sbagliati. Come

The village barber shaves all men in the village that don't shave themselves. Does he shave himself or not?

Se pensi che un momento trovi che la tesi non è giusta. Quindi qualsiasi discussione intorno a esso non ha senso.

    
risposta data 03.10.2018 - 10:06
fonte
0

Ho letto la risposta di Christophe e le parti correlate delle specifiche più volte fino ad ora e descrivo quello che ho capito.

All'inizio cerco di rispondere a una parte della mia domanda:

Does it mean when a token is rejected for traversal, it immediately will be withdrawn (and destroyed) ? Or may it wait until the next token is prepared and when that next token be offered, older one will be destroyed?

Come ha detto Christophe, questa affermazione può essere interpretata come " a token can wait ":

they shall be accepted by the target or rejected for traversal over the edge (e.g., due to a failed guard) before any more tokens are offered to the outgoing edge.

Ma c'è una domanda: "Dove può arrivare il token arrivato?"

  • non in JoinNode (la specifica dice che solo FinalNode dei nodi di controllo può contenere un token)
  • non nel bordo in uscita (la specifica dice che solo il fronte in uscita di ForkNode può contenere token)

Quindi concludo: "Quando un token offre al bordo in uscita di JoinNode, deve immediatamente attraversare il nodo a valle del bordo o verrà rifiutato (e non sarà più offerto al bordo in uscita )." Quindi nel diagramma della domanda, b non aspetta a .

Nella prima parte della mia domanda, penso che quando un token non può aspettare, l'uso di weight non predefinito sarà irrazionale e un token potrebbe essere rifiutato da% di guard o% diselection o% diprecondition di destinazione nodo.

    
risposta data 03.10.2018 - 08:26
fonte

Leggi altre domande sui tag