Te whakauru momo BPM

Te whakauru momo BPM

Kia ora Habr!

Ko ta maatau kamupene he tohungatanga ki te whakawhanaketanga o nga otinga rorohiko-akomanga ERP, ko te waahanga o te raiona e nohoia ana e nga punaha whakawhitiwhitinga me te nui o te arorau pakihi me te rere o nga tuhinga a la EDMS. Ko nga putanga o naianei o a maatau hua kei runga i nga hangarau JavaEE, engari kei te kaha ano taatau ki te whakamatautau me nga ratonga miihini. Ko tetahi o nga waahi tino raru o enei otinga ko te whakaurunga o nga momo punaha iti o nga rohe tata. Ko nga raruraru whakauru i nga wa katoa ka nui te mamae o te mahunga, ahakoa te ahua o te hoahoanga, nga papahanga hangarau me nga anga e whakamahia ana e matou, engari no tata nei kua ahu whakamua ki te whakaoti rapanga pera.

I roto i te tuhinga ka kawea mai e ahau ki a koe, ka korero ahau mo te wheako me te rangahau hoahoanga kei a NPO Krista i te waahi kua tohua. Ka titiro ano tatou ki tetahi tauira o te otinga ngawari ki te raruraru whakauru mai i te tirohanga a te kaiwhakawhanake tono ka kitea he aha te mea e huna ana i muri o tenei ngawari.

Whakakahoretanga

Ko nga otinga hoahoanga me nga hangarau e whakaahuatia ana i roto i te tuhinga ka whakaarohia e au i runga i nga wheako whaiaro i roto i te horopaki o nga mahi motuhake. Ko enei otinga kaore e kii ana he ao katoa, kaore pea i te tino pai i raro i etahi atu tikanga whakamahi.

He aha te hononga o te BPM?

Hei whakautu i tenei patai, me ruku hohonu ki roto i nga korero motuhake o nga raru e whakamahia ana o a maatau otinga. Ko te waahanga nui o te arorau pakihi i roto i ta maatau punaha tauwhitinga angamaheni ko te whakauru i nga raraunga ki roto i te papaaarangi ma nga atanga kaiwhakamahi, te whakamana a-ringa me te aunoa o enei raraunga, te kawe i roto i etahi rerenga mahi, te whakaputa ki tetahi atu punaha / putunga raraunga / purongo, whakaputa purongo. . No reira, ko te mahi matua o te punaha mo nga kaihoko ko te mahi aunoa o a raatau mahi pakihi o roto.

Mo te waatea, ka whakamahia e matou te kupu "tuhinga" ki te whakawhitiwhiti korero hei tangohanga o te huinga raraunga i honoa e tetahi kii noa e taea ai te "hono" tetahi rerenga mahi.
Engari me pehea te arorau whakauru? I muri i nga mea katoa, ko te mahi whakauru i hangaia e te hoahoanga o te punaha, ka "tapahia" ki nga waahanga KORE i te tono a te kaihoko, engari i raro i te mana o nga mea rereke:

  • i raro i te ture a Conway;
  • na te whakamahi ano i nga punaha iti i whakawhanakehia i mua mo etahi atu hua;
  • i runga i te whakaaro o te kaihoahoa, i runga i nga whakaritenga kore-mahi.

He nui te whakamatautau ki te wehe i te arorau whakauru mai i te arorau pakihi o te rerenga mahi matua, kia kore ai e whakapoke i te arorau pakihi me nga taonga whakauru me te whakaora i te kaiwhakawhanake tono mai i te hiahia ki te ruku ki nga ahuatanga o te ahuatanga o te hoahoanga o te punaha. He maha nga painga o tenei huarahi, engari ko nga mahi e whakaatu ana i tana koretake:

  • Ko te whakaoti rapanga whakauru ka hoki mai ano ki nga waahanga ngawari noa iho i te ahua o nga waea tukutahi na te iti o nga tohu toronga i roto i te whakatinanatanga o te rerenga mahi matua (ko nga huakore o te whakauru tukutahi ka korerohia i raro nei);
  • ka uru tonu nga taonga whakaurunga ki te arorau pakihi matua ina hiahiatia he urupare mai i tetahi atu punaha iti;
  • ka warewarehia e te kaiwhakawhanake tono te whakaurunga ka ngawari te pakaru ma te huri i te rerenga mahi;
  • ka mutu te punaha kia kotahi katoa mai i te tirohanga a te kaiwhakamahi, ka kitea nga "tahi" i waenga i nga punaha iti, ka puta nga mahi a te kaiwhakamahi, ka tiimata te whakawhiti raraunga mai i tetahi punaha ki tetahi atu.

Ko tetahi atu huarahi ko te whakaaro ki nga taunekeneke whakauru hei waahanga nui o te arorau pakihi matua me te rerenga mahi. Hei aukati i nga tohu kaiwhakawhanake tono mai i te piki haere, me ngawari me te ngawari te hanga i nga taunekeneke whakauru hou, me te iti o te waahi ki te whiriwhiri i tetahi otinga. He uaua ake tenei ki te mahi i te ahua: me kaha te taputapu ki te whakarato ki te kaiwhakamahi nga momo whiringa e hiahiatia ana mo tana whakamahinga, me te kore e tuku "kopere i a ia ki te waewae." He maha nga paatai ​​​​me whakautu e te miihini i roto i te horopaki o nga mahi whakauru, engari kaua e whakaarohia e te kaiwhakawhanake tono i roto i ana mahi o ia ra: nga rohe tauwhitinga, te riterite, te atomicity, te haumarutanga, te tauine, te uta me te tohatoha rauemi, te ararere, te maara, te tohatoha me te huri i nga horopaki, me etahi atu. He mea tika ki te tuku ki nga kaiwhakawhanake tono nga tauira otinga tino ngawari e huna ana nga whakautu ki enei patai katoa. Me noho haumaru enei tauira: he maha nga huringa arorau pakihi, ka nui ake te tupono ki te whakauru hapa, me noho tonu te utu o nga hapa ki te taumata iti.

Engari he aha te mahi a te BPM? He maha nga whiringa mo te whakatinana rerengamahi...
Ae, ko tetahi atu whakatinanatanga o nga mahi pakihi he tino rongonui i roto i a maatau otinga - na roto i te whakamaramatanga korero o te hoahoa whakawhiti whenua me te hononga o nga kaikawe me te arorau pakihi mo nga whakawhitinga. I tenei take, ko te kawanatanga e whakatau ana i te waahi o naianei o te "tuhinga" i roto i te mahi pakihi he huanga o te "tuhinga" ano.

Te whakauru momo BPM
Koinei te ahua o te tukanga i te timatanga o te kaupapa

Ko te rongonui o tenei whakatinanatanga na te ngawari me te tere o te hanga i nga tikanga pakihi raina. Heoi, i te mea ka kaha haere tonu nga punaha rorohiko, ka tipu haere te waahanga aunoa o te mahi pakihi, ka kaha ake. Me whakarara, te whakamahi ano i nga wahanga o nga mahi, me nga tikanga whakarara kia rite ai te mahi o ia peka. I raro i enei ahuatanga, ka raruraru te taputapu, ka ngaro te ahua o te whakawhitinga o te kawanatanga i nga korero korero (kaore nga taunekeneke whakauru e whakaatuhia i roto i te hoahoa).

Te whakauru momo BPM
Koinei te ahua o te tukanga i muri i te maha o nga whitiwhitinga o te whakamaramatanga o nga whakaritenga.

Ko te huarahi ki waho o tenei ahuatanga ko te whakauru o te miihini jBPM ki etahi hua me nga tukanga pakihi tino uaua. I roto i te wa poto, i angitu tenei otinga: ka taea te whakatinana i nga tikanga pakihi uaua me te pupuri i tetahi hoahoa korero me te whai kiko i roto i te tohu. BPMN2.

