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.
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).
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.
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.
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.
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.
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):
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:
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:
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.
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:
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";
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.