Temat: Podproces inicjowany zdarzeniem błędu
Cieszę się, że mój post doczekał się odpowiedzi od takich autorytetów :)
Może to niewłaściwe podejście, ale wszystkie specyfikacje standardów interpretuję zawężająco, w ten sposób, że muszą być spełnione wszystkie warunki nałożone na jakiś specyfikowany obiekt. W BPMN 2.0 są one rozproszone, różne warunki dotyczące tego samego obiektu specyfikacji są podawane w różnych miejscach, mocno różniących się precyzją definicji, a nawet zdarzają się ewidentne niespójności (przynajmniej dla mnie czyni to tę specyfikację trudną do strawienia). W tym konkretnym przypadku tabela 10.88 explicite dopuszcza przechwytywanie wyzwalaczy Error aktywowanych przez zdarzenie końcowe tylko przez zdarzenia krawędziowe.
Oczywiście zauważyłem, że w tabeli 10.88 na stronie 247 i dalszych niektóre zdarzenia końcowe są opisane jako przechwytywane tylko przez zdarzenia krawędziowe - spośród 8 zdarzeń 3 (Error, Escalation i Cancel). Cancel jest zrozumiały - bo nie ma przechwytującego go zdarzenia początkowego. Error i Escalation wydają się być nielogicznie zubożone. Szczególnie dziwi Escalation, wprowadzony w 2.0 łącznie z podprocesami zdarzeniowymi. Trudno tu więc mówić o przeoczeniu, co mogłoby być prawdopodobne w przypadku Error, obecnego już w 1.x - ale to całkiem inny temat.
Dla kontrastu w przypadku Compensation w tej samej tabeli jest jawne dopuszczenie przechwytywania wyzwalacza przez zdarzenie początkowe podprocesu zdarzeniowego:
"...To be compensated, an Activity MUST have a boundary Compensation Event
or contain a Compensation Event Sub-Process."
Co do rozróżnienia między błędami aktywowanymi przez system i przez zdarzenie końcowe, to istotnie wprost w specyfikacji go nie ma, bo wyspecyfikowane jest tylko zdarzenie końcowe błędu (czyli błąd procesu biznesowego). Do błędów technicznych (wyjątków rzucanych przez webservice'y czy generowanych przez silnik procesów biznesowych) jest odniesienie w tabeli klas 2.4 oraz w definicji klasy Error na stronie 81 (rozdział 8.3.3) wyszczególniającej dwa obiekty, których zawartość reprezentuje Error - zdarzenie błędu oraz nieudaną operację (co określiłem jako błąd techniczny):
"An Error represents the content of an Error Event
or the Fault of a failed Operation. An ItemDefinition is used to specify the structure of the Error. An Error is generated when there is a critical problem in the processing of an Activity
or when the execution of an Operation failed."
Kolejnym miejscem odnoszącym się do błędu technicznego jest rozdział 8.4 na stronie 104 (rys. 8.36 - diagram klasy Service).
Natomiast specyfikacja nie określa, w tym przypadku moim zdaniem słusznie, jak błąd techniczny nieudanej operacji ma być rzucony, bo to zależy od implementacji. Podaje więc tylko wymagany payload rzucanego błędu w tabeli 8.41 (str. 82). Nawiasem mówiąc jest w niej kolejny dramatyczny błąd:
"For an Intermediate Event within
normal flow:
If the trigger is an Error, then the errorCode MUST be entered (if the processType attribute of the Process is set to executable). This “throws” the Error." - nie ma zdarzenia pośredniego normalnego przepływu rzucającego błąd.
I również w tej tabeli pominięto zdarzenia początkowe podprocesów zdarzeniowych, co już ewidentnie wskazuje na grube przeoczenie - to w końcu definicja klasy, która musi być kompletna.
Chyba przynudzam na ten temat, w końcu w specyfikacji jest mnóstwo nieścisłości. Chciałoby się jednak używać tak fajnej nowości, jak podproces zdarzeniowy, w zgodny z nią sposób, żeby w szczególności zapewnić maksymalną przenośność modeli między silnikami procesów. Choć w zasadzie i tak jest to problematyczne.
Jeśli dobrze rozumiem obaj starsi w wiedzy i doświadczeniu koledzy doradzają nieskrępowane używanie podprocesów zdarzeniowych błędu analogicznie jak zdarzeń krawędziowych?
Serdecznie dziękuję za poświęcony czas. :)