Te whakauru momo BPM
He waahanga iti o te tukanga pakihi uaua

I te wa roa, kaore te otinga i tutuki ki nga tumanakohanga: ko te kaha o te mahi ki te hanga i nga mahi pakihi na roto i nga taputapu ataata kaore i whakaaetia te whakatutuki i nga tohu hua e whakaaetia ana, a ko te taputapu ano tetahi o nga mea tino kino i waenga i nga kaihanga. I puta ano nga amuamu mo te hanganga o roto o te miihini, i puta ai te maha o nga "patch" me nga "tootoo".

Ko te ahua pai o te whakamahi i te jBPM ko te maarama ki nga painga me nga kino o te whai i te ahua o te mahi whakahaere pakihi. I kite ano matou i te kaha ki te whakamahi i te huarahi tukanga ki te whakatinana i nga kawa whakauru matatini i waenga i nga tono rereke ma te whakamahi i nga taunekeneke tukutahi ma nga tohu me nga karere. Ko te noho tonu o te ahua ka whai waahi nui ki tenei.

I runga i nga korero o runga ake nei, ka taea e tatou te whakatau: Ko te huarahi tukanga i roto i te ahua BPM ka taea e tatou te whakaoti i te tini o nga mahi ki te whakaaunoa i nga tukanga pakihi e piki haere ana, kia pai te whakauru i nga mahi whakauru ki enei mahinga me te pupuri i te kaha ki te whakaatu i nga mahi kua whakatinanahia i roto i te tohu tika.

Nga ngoikoretanga o nga waea tukutahi hei tauira whakauru

Ko te whakauru tukutahi e pa ana ki te waea aukati ngawari. Ko tetahi punaha iti te mahi hei taha tūmau me te whakaatu i te API me te tikanga e hiahiatia ana. Ko tetahi atu punaha iti hei taha ki te taha o te kiritaki, a, i te wa e tika ana ka waeahia ka tatari mo te hua. I runga i te hoahoanga o te punaha, ka taea te noho te taha o te kiritaki me te tūmau i roto i te tono kotahi me te tukanga, i roto ranei i nga waahanga rereke. I roto i te take tuarua, me tono koe i etahi whakatinanatanga RPC me te whakarato i te marshalling o nga tawhā me te hua o te piiraa.

Te whakauru momo BPM

Ko tenei tauira whakauru he huinga tino nui o nga ngoikoretanga, engari e whakamahia nuitia ana i roto i nga mahi na tona ngawari. Ko te tere o te whakatinanatanga ka mau ki a koe me te kaha ki te whakamahi i nga wa katoa i mua i nga wa o te waa, me te tuhi i te otinga hei nama hangarau. Engari ka tupu ano ka whakamahia e nga kaiwhakawhanake kore mohio, kaore i te mohio ki nga hua kino.

I tua atu i te pikinga tino kitea o te hononga-a-roto, he iti ake ano nga raru e pa ana ki te "tipu" me te "torotoro". Ae, mena ka huri te arorau pakihi, kaore e taea te karo i nga whakawhitiwhitinga, me nga whakawhitinga, ka aukati i etahi rauemi tono e pa ana ki enei huringa. Arā, tae noa ki te tatari tetahi punaha iti mo te whakautu mai i tetahi atu, kaore e taea e ia te whakaoti i te whakawhitinga me te tango i nga raka. Ma tenei ka tino piki ake te tupono o nga momo paanga:

  • Ka ngaro te urupare o te punaha, ka tatari nga kaiwhakamahi mo te wa roa mo nga whakautu ki nga tono;
  • i te nuinga o te wa ka mutu te whakautu a te kaitoro ki nga tono a nga kaiwhakamahi na te nui o te puna miro: kua maukati te nuinga o nga miro ki tetahi rauemi e nohoia ana e tetahi tauwhitinga;
  • Ka tiimata te puta mai o nga kati: ko te tupono ka puta mai i runga i te roanga o nga whakawhitiwhitinga, te nui o te arorau pakihi me nga raka e uru ana ki te tauwhitinga;
  • ka puta nga hapa o te waahi waahi hokohoko;
  • "kare" te tūmau me OutOfMemory mena ka hiahia te mahi ki te tukatuka me te whakarereke i te nui o nga raraunga, me te noho o nga whakauru tukutahi ka tino uaua ki te wehe i te tukatuka ki nga whakawhitinga "mama".

Mai i te tirohanga hoahoanga, ko te whakamahi i nga waea aukati i te wa o te whakaurunga ka arahi ki te ngaro o te mana whakahaere i runga i te kounga o nga punaha-a-roto takitahi: kaore e taea te whakarite i nga tohu o te kounga o tetahi waahanga i roto i te wehe mai i nga tohu kounga o tetahi atu punaha. Mena ka whakawhanakehia nga punaha iti e nga roopu rereke, he raru nui tenei.

Ka pai ake nga mea mena ka whakauruhia nga punaha iti kei roto i nga tono rereke ka hiahia koe ki te whakarereke i nga taha e rua. Me pehea te whakarite i te tauwhitinga o enei huringa?

Mena ka rereke nga huringa i roto i nga whakawhitinga motuhake, ka hiahia koe ki te whakarato i te whakahaere motuhake me te utu, a ka whakakorea e tenei te painga matua o nga whakauru tukutahi - te ngawari.

Ka hoki mai ano nga whakawhitinga tohatoha, engari kaore e whakamahia e matou i roto i a maatau otinga: he uaua ki te whakarite pono.

"Saga" hei otinga mo te raruraru tauwhitinga

Na te tipu haere o te rongonui o nga microservices, te tono mo Tauira putaputa.

Ko tenei tauira ka tino whakaoti i nga raruraru kua whakahuahia ake nei mo nga whakawhitinga roa, me te whakawhānui ake i nga kaha ki te whakahaere i te ahua o te punaha mai i te taha o te arorau pakihi: ko te utu i muri i te korenga o te whakawhitinga kaore pea e huri i te punaha ki tona ahuatanga taketake, engari ka whakarato he huarahi tukatuka raraunga rereke. Ma tenei ka taea e koe te karo i te tukurua i nga waahanga tukatuka raraunga kua oti pai i te wa e ngana ana ki te kawe i te tukanga ki te mutunga "pai".

He mea whakamiharo, i roto i nga punaha monolithic ka whai take ano tenei tauira ina tae mai ki te whakaurunga o nga puunaha-iti kua honoa me nga paanga kino i puta mai i nga tauwhitinga roa me nga raka rauemi e rite ana ka kitea.

E pa ana ki a maatau mahi pakihi i roto i te ahua BPM, ka puta he tino ngawari ki te whakatinana i te "Sagas": ko nga waahanga takitahi o te "Saga" ka taea te tohu hei mahi i roto i te mahi pakihi, me te ahua tonu o te mahi pakihi. ka whakatau i te ahua o roto o te "Saga". Arā, karekau matou e hiahia ki etahi atu tikanga ruruku. Ko nga mea katoa e hiahiatia ana e koe he kaihokohoko karere e tautoko ana "i te iti rawa kia kotahi" nga taurangi hei kawe.

Engari he "utu" ano tenei otinga:

  • ka uaua ake te arorau pakihi: me whakarite utu;
  • he mea tika ki te whakarere i te rite tonu, he mea tino tairongo mo nga punaha monolithic;
  • Ka iti ake te uaua o te hoahoanga, ka puta mai he hiahia mo te kaihokohoko karere;
  • ka hiahiatia etahi atu taputapu aroturuki me te whakahaere (ahakoa i te nuinga he pai tenei: ka piki ake te kounga o te ratonga punaha).

Mo nga punaha monolithic, ko te tika mo te whakamahi "Sag" kaore i te tino kitea. Mo nga microservices me etahi atu SOA, kei reira ano pea he kaihokohoko, me te tino rite ki te patu i te timatanga o te kaupapa, ko nga painga o te whakamahi i tenei tauira ka nui ake i nga ngoikoretanga, ina koa he API watea ki te arorau pakihi. taumata.

Te whakauru i te arorau pakihi i roto i nga ratonga miihini

I te wa i timata ai matou ki te whakamatautau me nga ratonga miihini, ka puta ake he patai whaitake: kei hea te tuunga i te arorau pakihi rohe e pa ana ki te ratonga e whakarite ana i te mau tonu o nga raraunga rohe?

Ina titiro ki te hoahoanga o nga momo BPMS, he ahua tika te wehe i te arorau pakihi mai i te tohe tonu: hanga he paparanga papaa me nga ratonga miihini motuhake-a-rohe ka hanga he taiao me te ipu mo te whakahaere i te arorau pakihi rohe, me te hoahoa i te mau tonu o nga raraunga rohe hei he paparanga motuhake o nga ratonga moroiti tino ngawari me te mama. Ko nga mahi pakihi i roto i tenei keehi ka whakahaere i nga ratonga o te paparanga pumau.

Te whakauru momo BPM

He painga nui tenei huarahi: ka taea e koe te whakanui ake i nga mahi o te papaaho kia rite ki taau e pai ai, a ko te paparanga o nga microservices e rite ana ka "ngako" mai i tenei. Ko nga tukanga pakihi mai i tetahi rohe ka taea tonu te whakamahi i nga mahi hou o te papaahi i te wa e whakahouhia ana.

I kitea e te rangahau taipitopito atu nga huakore o tenei huarahi:

  • he ratonga papaaho e whakahaere ana i te arorau pakihi o te maha o nga rohe i te wa kotahi ka mau i nga raru nui hei waahi kotahi o te kore. Ko nga huringa auau ki te arorau pakihi ka piki ake te tupono o nga hapa e arai ana ki nga rahunga o te punaha;
  • nga take mahi: mahi arorau pakihi me ona raraunga ma te atanga whaiti me te puhoi:
    • ka whakahiatotia ano nga raraunga ka panaia ki roto i te puranga whatunga;
    • he maha nga wa ka tukuna e te ratonga rohe nga raraunga nui atu i te mea e hiahiatia ana mo te arorau pakihi ki te tukatuka na te iti o te kaha ki te whakarite i nga tono i te taumata o te API o waho o te ratonga;
    • he maha nga waahanga motuhake o te arorau pakihi ka taea te tono ano i nga raraunga kotahi mo te tukatuka (ka taea te whakaiti i tenei raru ma te taapiri i nga waahanga o te huihuinga e keteroki ana i nga raraunga, engari na tenei ka whakararu i te hoahoanga ka puta he raru mo te whainga raraunga me te keteroki whakakore);
  • raruraru tauwhitinga:
    • Ko nga tukanga pakihi me te ahua mau tonu, kei te rongoa e te ratonga papaarangi, kaore i te rite ki nga raraunga rohe, kaore he huarahi ngawari ki te whakaoti i tenei raruraru;
    • te whakanoho i nga raraunga rohe e aukati ana i waho o te tauwhitinga: ki te hiahia te arorau pakihi rohe ki te whakarereke i muri i te tirotiro tuatahi i te tika o nga raraunga o naianei, he mea tika kia whakakorehia te waahi o te huringa whakataetae i roto i nga raraunga tukatuka. Ka taea e te aukati raraunga o waho te awhina ki te whakaoti rapanga, engari he nui atu nga raru ka mau i taua otinga ka whakaiti i te pono o te punaha;
  • etahi atu uauatanga i te wa e whakahou ana: i etahi wa, ko te ratonga tohe me te arorau pakihi me whakahou i te wa kotahi, i roto ranei i te raupapa tino.

I te mutunga, me hoki ano matou ki nga kaupapa taketake: whakakaohia nga raraunga rohe me te arorau pakihi rohe ki roto i te ratonga miihini kotahi. Ko tenei huarahi ka ngawari te whakaaro o te microservice hei waahanga nui o te punaha, kaore hoki e puta nga raru o runga ake nei. Kaore hoki tenei e hoatu mo te kore utu:

  • Ko te paerewa API e hiahiatia ana mo te taunekeneke me te arorau pakihi (ina koa, ki te whakarato i nga mahi a nga kaiwhakamahi hei waahanga o nga mahi pakihi) me nga ratonga papaaho API; me aro nui ake ki nga huringa API, te hototahi whakamua me te whakamuri;
  • he mea tika ki te taapiri atu i etahi atu whare pukapuka wa whakahaere hei whakarite i te mahi o te arorau pakihi hei waahanga o ia ratonga moroiti, a ka puta mai he whakaritenga hou mo aua whare pukapuka: he maamaa me te iti o nga whakawhirinakitanga whakawhiti;
  • Ko nga kaiwhakawhanake arorau pakihi me aro turuki i nga putanga whare pukapuka: mena kaore ano kia whakaotia he ratonga moroiti mo te wa roa, tera pea ka mau he putanga tawhito o nga whare pukapuka. He arai ohorere tenei ki te taapiri i tetahi ahuatanga hou, a tera pea me neke te whakaaro pakihi tawhito o taua ratonga ki nga putanga hou o nga whare pukapuka mena he huringa hotokore i waenga i nga putanga.

Te whakauru momo BPM

He paparanga o nga ratonga papaa kei roto ano i taua hoahoanga, engari ko tenei paparanga kaore e hanga he ipu mo te whakahaere i te arorau pakihi rohe, engari ko tona taiao anake, e whakarato ana i nga mahi "turanga" awhina. Ko taua paparanga e hiahiatia ana ehara i te mea hei pupuri i te ahua mama o nga microservices rohe, engari ki te whakangao i te whakahaeretanga.

Hei tauira, ko nga mahi a nga kaiwhakamahi i roto i nga mahi pakihi ka whakaputa i nga mahi. Heoi, i te wa e mahi ana me nga mahi, me kite te kaiwhakamahi i nga mahi mai i nga rohe katoa i roto i te rarangi whanui, ko te tikanga me noho he ratonga rehitatanga mahi turanga, kua whakakorehia te arorau pakihi rohe. Ko te pupuri i te whakaurunga o te arorau pakihi i roto i taua horopaki he tino raru, a koinei tetahi atu whakararu o tenei hoahoanga.

Te whakauru o nga tukanga pakihi ma nga kanohi o te kaiwhakawhanake tono

Ka rite ki te korero i runga ake nei, me tango te kaiwhakawhanake tono mai i nga ahuatanga hangarau me te miihini o te whakatinana i te taunekeneke o nga tono maha kia taea ai e tetahi te whakawhirinaki ki nga hua whanaketanga pai.

Me ngana ki te whakaoti i tetahi raruraru whakauru uaua, i hangaia mo te tuhinga. He mahi "kēmu" tenei e toru nga tono, ka whakatauhia e ia o raatau tetahi ingoa rohe: "app1", "app2", "app3".

I roto i ia tono, ka whakarewahia nga mahi pakihi ka timata ki te "takaro poi" ma te pahi whakauru. Ko nga karere me te ingoa "Poro" ka mahi hei poi.

Ngā ture o te kēmu:

  • ko te kaitakaro tuatahi ko te kaitaunaki. Ka tono ia i etahi atu kaitakaro ki te keemu, ka timata te keemu, ka mutu i nga wa katoa;
  • Ko etahi atu kaitakaro e kii ana i to raatau whakauru ki te keemu, "kia mohio" tetahi ki tetahi me te kaitakaro tuatahi;
  • i muri i tana whiwhinga i te poi, ka kowhiria e te kaitakaro tetahi atu kaitakaro ka tukuna atu te poi ki a ia. Ka tatauhia te tapeke o nga whakawhitinga;
  • Kei ia kaitākaro "pūngao" ka heke i ia paahitanga o te pōro e taua kaitākaro. Ka pau te kaha, ka wehe te kaitakaro i te keemu, ka panui i tana rihaina;
  • ki te waiho ko te kaitakaro anake, ka panui tonu ia i tana haerenga;
  • Ka whakakorehia nga kaitakaro katoa, ka kii te kaitakaro tuatahi kua mutu te keemu. Mena ka wehe wawe ia i te keemu, ka whai tonu ia i te keemu kia oti.

Hei whakaoti i tenei raruraru, ka whakamahi ahau i to tatou DSL mo nga tukanga pakihi, e taea ai e tatou te whakaahua i te arorau i roto i te Kotlin kiato, me te iti o te boilerplate.

Ko te mahi pakihi a te kaitakaro tuatahi (ko te kaitaunaki o te keemu) ka mahi i roto i te tono app1:

class InitialPlayer

import ru.krista.bpm.ProcessInstance
import ru.krista.bpm.runtime.ProcessImpl
import ru.krista.bpm.runtime.constraint.UniqueConstraints
import ru.krista.bpm.runtime.dsl.processModel
import ru.krista.bpm.runtime.dsl.taskOperation
import ru.krista.bpm.runtime.instance.MessageSendInstance

data class PlayerInfo(val name: String, val domain: String, val id: String)

class PlayersList : ArrayList<PlayerInfo>()

// Это класс экземпляра процесса: инкапсулирует его внутреннее состояние
class InitialPlayer : ProcessImpl<InitialPlayer>(initialPlayerModel) {
    var playerName: String by persistent("Player1")
    var energy: Int by persistent(30)
    var players: PlayersList by persistent(PlayersList())
    var shotCounter: Int = 0
}

// Это декларация модели процесса: создается один раз, используется всеми
// экземплярами процесса соответствующего класса
val initialPlayerModel = processModel<InitialPlayer>(name = "InitialPlayer",
                                                     version = 1) {

    // По правилам, первый игрок является инициатором игры и должен быть единственным
    uniqueConstraint = UniqueConstraints.singleton

    // Объявляем активности, из которых состоит бизнес-процесс
    val sendNewGameSignal = signal<String>("NewGame")
    val sendStopGameSignal = signal<String>("StopGame")
    val startTask = humanTask("Start") {
        taskOperation {
            processCondition { players.size > 0 }
            confirmation { "Подключилось ${players.size} игроков. Начинаем?" }
        }
    }
    val stopTask = humanTask("Stop") {
        taskOperation {}
    }
    val waitPlayerJoin = signalWait<String>("PlayerJoin") { signal ->
        players.add(PlayerInfo(
                signal.data!!,
                signal.sender.domain,
                signal.sender.processInstanceId))
        println("... join player ${signal.data} ...")
    }
    val waitPlayerOut = signalWait<String>("PlayerOut") { signal ->
        players.remove(PlayerInfo(
                signal.data!!,
                signal.sender.domain,
                signal.sender.processInstanceId))
        println("... player ${signal.data} is out ...")
    }
    val sendPlayerOut = signal<String>("PlayerOut") {
        signalData = { playerName }
    }
    val sendHandshake = messageSend<String>("Handshake") {
        messageData = { playerName }
        activation = {
            receiverDomain = process.players.last().domain
            receiverProcessInstanceId = process.players.last().id
        }
    }
    val throwStartBall = messageSend<Int>("Ball") {
        messageData = { 1 }
        activation = { selectNextPlayer() }
    }
    val throwBall = messageSend<Int>("Ball") {
        messageData = { shotCounter + 1 }
        activation = { selectNextPlayer() }
        onEntry { energy -= 1 }
    }
    val waitBall = messageWaitData<Int>("Ball") {
        shotCounter = it
    }

    // Теперь конструируем граф процесса из объявленных активностей
    startFrom(sendNewGameSignal)
            .fork("mainFork") {
                next(startTask)
                next(waitPlayerJoin).next(sendHandshake).next(waitPlayerJoin)
                next(waitPlayerOut)
                        .branch("checkPlayers") {
                            ifTrue { players.isEmpty() }
                                    .next(sendStopGameSignal)
                                    .terminate()
                            ifElse().next(waitPlayerOut)
                        }
            }
    startTask.fork("afterStart") {
        next(throwStartBall)
                .branch("mainLoop") {
                    ifTrue { energy < 5 }.next(sendPlayerOut).next(waitBall)
                    ifElse().next(waitBall).next(throwBall).loop()
                }
        next(stopTask).next(sendStopGameSignal)
    }

    // Навешаем на активности дополнительные обработчики для логирования
    sendNewGameSignal.onExit { println("Let's play!") }
    sendStopGameSignal.onExit { println("Stop!") }
    sendPlayerOut.onExit { println("$playerName: I'm out!") }
}

private fun MessageSendInstance<InitialPlayer, Int>.selectNextPlayer() {
    val player = process.players.random()
    receiverDomain = player.domain
    receiverProcessInstanceId = player.id
    println("Step ${process.shotCounter + 1}: " +
            "${process.playerName} >>> ${player.name}")
}

I tua atu i te mahi arorau pakihi, ka taea e te waehere o runga ake te whakaputa i tetahi tauira ahanoa o te tukanga pakihi, ka taea te kite i te ahua o te hoahoa. Kaore ano matou i te whakatinana i te tirohanga, no reira me whakapau he wa poto ki te tuhi (i konei ka whakamaaramahia e au te tohu BPMN mo te whakamahinga o nga keeti hei whakapai ake i te rite o te hoahoa me te waehere kei raro nei):

Te whakauru momo BPM

Ka whakaurua e te app2 te tukanga pakihi a tetahi atu kaitakaro:

akomanga RandomPlayer

import ru.krista.bpm.ProcessInstance
import ru.krista.bpm.runtime.ProcessImpl
import ru.krista.bpm.runtime.dsl.processModel
import ru.krista.bpm.runtime.instance.MessageSendInstance

data class PlayerInfo(val name: String, val domain: String, val id: String)

class PlayersList: ArrayList<PlayerInfo>()

class RandomPlayer : ProcessImpl<RandomPlayer>(randomPlayerModel) {

    var playerName: String by input(persistent = true, 
                                    defaultValue = "RandomPlayer")
    var energy: Int by input(persistent = true, defaultValue = 30)
    var players: PlayersList by persistent(PlayersList())
    var allPlayersOut: Boolean by persistent(false)
    var shotCounter: Int = 0

    val selfPlayer: PlayerInfo
        get() = PlayerInfo(playerName, env.eventDispatcher.domainName, id)
}

val randomPlayerModel = processModel<RandomPlayer>(name = "RandomPlayer", 
                                                   version = 1) {

    val waitNewGameSignal = signalWait<String>("NewGame")
    val waitStopGameSignal = signalWait<String>("StopGame")
    val sendPlayerJoin = signal<String>("PlayerJoin") {
        signalData = { playerName }
    }
    val sendPlayerOut = signal<String>("PlayerOut") {
        signalData = { playerName }
    }
    val waitPlayerJoin = signalWaitCustom<String>("PlayerJoin") {
        eventCondition = { signal ->
            signal.sender.processInstanceId != process.id 
                && !process.players.any { signal.sender.processInstanceId == it.id}
        }
        handler = { signal ->
            players.add(PlayerInfo(
                    signal.data!!,
                    signal.sender.domain,
                    signal.sender.processInstanceId))
        }
    }
    val waitPlayerOut = signalWait<String>("PlayerOut") { signal ->
        players.remove(PlayerInfo(
                signal.data!!,
                signal.sender.domain,
                signal.sender.processInstanceId))
        allPlayersOut = players.isEmpty()
    }
    val sendHandshake = messageSend<String>("Handshake") {
        messageData = { playerName }
        activation = {
            receiverDomain = process.players.last().domain
            receiverProcessInstanceId = process.players.last().id
        }
    }
    val receiveHandshake = messageWait<String>("Handshake") { message ->
        if (!players.any { message.sender.processInstanceId == it.id}) {
            players.add(PlayerInfo(
                    message.data!!, 
                    message.sender.domain, 
                    message.sender.processInstanceId))
        }
    }
    val throwBall = messageSend<Int>("Ball") {
        messageData = { shotCounter + 1 }
        activation = { selectNextPlayer() }
        onEntry { energy -= 1 }
    }
    val waitBall = messageWaitData<Int>("Ball") {
        shotCounter = it
    }

    startFrom(waitNewGameSignal)
            .fork("mainFork") {
                next(sendPlayerJoin)
                        .branch("mainLoop") {
                            ifTrue { energy < 5 || allPlayersOut }
                                    .next(sendPlayerOut)
                                    .next(waitBall)
                            ifElse()
                                    .next(waitBall)
                                    .next(throwBall)
                                    .loop()
                        }
                next(waitPlayerJoin).next(sendHandshake).next(waitPlayerJoin)
                next(waitPlayerOut).next(waitPlayerOut)
                next(receiveHandshake).next(receiveHandshake)
                next(waitStopGameSignal).terminate()
            }

    sendPlayerJoin.onExit { println("$playerName: I'm here!") }
    sendPlayerOut.onExit { println("$playerName: I'm out!") }
}

private fun MessageSendInstance<RandomPlayer, Int>.selectNextPlayer() {
    val player = if (process.players.isNotEmpty()) 
        process.players.random() 
    else 
        process.selfPlayer
    receiverDomain = player.domain
    receiverProcessInstanceId = player.id
    println("Step ${process.shotCounter + 1}: " +
            "${process.playerName} >>> ${player.name}")
}

Hoahoa:

Te whakauru momo BPM

I roto i te tono app3 ka hangahia e matou he kaitakaro he rereke te ahua: hei utu mo te kowhiri matapōkeretia i te kaitakaro e whai ake nei, ka mahi ia i runga i te algorithm round-robin:

akomanga RoundRobinPlayer

import ru.krista.bpm.ProcessInstance
import ru.krista.bpm.runtime.ProcessImpl
import ru.krista.bpm.runtime.dsl.processModel
import ru.krista.bpm.runtime.instance.MessageSendInstance

data class PlayerInfo(val name: String, val domain: String, val id: String)

class PlayersList: ArrayList<PlayerInfo>()

class RoundRobinPlayer : ProcessImpl<RoundRobinPlayer>(roundRobinPlayerModel) {

    var playerName: String by input(persistent = true, 
                                    defaultValue = "RoundRobinPlayer")
    var energy: Int by input(persistent = true, defaultValue = 30)
    var players: PlayersList by persistent(PlayersList())
    var nextPlayerIndex: Int by persistent(-1)
    var allPlayersOut: Boolean by persistent(false)
    var shotCounter: Int = 0

    val selfPlayer: PlayerInfo
        get() = PlayerInfo(playerName, env.eventDispatcher.domainName, id)
}

val roundRobinPlayerModel = processModel<RoundRobinPlayer>(
        name = "RoundRobinPlayer", 
        version = 1) {

    val waitNewGameSignal = signalWait<String>("NewGame")
    val waitStopGameSignal = signalWait<String>("StopGame")
    val sendPlayerJoin = signal<String>("PlayerJoin") {
        signalData = { playerName }
    }
    val sendPlayerOut = signal<String>("PlayerOut") {
        signalData = { playerName }
    }
    val waitPlayerJoin = signalWaitCustom<String>("PlayerJoin") {
        eventCondition = { signal ->
            signal.sender.processInstanceId != process.id 
                && !process.players.any { signal.sender.processInstanceId == it.id}
        }
        handler = { signal ->
            players.add(PlayerInfo(
                    signal.data!!, 
                    signal.sender.domain, 
                    signal.sender.processInstanceId))
        }
    }
    val waitPlayerOut = signalWait<String>("PlayerOut") { signal ->
        players.remove(PlayerInfo(
                signal.data!!, 
                signal.sender.domain, 
                signal.sender.processInstanceId))
        allPlayersOut = players.isEmpty()
    }
    val sendHandshake = messageSend<String>("Handshake") {
        messageData = { playerName }
        activation = {
            receiverDomain = process.players.last().domain
            receiverProcessInstanceId = process.players.last().id
        }
    }
    val receiveHandshake = messageWait<String>("Handshake") { message ->
        if (!players.any { message.sender.processInstanceId == it.id}) {
            players.add(PlayerInfo(
                    message.data!!, 
                    message.sender.domain, 
                    message.sender.processInstanceId))
        }
    }
    val throwBall = messageSend<Int>("Ball") {
        messageData = { shotCounter + 1 }
        activation = { selectNextPlayer() }
        onEntry { energy -= 1 }
    }
    val waitBall = messageWaitData<Int>("Ball") {
        shotCounter = it
    }

    startFrom(waitNewGameSignal)
            .fork("mainFork") {
                next(sendPlayerJoin)
                        .branch("mainLoop") {
                            ifTrue { energy < 5 || allPlayersOut }
                                    .next(sendPlayerOut)
                                    .next(waitBall)
                            ifElse()
                                    .next(waitBall)
                                    .next(throwBall)
                                    .loop()
                        }
                next(waitPlayerJoin).next(sendHandshake).next(waitPlayerJoin)
                next(waitPlayerOut).next(waitPlayerOut)
                next(receiveHandshake).next(receiveHandshake)
                next(waitStopGameSignal).terminate()
            }

    sendPlayerJoin.onExit { println("$playerName: I'm here!") }
    sendPlayerOut.onExit { println("$playerName: I'm out!") }
}

private fun MessageSendInstance<RoundRobinPlayer, Int>.selectNextPlayer() {
    var idx = process.nextPlayerIndex + 1
    if (idx >= process.players.size) {
        idx = 0
    }
    process.nextPlayerIndex = idx
    val player = if (process.players.isNotEmpty()) 
        process.players[idx] 
    else 
        process.selfPlayer
    receiverDomain = player.domain
    receiverProcessInstanceId = player.id
    println("Step ${process.shotCounter + 1}: " +
            "${process.playerName} >>> ${player.name}")
}

Ki te kore, karekau he rerekee te whanonga o te kaitakaro ki tera o mua, no reira kare e rereke te hoahoa.

Inaianei kei te hiahia taatau ki te whakamatautau ki te whakahaere i enei mea katoa. Ka hoatu e ahau anake te waehere o te whakamatautau, kia kore ai e pakaru te tuhinga ki te boilerplate (he pono, i whakamahia e ahau te taiao whakamatautau i hangaia i mua ki te whakamatautau i te whakauru o etahi atu tukanga pakihi):

testGame()

@Test
public void testGame() throws InterruptedException {
    String pl2 = startProcess(app2, "RandomPlayer", playerParams("Player2", 20));
    String pl3 = startProcess(app2, "RandomPlayer", playerParams("Player3", 40));
    String pl4 = startProcess(app3, "RoundRobinPlayer", playerParams("Player4", 25));
    String pl5 = startProcess(app3, "RoundRobinPlayer", playerParams("Player5", 35));
    String pl1 = startProcess(app1, "InitialPlayer");
    // Теперь нужно немного подождать, пока игроки "познакомятся" друг с другом.
    // Ждать через sleep - плохое решение, зато самое простое. 
    // Не делайте так в серьезных тестах!
    Thread.sleep(1000);
    // Запускаем игру, закрывая пользовательскую активность
    assertTrue(closeTask(app1, pl1, "Start"));
    app1.getWaiting().waitProcessFinished(pl1);
    app2.getWaiting().waitProcessFinished(pl2);
    app2.getWaiting().waitProcessFinished(pl3);
    app3.getWaiting().waitProcessFinished(pl4);
    app3.getWaiting().waitProcessFinished(pl5);
}

private Map<String, Object> playerParams(String name, int energy) {
    Map<String, Object> params = new HashMap<>();
    params.put("playerName", name);
    params.put("energy", energy);
    return params;
}

Me whakahaere te whakamatautau ka titiro ki te raarangi:

putanga papatohu

Взята блокировка ключа lock://app1/process/InitialPlayer
Let's play!
Снята блокировка ключа lock://app1/process/InitialPlayer
Player2: I'm here!
Player3: I'm here!
Player4: I'm here!
Player5: I'm here!
... join player Player2 ...
... join player Player4 ...
... join player Player3 ...
... join player Player5 ...
Step 1: Player1 >>> Player3
Step 2: Player3 >>> Player5
Step 3: Player5 >>> Player3
Step 4: Player3 >>> Player4
Step 5: Player4 >>> Player3
Step 6: Player3 >>> Player4
Step 7: Player4 >>> Player5
Step 8: Player5 >>> Player2
Step 9: Player2 >>> Player5
Step 10: Player5 >>> Player4
Step 11: Player4 >>> Player2
Step 12: Player2 >>> Player4
Step 13: Player4 >>> Player1
Step 14: Player1 >>> Player4
Step 15: Player4 >>> Player3
Step 16: Player3 >>> Player1
Step 17: Player1 >>> Player2
Step 18: Player2 >>> Player3
Step 19: Player3 >>> Player1
Step 20: Player1 >>> Player5
Step 21: Player5 >>> Player1
Step 22: Player1 >>> Player2
Step 23: Player2 >>> Player4
Step 24: Player4 >>> Player5
Step 25: Player5 >>> Player3
Step 26: Player3 >>> Player4
Step 27: Player4 >>> Player2
Step 28: Player2 >>> Player5
Step 29: Player5 >>> Player2
Step 30: Player2 >>> Player1
Step 31: Player1 >>> Player3
Step 32: Player3 >>> Player4
Step 33: Player4 >>> Player1
Step 34: Player1 >>> Player3
Step 35: Player3 >>> Player4
Step 36: Player4 >>> Player3
Step 37: Player3 >>> Player2
Step 38: Player2 >>> Player5
Step 39: Player5 >>> Player4
Step 40: Player4 >>> Player5
Step 41: Player5 >>> Player1
Step 42: Player1 >>> Player5
Step 43: Player5 >>> Player3
Step 44: Player3 >>> Player5
Step 45: Player5 >>> Player2
Step 46: Player2 >>> Player3
Step 47: Player3 >>> Player2
Step 48: Player2 >>> Player5
Step 49: Player5 >>> Player4
Step 50: Player4 >>> Player2
Step 51: Player2 >>> Player5
Step 52: Player5 >>> Player1
Step 53: Player1 >>> Player5
Step 54: Player5 >>> Player3
Step 55: Player3 >>> Player5
Step 56: Player5 >>> Player2
Step 57: Player2 >>> Player1
Step 58: Player1 >>> Player4
Step 59: Player4 >>> Player1
Step 60: Player1 >>> Player4
Step 61: Player4 >>> Player3
Step 62: Player3 >>> Player2
Step 63: Player2 >>> Player5
Step 64: Player5 >>> Player4
Step 65: Player4 >>> Player5
Step 66: Player5 >>> Player1
Step 67: Player1 >>> Player5
Step 68: Player5 >>> Player3
Step 69: Player3 >>> Player4
Step 70: Player4 >>> Player2
Step 71: Player2 >>> Player5
Step 72: Player5 >>> Player2
Step 73: Player2 >>> Player1
Step 74: Player1 >>> Player4
Step 75: Player4 >>> Player1
Step 76: Player1 >>> Player2
Step 77: Player2 >>> Player5
Step 78: Player5 >>> Player4
Step 79: Player4 >>> Player3
Step 80: Player3 >>> Player1
Step 81: Player1 >>> Player5
Step 82: Player5 >>> Player1
Step 83: Player1 >>> Player4
Step 84: Player4 >>> Player5
Step 85: Player5 >>> Player3
Step 86: Player3 >>> Player5
Step 87: Player5 >>> Player2
Step 88: Player2 >>> Player3
Player2: I'm out!
Step 89: Player3 >>> Player4
... player Player2 is out ...
Step 90: Player4 >>> Player1
Step 91: Player1 >>> Player3
Step 92: Player3 >>> Player1
Step 93: Player1 >>> Player4
Step 94: Player4 >>> Player3
Step 95: Player3 >>> Player5
Step 96: Player5 >>> Player1
Step 97: Player1 >>> Player5
Step 98: Player5 >>> Player3
Step 99: Player3 >>> Player5
Step 100: Player5 >>> Player4
Step 101: Player4 >>> Player5
Player4: I'm out!
... player Player4 is out ...
Step 102: Player5 >>> Player1
Step 103: Player1 >>> Player3
Step 104: Player3 >>> Player1
Step 105: Player1 >>> Player3
Step 106: Player3 >>> Player5
Step 107: Player5 >>> Player3
Step 108: Player3 >>> Player1
Step 109: Player1 >>> Player3
Step 110: Player3 >>> Player5
Step 111: Player5 >>> Player1
Step 112: Player1 >>> Player3
Step 113: Player3 >>> Player5
Step 114: Player5 >>> Player3
Step 115: Player3 >>> Player1
Step 116: Player1 >>> Player3
Step 117: Player3 >>> Player5
Step 118: Player5 >>> Player1
Step 119: Player1 >>> Player3
Step 120: Player3 >>> Player5
Step 121: Player5 >>> Player3
Player5: I'm out!
... player Player5 is out ...
Step 122: Player3 >>> Player5
Step 123: Player5 >>> Player1
Player5: I'm out!
Step 124: Player1 >>> Player3
... player Player5 is out ...
Step 125: Player3 >>> Player1
Step 126: Player1 >>> Player3
Player1: I'm out!
... player Player1 is out ...
Step 127: Player3 >>> Player3
Player3: I'm out!
Step 128: Player3 >>> Player3
... player Player3 is out ...
Player3: I'm out!
Stop!
Step 129: Player3 >>> Player3
Player3: I'm out!

Mai i enei mea katoa ka taea e tatou te whakaputa i etahi whakatau nui:

  • me nga taputapu e tika ana, ka taea e nga kaiwhakawhanake tono te hanga i nga taunekeneke whakauru i waenga i nga tono me te kore e pakaru i te arorau pakihi;
  • ka taea te huna i te uaua o te mahi whakauru e hiahia ana ki nga pukenga miihini ki roto i te anga mena ka whakauruhia tenei ki roto i te hoahoanga o te anga. Kaore e taea te huna i te uaua o te rapanga, no reira ka rite te ahua o te otinga ki tetahi raruraru uaua i roto i te waehere;
  • I te wa e whakawhanake ana i te arorau whakauru, he mea nui ki te whai whakaaro ki te riterite me te kore o te rarangi o nga huringa o te ahua o nga kaiuru whakauru katoa. Ma tenei e kaha ki te whakararu i te arorau kia kore ai e aro ki te raupapa e puta ai nga kaupapa o waho. I roto i ta maatau tauira, ka akiakihia te kaitakaro ki te whai waahi ki te keemu i muri i tana whakapuaki i tana putanga mai i te keemu: ka tukuna tonu e etahi atu kaitakaro te poi ki a ia kia tae ra ano nga korero mo tana putanga ka whakahaerea e nga kaiuru katoa. Kaore tenei arorau e whai ana i nga ture o te keemu, he otinga whakararu i roto i te anga o te hoahoanga kua tohua.

I muri mai, ka korerohia e matou nga ahuatanga rereke o to maatau otinga, nga whakaraerae me etahi atu waahanga.

Ko nga karere katoa kei te rarangi kotahi

Ko nga tono whakauru katoa e mahi tahi ana me tetahi pahi whakauru, e whakaatuhia ana i roto i te ahua o te kaihokohoko o waho, kotahi BPMQueue mo nga karere me tetahi kaupapa BPMTopic mo nga tohu (kaupapa). Ko te tuku i nga karere katoa i roto i te rarangi kotahi he taupatupatu. I te taumata arorau pakihi, ka taea e koe te whakauru i nga momo karere hou e pai ana koe me te kore e whakarereke i te hanganga punaha. He tino whakangāwaritanga tenei, engari kei te kawe etahi moreareatanga, i roto i te horopaki o a matou mahi angamaheni kaore i tino nui ki a matou.

Te whakauru momo BPM

Heoi ano, kotahi ano te hianga: ka tātarihia e ia tono nga karere "ona" mai i te rarangi i te tomokanga, ma te ingoa o tona rohe. Ka taea hoki te tohu te rohe i roto i nga tohu mena ka hiahia koe ki te whakawhāiti i te "nui o te tirohanga" o te tohu ki te tono kotahi. Ma tenei ka piki ake te utu pahi, engari me mahi te arorau pakihi me nga ingoa rohe: mo te whakatika i nga karere - he whakahau, mo nga tohu - he hiahia.

Te Whakapumau i te Whakakotahitanga Pahi Pono

Ko te pono he maha nga waahanga:

  • Ko te kaihokohoko karere kua tohua he waahanga nui o te hoahoanga me tetahi waahi o te rahua: me tino aro ki te he. Me whakamahi koe i nga whakatinanatanga kua whakamatauria i te waa, me te tautoko pai me te hapori nui;
  • he mea tika ki te whakarite kia nui te waatea o te kaihokohoko karere, me wehe-a-tinana mai i nga tono whakauru (he nui ake te uaua me te utu nui o te waatea o nga tono me te arorau pakihi tono);
  • me tuku te kaihokohoko "i te iti rawa kia kotahi" nga taurangi tuku. He whakaritenga whakahau tenei mo te whakahaere pono o te pahi whakauru. Kaore he hiahia mo te "kotahi tonu" nga taurangi taumata: ko nga mahi pakihi, hei tikanga, kaore e aro ki te taenga mai o nga karere, o nga huihuinga ranei, a, i roto i nga mahi motuhake he mea nui tenei, he maamaa ake te taapiri atu i nga arowhai ki te umanga. arorau nui atu i te whakamahi i nga wa katoa "he utu" " taurangi;
  • Ko te tuku karere me nga tohu me uru ki roto i te tauwhitinga whanui me nga huringa o te ahua o nga tukanga pakihi me nga raraunga rohe. Ko te whiringa pai ko te whakamahi tauira Pouakawaho tauwhitinga, engari ka hiahiatia he ripanga taapiri i roto i te paataka raraunga me te tukurua. I roto i nga tono JEE, ka taea te ngawari ma te whakamahi i te kaiwhakahaere JTA o te rohe, engari ko te hononga ki te kaihokohoko kua tohua me kaha ki te mahi XA;
  • me mahi tahi nga kaihautu o nga karere me nga huihuinga taumai me tetahi tauwhitinga e whakarereke ana i te ahua o te mahi pakihi: ki te whakahokia mai taua tauwhitinga, katahi ka whakakorehia te whiwhinga o te karere;
  • Ko nga karere kaore i taea te tuku na te hapa me penapena ki tetahi rokiroki motuhake D.L.Q. (Tutira Reta Mate). Mo tenei kaupapa, i hangaia e matou he ratonga moroiti tüäpapa motuhake e pupuri ana i aua karere i roto i tana rokiroki, ka tohuhia ma nga huanga (mo te whakarōpū tere me te rapu), me te whakaatu i te API mo te tiro, te tuku ano ki te wahitau ūnga, me te whakakore i nga karere. Ka taea e nga kaiwhakahaere o te punaha te mahi me tenei ratonga ma o raatau atanga tukutuku;
  • i roto i nga tautuhinga kaihokohoko, me whakatika e koe te maha o nga tuku tuku me te whakaroa i waenga i nga tuku kia taea ai te whakaiti i te tupono ka uru atu nga karere ki roto i te DLQ (kaore e taea te tatau i nga tawhā tino pai, engari ka taea e koe te mahi me te whakatika i a raatau i te wa e mahi ana. );
  • Me aro turuki tonu te toa DLQ, me whakamohio te punaha aro turuki i nga kaiwhakahaere punaha kia puta nga karere kaore i tukuna, ka taea e ratou te whakautu tere. Ma tenei ka whakaiti i te "rohe e pa ana" o te kore, te hapa arorau pakihi ranei;
  • Ko te pahi whakaurunga me kore e aro ki te korenga o nga tono mo te wa poto: me noho roa te ohaurunga ki tetahi kaupapa, me te ahurei te ingoa rohe o te tono kia kore ai te tono, kare tetahi atu e ngana ki te whakahaere i ana karere mai i te tūtira.

Te whakarite i te haumaru miro o te arorau pakihi

Ko taua tauira o te mahi pakihi ka taea te whiwhi i nga karere maha me nga huihuinga i te wa kotahi, ko te tukatuka ka timata i te whakarara. I te wa ano, mo te kaiwhakawhanake tono, me ngawari nga mea katoa me te haumaru miro.

Ko te arorau pakihi o tetahi tukanga e tukatuka ana i ia huihuinga o waho e pa ana ki taua mahinga pakihi takitahi. Ko nga huihuinga penei pea:

  • te whakarewa i tetahi tauira tukanga pakihi;
  • nga mahi a te kaiwhakamahi e pa ana ki nga mahi i roto i te tukanga pakihi;
  • te whiwhinga o te karere, tohu ranei i ohauruhia ai he tauira tukanga pakihi;
  • te whakaoho o te taima kua whakaritea e tetahi tauira mahi pakihi;
  • mana whakahaere ma te API (hei tauira, te aukati i te tukanga).

Ka taea e ia huihuinga te whakarereke i te ahuatanga o te tauira mahi pakihi: ka mutu etahi mahi ka timata etahi atu, ka rereke pea nga uara o nga taonga tohe. Ko te kati i nga mahi ka taea te whakahohe i tetahi, neke atu ranei o enei mahi e whai ake nei. Ka taea e era, ka mutu te tatari mo etahi atu huihuinga, ki te kore e hiahiatia etahi atu raraunga, ka taea te whakaoti i roto i te tauwhitinga kotahi. I mua i te kati i te tauwhitinga, ka tiakina te ahua hou o te mahi pakihi i roto i te paataka, ka tatari mo te huihuinga o waho e whai ake nei.

Ko nga raraunga tukanga pakihi e rongoa ana i roto i te papaaarangi hononga he waahi tino watea mo te tukutahi i te tukatuka mena ka whakamahi koe i te SELECT FOR UPDATE. Mena ka taea e tetahi tauwhitinga te whiwhi i te ahua o te mahi pakihi mai i te turanga mo te whakarereke, katahi ka kore e taea e tetahi atu tauwhitinga whakarara te whiwhi i te ahua ano mo tetahi atu huringa, a, i muri i te otinga o te tauwhitinga tuatahi, ko te tuarua ko te. kua whakamanahia kia whiwhi i te ahua kua whakarereketia.

Ma te whakamahi i nga raka pessimistic i te taha DBMS, ka whakatutukihia e matou nga whakaritenga katoa ACID, me te pupuri ano i te kaha ki te whakarahi i te tono me te arorau pakihi ma te whakanui ake i te maha o nga waa whakahaere.

Heoi, ka whakatumatuma nga raka pessimistic ki a tatou ki nga kati, ko te tikanga ko te KŌWHIRINGA MO TE WHAKAUPAPA me whakawhäiti tonu ki etahi wa poto inaa ka puta nga kati i runga i etahi keehi kino i roto i te arorau pakihi.

Ko tetahi atu raruraru ko te tukutahitanga o te tiimata o te mahi pakihi. Ahakoa kaore he tauira o te tukanga pakihi, kaore he ahua i roto i te papaarangi, no reira ka kore e mahi te tikanga kua whakaahuatia. Mena ka hiahia koe ki te whakarite i te motuhaketanga o tetahi tauira mahi pakihi i roto i tetahi waahanga motuhake, katahi ka hiahia koe ki etahi momo ahanoa tukutahi e hono ana ki te akomanga tukanga me te whānuitanga e rite ana. Hei whakaoti i tenei raru, ka whakamahia e matou he momo raka rereke e taea ai e matou te tango raka i runga i tetahi rauemi karekau i tohua e tetahi ki te whakatakotoranga URI ma te ratonga o waho.

I roto i o maatau tauira, kei roto i te tukanga pakihi InitialPlayer he whakapuakanga

uniqueConstraint = UniqueConstraints.singleton

Na reira, kei roto i te raarangi nga korero mo te tango me te tuku i te raka o te kii e rite ana. Karekau he karere pera mo etahi atu tukanga pakihi: uniqueConstraint kaore i whakaritea.

Nga raruraru o nga tukanga pakihi me te ahua mau tonu

I etahi wa ko te noho pumau kaore i te awhina anake, engari ka tino aukati i te whakawhanaketanga.
Ka timata nga raruraru ka hiahia kia whakarereketia te arorau pakihi me te tauira tukanga pakihi. Ehara nga huringa katoa i te hototahi ki te ahua tawhito o nga mahi pakihi. Mena he maha nga ahuatanga ora kei roto i te paataka raraunga, na te whakarereketanga hototahi ka nui te raru, he maha nga wa e pa ana ki a maatau i te whakamahi i te jBPM.

I runga i te hohonu o nga huringa, ka taea e koe te mahi i nga huarahi e rua:

  1. hanga he momo tukanga pakihi hou kia kore ai e hangai nga huringa hotokore ki te mea tawhito, me te whakamahi hei utu mo te mea tawhito i te wa e whakarewahia ana nga tauira hou. Ko nga kape tawhito ka mahi tonu "penei i mua";
  2. te heke i te ahua mau tonu o nga tukanga pakihi i te wa e whakahou ana i te arorau pakihi.

Ko te huarahi tuatahi he ngawari ake, engari he herenga me ona ngoikoretanga, hei tauira:

  • te tāruarua o te arorau pakihi i roto i te maha o nga tauira tukanga pakihi, te whakanui ake i te rōrahi o te arorau pakihi;
  • I te nuinga o nga wa ka hiahiatia he whakawhiti tere ki te arorau pakihi hou (i runga i nga mahi whakauru - tata tonu);
  • kaore te kaiwhakawhanake i te mohio he aha te wa ka taea te whakakore i nga tauira tawhito.

I roto i nga mahi ka whakamahia e matou nga huarahi e rua, engari he maha nga whakatau kua mahia e matou kia ngawari ake o matou oranga:

  • I roto i te papaaarangi, ko te ahua mau tonu o te mahi pakihi ka rongoa i roto i te ahua ngawari te panui me te ngawari te tukatuka: i roto i te aho whakatakotoranga JSON. Ma tenei ka taea nga hekenga ki roto i te tono me waho. Hei huarahi whakamutunga, ka taea e koe te whakatika a-ringa (ina koa he pai ki te whakawhanaketanga i te wa o te patuiro);
  • kaore te arorau pakihi whakauru e whakamahi i nga ingoa o nga tukanga pakihi, na i nga wa katoa ka taea te whakakapi i te whakatinanatanga o tetahi o nga tukanga whakauru me te mea hou me te ingoa hou (hei tauira, "InitialPlayerV2"). Ko te herenga ka puta mai i nga ingoa karere me nga tohu tohu;
  • he tau putanga kei te tauira tukanga, ka whakanuia e matou ki te whakarereke i te hototahi ki tenei tauira, ka tiakina tenei nama me te ahua o te tauira mahi;
  • ko te ahua mau tonu o te tukanga ka panuihia mai i te papaaarangi i te tuatahi ki te tauira ahanoa watea, ka taea e te tukanga hekenga te mahi mena kua huri te tau tauira tauira;
  • ko te tikanga hekenga ka tuu ki te taha o te arorau pakihi ka kiia he "mangere" mo ia ahuatanga o te mahi pakihi i te wa i whakahokia mai ai i te paataka;
  • ki te hiahia koe ki te heke tere me te tukutahi i te ahua o nga huringa katoa, he maha ake nga rongoatanga hekenga patengi raraunga matarohia, engari me mahi tahi koe me JSON.

Kei te hiahia koe i tetahi atu anga mo nga tukanga pakihi?

Ko nga otinga i whakaahuahia i roto i te tuhinga i taea ai e maatau te ngawari o to maatau oranga, te whakarahi i te whānuitanga o nga take kua whakatauhia i te taumata whanaketanga tono, me te pai ake te whakaaro ki te wehe i nga arorau pakihi ki nga ratonga miihini. Hei whakatutuki i tenei, he maha nga mahi i mahia, he tino angamahi "maamaa" mo nga tukanga pakihi, me nga waahanga ratonga hei whakaoti i nga raruraru kua tautuhia i roto i te horopaki o te maha o nga raruraru tono. Kei te pirangi matou ki te tiri i enei hua me te whakatuwhera i te whanaketanga o nga waahanga noa i raro i te raihana kore utu. Ka hiahiatia he whakapau kaha me te wa. Ko te mohio ki te tono mo enei otinga ka waiho hei whakatenatena ake mo tatou. I roto i te tuhinga e whakaarohia ana, he iti noa te aro ki nga kaha o te angamahi ake, engari ka kitea etahi o enei mai i nga tauira kua whakaatuhia. Mena ka whakaputahia e matou to maatau anga, ka whakatapua he tuhinga motuhake mo tena. I tenei wa, ka mihi matou ki te waiho e koe he urupare iti ma te whakautu i te patai:

Ko nga kaiwhakamahi kua rehita anake ka uru ki te rangahau. Waitohu maitēnā.

Kei te hiahia koe i tetahi atu anga mo nga tukanga pakihi?

  • 18,8 orauAe, kua roa ahau e rapu ana i tetahi mea penei

  • 12,5 orauKei te pirangi au ki te ako atu mo to whakatinanatanga, ka whai hua pea2

  • 6,2 orauKa whakamahia e matou tetahi o nga anga o naianei, engari e whakaaro ana matou ki te whakakapi1

  • 18,8 orauKa whakamahia e matou tetahi o nga anga o naianei, kei te pai katoa3

  • 18,8 orauka whakahaeretia kaore he anga3

  • 25,0 orautuhia to4

16 nga kaiwhakamahi i pooti. 7 nga kaiwhakamahi i aukati.

Source: will.com

Tāpiri i te kōrero