{"id":9627,"date":"2025-12-17T12:51:36","date_gmt":"2025-12-17T11:51:36","guid":{"rendered":"https:\/\/pomoc.comarch.pl\/cee\/?post_type=ht_kb&#038;p=9627"},"modified":"2025-12-23T14:10:23","modified_gmt":"2025-12-23T13:10:23","slug":"__trashed-8","status":"publish","type":"ht_kb","link":"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/__trashed-8\/","title":{"rendered":"Us\u0142ugi"},"content":{"rendered":"<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_82_2 ez-toc-wrap-left counter-hierarchy ez-toc-counter ez-toc-custom ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">Spis tre\u015bci<\/p>\n<span class=\"ez-toc-title-toggle\"><a href=\"#\" class=\"ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle\" aria-label=\"Prze\u0142\u0105cznik Spisu Tre\u015bci\"><span class=\"ez-toc-js-icon-con\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/span><\/a><\/span><\/div>\n<nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/__trashed-8\/#Wprowadzenie\" >Wprowadzenie<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/__trashed-8\/#Grupa_docelowa\" >Grupa docelowa<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/__trashed-8\/#Opis\" >Opis<\/a><ul class='ez-toc-list-level-4' ><li class='ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/__trashed-8\/#Uslugi_i_instancje_uslug\" >Us\u0142ugi i instancje us\u0142ug<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/__trashed-8\/#Interfejs_uslugi\" >Interfejs us\u0142ugi<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/__trashed-8\/#Interfejs_programistyczny\" >Interfejs programistyczny<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-7\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/__trashed-8\/#Statusy_wywolan_funkcji\" >Statusy wywo\u0142a\u0144 funkcji<\/a><ul class='ez-toc-list-level-5' ><li class='ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-8\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/__trashed-8\/#API_do_wywolania_funkcji\" >API do wywo\u0142ania funkcji<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-9\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/__trashed-8\/#API_dla_uslug\" >API dla us\u0142ug<\/a><ul class='ez-toc-list-level-6' ><li class='ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-10\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/__trashed-8\/#Rejestracja_interfejsu\" >Rejestracja interfejsu<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-11\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/__trashed-8\/#Struktura_interfejsu\" >Struktura interfejsu<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-12\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/__trashed-8\/#Przyklad_implementacji_interfejsu\" >Przyk\u0142ad implementacji interfejsu<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-13\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/__trashed-8\/#Implementacja_zadania_przetwarzajacego\" >Implementacja zadania przetwarzaj\u0105cego<\/a><\/li><\/ul><\/li><\/ul><\/li><\/ul><\/li><\/ul><\/nav><\/div>\n<h3 id=\"wprowadzenie\" ><span class=\"ez-toc-section\" id=\"Wprowadzenie\"><\/span>Wprowadzenie<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p data-start=\"20\" data-end=\"157\">Us\u0142uga udost\u0119pnia w uj\u0119ciu og\u00f3lnym centralne funkcje, z kt\u00f3rych mog\u0105 korzysta\u0107 aplikacje dzia\u0142aj\u0105ce na dowolnych serwerach aplikacyjnych.<\/p>\n<p data-start=\"159\" data-end=\"172\"><strong data-start=\"159\" data-end=\"172\">Przyk\u0142ad us\u0142ug:<\/strong><\/p>\n<ul data-start=\"173\" data-end=\"253\">\n<li data-start=\"173\" data-end=\"218\">\n<p data-start=\"175\" data-end=\"218\">Serwer logistyki magazynowej<\/p>\n<\/li>\n<li data-start=\"219\" data-end=\"253\">\n<p data-start=\"221\" data-end=\"253\">Serwer planowania<\/p>\n<\/li>\n<\/ul>\n<p data-start=\"255\" data-end=\"316\">Silnik systemowy zapewnia infrastruktur\u0119 dla us\u0142ug.<\/p>\n<h3 data-start=\"323\" data-end=\"340\" id=\"grupa-docelowa\" ><span class=\"ez-toc-section\" id=\"Grupa_docelowa\"><\/span>Grupa docelowa<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<ul data-start=\"342\" data-end=\"384\">\n<li data-start=\"342\" data-end=\"357\">\n<p data-start=\"344\" data-end=\"357\">Programi\u015bci<\/p>\n<\/li>\n<li data-start=\"358\" data-end=\"384\">\n<p data-start=\"360\" data-end=\"384\">Konsultanci techniczni<\/p>\n<\/li>\n<\/ul>\n<h3 data-start=\"391\" data-end=\"398\" id=\"opis\" ><span class=\"ez-toc-section\" id=\"Opis\"><\/span>Opis<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p data-start=\"400\" data-end=\"509\">Silnik systemowy udost\u0119pnia infrastruktur\u0119 dla us\u0142ug. Infrastruktura ta ma nast\u0119puj\u0105ce w\u0142a\u015bciwo\u015bci:<\/p>\n<ul data-start=\"511\" data-end=\"826\">\n<li data-start=\"511\" data-end=\"558\">\n<p data-start=\"513\" data-end=\"558\">centralne zarz\u0105dzanie uruchomionymi us\u0142ugami<\/p>\n<\/li>\n<li data-start=\"559\" data-end=\"618\">\n<p data-start=\"561\" data-end=\"618\">wywo\u0142ywanie us\u0142ugi bez wskazywania serwera aplikacji<\/p>\n<\/li>\n<li data-start=\"619\" data-end=\"652\">\n<p data-start=\"621\" data-end=\"652\">obs\u0142uga b\u0142\u0119d\u00f3w podczas wywo\u0142a\u0144<\/p>\n<\/li>\n<li data-start=\"653\" data-end=\"685\">\n<p data-start=\"655\" data-end=\"685\">szczeg\u00f3\u0142owe komunikaty b\u0142\u0119d\u00f3w<\/p>\n<\/li>\n<li data-start=\"686\" data-end=\"720\">\n<p data-start=\"688\" data-end=\"720\">natychmiastowe zwracanie b\u0142\u0119d\u00f3w<\/p>\n<\/li>\n<li data-start=\"721\" data-end=\"770\">\n<p data-start=\"723\" data-end=\"770\">mo\u017cliwo\u015b\u0107 asynchronicznego wykonywania zapyta\u0144<\/p>\n<\/li>\n<li data-start=\"771\" data-end=\"794\">\n<p data-start=\"773\" data-end=\"794\">wi\u0119ksza r\u00f3wnoleg\u0142o\u015b\u0107<\/p>\n<\/li>\n<li data-start=\"795\" data-end=\"826\">\n<p data-start=\"797\" data-end=\"826\">lepsze wykorzystanie zasob\u00f3w<\/p>\n<\/li>\n<\/ul>\n<h4 data-start=\"880\" data-end=\"907\" id=\"uslugi-i-instancje-uslug\" ><span class=\"ez-toc-section\" id=\"Uslugi_i_instancje_uslug\"><\/span>Us\u0142ugi i instancje us\u0142ug<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p data-start=\"909\" data-end=\"1131\">Us\u0142ugi w systemie udost\u0119pniaj\u0105 funkcje, z kt\u00f3rych mog\u0105 korzysta\u0107 dowolne aplikacje. W odr\u00f3\u017cnieniu od klas logiki, wywo\u0142ywana funkcja nie jest wykonywana w sesji (w\u0105tku) aplikacji wywo\u0142uj\u0105cej, lecz w sesji us\u0142ugi.<\/p>\n<p data-start=\"1133\" data-end=\"1213\"><section class=\"document-alert-box example\"><div class=\"document-alert-title\">Przyk\u0142ad<\/div><div class=\"document-alert-content\">Serwer logistyki magazynowej dla bazy danych XYZ44000 jest us\u0142ug\u0105.<\/div><\/section><\/p>\n<p data-start=\"1215\" data-end=\"1450\">Instancja us\u0142ugi to uruchomiona na serwerze aplikacyjnym us\u0142uga. Ta sama us\u0142uga mo\u017ce dzia\u0142a\u0107 na jednym lub wielu serwerach aplikacyjnych, co oznacza, \u017ce dla jednej us\u0142ugi mo\u017ce istnie\u0107 wiele instancji. Instancja us\u0142ugi sk\u0142ada si\u0119 z <span style=\"font-size: revert; color: initial;\">interfejsu udost\u0119pniaj\u0105cego us\u0142ug\u0119 do obs\u0142ugi zapyta\u0144 oraz <\/span><span style=\"font-size: revert; color: initial;\">jednego lub wielu zada\u0144 przetwarzaj\u0105cych (procesor\u00f3w), kt\u00f3re wykonuj\u0105 zapytania.<\/span><\/p>\n<p data-start=\"1592\" data-end=\"1837\">Interfejs rozdziela przychodz\u0105ce zapytania do zada\u0144 przetwarzaj\u0105cych. Aplikacje komunikuj\u0105 si\u0119 wy\u0142\u0105cznie przez interfejs udost\u0119pniany przez us\u0142ug\u0119. Dla ka\u017cdej us\u0142ugi na danym serwerze aplikacyjnym istnieje maksymalnie jedna instancja interfejsu.<\/p>\n<p data-start=\"1839\" data-end=\"1951\">Aplikacje mog\u0105 wywo\u0142ywa\u0107 funkcje instancji us\u0142ugi tak\u017ce wtedy, gdy same dzia\u0142aj\u0105 na innym serwerze aplikacyjnym.<\/p>\n<p data-start=\"1953\" data-end=\"2132\"><span style=\"font-size: revert; color: initial;\">Aplikacje komunikuj\u0105 si\u0119 wy\u0142\u0105cznie za po\u015brednictwem interfejsu udost\u0119pnianego przez us\u0142ug\u0119. Dla ka\u017cdej us\u0142ugi na danym serwerze aplikacyjnym mo\u017ce istnie\u0107 maksymalnie jedna instancja us\u0142ugi. Aplikacje mog\u0105 wywo\u0142ywa\u0107 funkcje instancji us\u0142ug r\u00f3wnie\u017c wtedy, gdy same dzia\u0142aj\u0105 na innym serwerze aplikacji.<\/span><\/p>\n<p data-start=\"1953\" data-end=\"2132\"><a href=\"https:\/\/pomoc.comarch.pl\/cee\/wp-content\/uploads\/2025\/12\/usluga2-1.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignleft size-full wp-image-41167\" src=\"https:\/\/pomoc.comarch.pl\/cee\/wp-content\/uploads\/2025\/12\/usluga2-1.png\" alt=\"\" width=\"1509\" height=\"993\" srcset=\"https:\/\/pomoc.comarch.pl\/cee\/wp-content\/uploads\/2025\/12\/usluga2-1.png 1509w, https:\/\/pomoc.comarch.pl\/cee\/wp-content\/uploads\/2025\/12\/usluga2-1-300x197.png 300w, https:\/\/pomoc.comarch.pl\/cee\/wp-content\/uploads\/2025\/12\/usluga2-1-1024x674.png 1024w, https:\/\/pomoc.comarch.pl\/cee\/wp-content\/uploads\/2025\/12\/usluga2-1-768x505.png 768w, https:\/\/pomoc.comarch.pl\/cee\/wp-content\/uploads\/2025\/12\/usluga2-1-50x33.png 50w, https:\/\/pomoc.comarch.pl\/cee\/wp-content\/uploads\/2025\/12\/usluga2-1-920x605.png 920w, https:\/\/pomoc.comarch.pl\/cee\/wp-content\/uploads\/2025\/12\/usluga2-1-600x395.png 600w, https:\/\/pomoc.comarch.pl\/cee\/wp-content\/uploads\/2025\/12\/usluga2-1-320x211.png 320w\" sizes=\"auto, (max-width: 1509px) 100vw, 1509px\" \/><\/a><\/p>\n<p data-start=\"764\" data-end=\"793\">Przyk\u0142ad us\u0142ug w systemie<\/p>\n<p data-start=\"795\" data-end=\"1203\">W przedstawionym przyk\u0142adzie us\u0142uga X dzia\u0142a na serwerze aplikacji 1 oraz 2. Na serwerze aplikacyjnym 1 dwa zadania przetwarzaj\u0105ce obs\u0142uguj\u0105 zapytania us\u0142ugi X. Na serwerze aplikacyjnym 2 zapytania us\u0142ugi X obs\u0142ugiwane s\u0105 tylko przez jedno zadanie przetwarzaj\u0105ce. Us\u0142uga Y dzia\u0142a wy\u0142\u0105cznie na serwerze aplikacji1 i posiada jedno zadanie przetwarzaj\u0105ce; nie jest uruchomiona na serwerze aplikacyjnym 2.<\/p>\n<p data-start=\"1219\" data-end=\"1467\"><section class=\"document-alert-box example\"><div class=\"document-alert-title\">Przyk\u0142ad<\/div><div class=\"document-alert-content\">Serwer logistyki magazynowej dla bazy danych XYZ, uruchomiony na serwerze aplikacyjnym ABC, stanowi instancj\u0119 us\u0142ugi. Aplikacja dzia\u0142aj\u0105ca na serwerze aplikacyjnym DEF mo\u017ce wywo\u0142ywa\u0107 serwer logistyki magazynowej na serwerze ABC dla bazy danych XYZ.<\/div><\/section><\/p>\n<p data-start=\"1469\" data-end=\"1676\">Informacje o aktualnie uruchomionych instancjach us\u0142ug s\u0105 zarz\u0105dzane centralnie. Dzi\u0119ki temu funkcje us\u0142ugi mog\u0105 by\u0107 wywo\u0142ywane bez konieczno\u015bci wiedzy, na kt\u00f3rym serwerze aplikacyjnym dzia\u0142a dana instancja.<\/p>\n<p data-start=\"1692\" data-end=\"1943\"><section class=\"document-alert-box example\"><div class=\"document-alert-title\">Przyk\u0142ad<\/div><div class=\"document-alert-content\">W <em>Konfiguracji<\/em> nie ma potrzeby zapisywania informacji, na kt\u00f3rym serwerze dzia\u0142a serwer logistyki magazynowej dla bazy danych XYZ44000. Funkcje serwera logistyki magazynowej dla tej bazy mog\u0105 by\u0107 wywo\u0142ywane bez podawania serwera aplikacyjnego.<\/div><\/section><\/p>\n<p data-start=\"1945\" data-end=\"2191\" data-is-last-node=\"\" data-is-only-node=\"\">Je\u017celi dla danej us\u0142ugi istnieje wi\u0119cej ni\u017c jedna instancja, wywo\u0142ania s\u0105 rozdzielane pomi\u0119dzy instancje mo\u017cliwie r\u00f3wnomiernie. Dzi\u0119ki r\u00f3wnomiernemu rozk\u0142adowi wywo\u0142a\u0144 us\u0142uga skaluje si\u0119 liniowo wraz ze wzrostem liczby dost\u0119pnych instancji us\u0142ug.<\/p>\n<h4 data-start=\"2318\" data-end=\"2337\" id=\"interfejs-uslugi\" ><span class=\"ez-toc-section\" id=\"Interfejs_uslugi\"><\/span>Interfejs us\u0142ugi<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p data-start=\"2339\" data-end=\"2470\">Aplikacje mog\u0105 wywo\u0142ywa\u0107 funkcje udost\u0119pniane przez us\u0142ug\u0119. Wywo\u0142anie funkcji us\u0142ugi odbywa si\u0119 z u\u017cyciem nast\u0119puj\u0105cych parametr\u00f3w:<\/p>\n<p data-start=\"2474\" data-end=\"2587\"><strong data-start=\"2474\" data-end=\"2490\">action (int)<\/strong> \u2013 jednoznaczna identyfikacja wywo\u0142ywanej funkcji; zestaw funkcji zale\u017cy od implementacji us\u0142ugi,<\/p>\n<p data-start=\"2590\" data-end=\"2723\"><strong data-start=\"2590\" data-end=\"2623\">parameters (CisParameterList)<\/strong> \u2013 lista parametr\u00f3w w postaci par klucz\u2013warto\u015b\u0107; wymagane parametry zale\u017c\u0105 od implementacji funkcji.<\/p>\n<p data-start=\"2725\" data-end=\"2829\">Instancja us\u0142ugi wylicza wynik na podstawie <em>action<\/em> i <em>parameters<\/em> i zwraca go jako <em>CisParameterList<\/em>.<\/p>\n<p data-start=\"2831\" data-end=\"2864\">Us\u0142uga jest identyfikowana przez:<\/p>\n<ul data-start=\"2865\" data-end=\"2939\">\n<li data-start=\"2865\" data-end=\"2895\">\n<p data-start=\"2867\" data-end=\"2895\">klas\u0119 implementuj\u0105c\u0105 us\u0142ug\u0119<\/p>\n<\/li>\n<li data-start=\"2896\" data-end=\"2939\">\n<p data-start=\"2898\" data-end=\"2939\">identyfikator <em>Id<\/em><code data-start=\"2912\" data-end=\"2916\"><\/code> (dowolny ci\u0105g znak\u00f3w)<\/p>\n<\/li>\n<\/ul>\n<p data-start=\"2941\" data-end=\"2987\">Do wywo\u0142ania funkcji us\u0142ugi potrzebne s\u0105:<\/p>\n<ul data-start=\"2988\" data-end=\"3068\">\n<li data-start=\"2988\" data-end=\"3023\">\n<p data-start=\"2990\" data-end=\"3023\">serwer aplikacji (opcjonalnie)<\/p>\n<\/li>\n<li data-start=\"3024\" data-end=\"3039\">\n<p data-start=\"3026\" data-end=\"3039\">klasa us\u0142ugi<\/p>\n<\/li>\n<li data-start=\"3040\" data-end=\"3045\">\n<p data-start=\"3042\" data-end=\"3045\">Id<\/p>\n<\/li>\n<li data-start=\"3040\" data-end=\"3045\">\n<p data-start=\"3042\" data-end=\"3045\">Action<\/p>\n<\/li>\n<li data-start=\"3040\" data-end=\"3045\">\n<p data-start=\"3042\" data-end=\"3045\">Parameter<\/p>\n<\/li>\n<\/ul>\n<p>Je\u017celi dodatkowo zostanie wskazany serwer aplikacji, wywo\u0142anie trafi do instancji dzia\u0142aj\u0105cej na tym konkretnym serwerze. Je\u017celi serwer nie zostanie podany, wybierana jest dowolna instancja us\u0142ugi.<\/p>\n<p data-start=\"3271\" data-end=\"3382\">W odr\u00f3\u017cnieniu od wywo\u0142ania funkcji logiki, przy wywo\u0142aniu funkcji us\u0142ugi mog\u0105 wyst\u0105pi\u0107 m.in. nast\u0119puj\u0105ce b\u0142\u0119dy:<\/p>\n<ul data-start=\"3383\" data-end=\"3548\">\n<li data-start=\"3383\" data-end=\"3425\">\n<p data-start=\"3385\" data-end=\"3425\">nie uruchomiono \u017cadnej instancji us\u0142ugi<\/p>\n<\/li>\n<li data-start=\"3426\" data-end=\"3458\">\n<p data-start=\"3428\" data-end=\"3458\">us\u0142uga nie przetwarza zapyta\u0144<\/p>\n<\/li>\n<li data-start=\"3459\" data-end=\"3541\">\n<p data-start=\"3461\" data-end=\"3541\">serwer aplikacji z instancj\u0105 us\u0142ugi zosta\u0142 zako\u0144czony w trakcie przetwarzania<\/p>\n<\/li>\n<\/ul>\n<p data-start=\"3550\" data-end=\"3711\">Wszystkie te sytuacje nale\u017cy uwzgl\u0119dnia\u0107, szczeg\u00f3lnie gdy funkcja modyfikuje trwa\u0142e dane \u2013 w przypadku b\u0142\u0119du istotne jest, czy funkcja zosta\u0142a wykonana, czy nie.<\/p>\n<h4 data-start=\"3718\" data-end=\"3746\" id=\"interfejs-programistyczny\" ><span class=\"ez-toc-section\" id=\"Interfejs_programistyczny\"><\/span>Interfejs programistyczny<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p data-start=\"3748\" data-end=\"3783\">Interfejs programistyczny obejmuje:<\/p>\n<ul data-start=\"3784\" data-end=\"3902\">\n<li data-start=\"3784\" data-end=\"3835\">\n<p data-start=\"3786\" data-end=\"3835\">API do wywo\u0142ywania funkcji us\u0142ug przez aplikacje<\/p>\n<\/li>\n<li data-start=\"3836\" data-end=\"3902\">\n<p data-start=\"3838\" data-end=\"3902\">API do tworzenia\/us\u0142ugi (implementacja interfejsu i procesor\u00f3w)<\/p>\n<\/li>\n<\/ul>\n<h4 data-start=\"3904\" data-end=\"3931\" id=\"statusy-wywolan-funkcji\" ><span class=\"ez-toc-section\" id=\"Statusy_wywolan_funkcji\"><\/span>Statusy wywo\u0142a\u0144 funkcji<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>Funkcja serwisu mo\u017ce zosta\u0107 wywo\u0142ana z dowolnego serwera aplikacyjnego. Wywo\u0142anie funkcji serwisu powoduje utworzenie requestu, kt\u00f3ry zawiera aktualny stan wywo\u0142ania. Podczas wywo\u0142ania funkcji obowi\u0105zuje nast\u0119puj\u0105cy przebieg:<\/p>\n<p><a href=\"https:\/\/pomoc.comarch.pl\/cee\/wp-content\/uploads\/2025\/12\/usluga4.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-41177\" src=\"https:\/\/pomoc.comarch.pl\/cee\/wp-content\/uploads\/2025\/12\/usluga4.png\" alt=\"\" width=\"415\" height=\"748\" srcset=\"https:\/\/pomoc.comarch.pl\/cee\/wp-content\/uploads\/2025\/12\/usluga4.png 415w, https:\/\/pomoc.comarch.pl\/cee\/wp-content\/uploads\/2025\/12\/usluga4-166x300.png 166w, https:\/\/pomoc.comarch.pl\/cee\/wp-content\/uploads\/2025\/12\/usluga4-28x50.png 28w, https:\/\/pomoc.comarch.pl\/cee\/wp-content\/uploads\/2025\/12\/usluga4-320x577.png 320w\" sizes=\"auto, (max-width: 415px) 100vw, 415px\" \/><\/a><\/p>\n<p data-start=\"3933\" data-end=\"4193\">Wywo\u0142anie funkcji us\u0142ugi tworzy obiekt <em>Request<\/em>, kt\u00f3ry przechowuje aktualny stan wywo\u0142ania. Po wys\u0142aniu wywo\u0142ania aplikacja oczekuje, czy instancja us\u0142ugi przetworzy \u017c\u0105danie w ramach timeoutu zapytania. Po zako\u0144czeniu instancja ustawia stan na <em>DONE<\/em>.<\/p>\n<p data-start=\"4195\" data-end=\"4681\">Je\u017celi instancja nie zd\u0105\u017cy w czasie timeoutu zapytania, aplikacja zwykle \u017c\u0105da przerwania przetwarzania. Je\u017celi instancja obs\u0142u\u017cy \u017c\u0105danie przerwania, stan przechodzi na <em>ABORTED<\/em>. Je\u017celi jednak instancja zdo\u0142a zako\u0144czy\u0107 przetwarzanie mimo \u017c\u0105dania przerwania, stan mo\u017ce przej\u015b\u0107 na <em>DONE<\/em>. Je\u017celi instancja nie zareaguje na \u017c\u0105danie przerwania w ramach timeoutu przerwania, stan przechodzi na <em>ABORT_TIMEOUT<\/em>. Timeout przerwania jest zwykle znacznie d\u0142u\u017cszy ni\u017c timeout zapytania.<\/p>\n<p data-start=\"4195\" data-end=\"4681\"><section class=\"document-alert-box example\"><div class=\"document-alert-title\">Przyk\u0142ad<\/div><div class=\"document-alert-content\">Timeout zapytania = 30 s, timeout przerwania = 5 min.<\/div><\/section><\/p>\n<p data-start=\"4195\" data-end=\"4681\">\n<p data-path-to-node=\"0\">Przej\u015bcia stan\u00f3w zlecenia przedstawiono na poni\u017cszym schemacie:<\/p>\n<p data-start=\"4752\" data-end=\"4772\"><a href=\"https:\/\/pomoc.comarch.pl\/cee\/wp-content\/uploads\/2025\/12\/Uslugi.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-41127\" src=\"https:\/\/pomoc.comarch.pl\/cee\/wp-content\/uploads\/2025\/12\/Uslugi.png\" alt=\"\" width=\"508\" height=\"258\" srcset=\"https:\/\/pomoc.comarch.pl\/cee\/wp-content\/uploads\/2025\/12\/Uslugi.png 508w, https:\/\/pomoc.comarch.pl\/cee\/wp-content\/uploads\/2025\/12\/Uslugi-300x152.png 300w, https:\/\/pomoc.comarch.pl\/cee\/wp-content\/uploads\/2025\/12\/Uslugi-50x25.png 50w, https:\/\/pomoc.comarch.pl\/cee\/wp-content\/uploads\/2025\/12\/Uslugi-320x163.png 320w\" sizes=\"auto, (max-width: 508px) 100vw, 508px\" \/><\/a><\/p>\n<p data-start=\"4752\" data-end=\"4772\">Poni\u017cej opis stan\u00f3w:<\/p>\n<p data-start=\"4776\" data-end=\"4920\"><strong data-start=\"4776\" data-end=\"4784\">SEND<\/strong> \u2013 zapytanie wys\u0142ane, ale nieodebrane przez \u017cadn\u0105 instancj\u0119.<br data-start=\"4844\" data-end=\"4847\" \/>Kolejne stany: <em>RECEIVED, SVM_NOT_AVAILABLE, SERVICE_NOT_AVAILABLE<\/em><\/p>\n<p data-start=\"4923\" data-end=\"5056\"><strong data-start=\"4923\" data-end=\"4935\">RECEIVED<\/strong> \u2013 zapytanie odebrane, ale nieprzypisane do kolejki przetwarzania.<br data-start=\"5001\" data-end=\"5004\" \/>Kolejne stany: <em>QUEUE_FULL, ASSIGNED, ABORTED<\/em><\/p>\n<p data-start=\"5059\" data-end=\"5163\"><strong data-start=\"5059\" data-end=\"5071\">ASSIGNED<\/strong> \u2013 zapytanie przypisane do kolejki przetwarzania.<br data-start=\"5120\" data-end=\"5123\" \/>Kolejne stany:<em> IN_PROCESS, ABORTED<\/em><\/p>\n<p data-start=\"5166\" data-end=\"5261\"><strong data-start=\"5166\" data-end=\"5180\">IN_PROCESS<\/strong> \u2013 rozpocz\u0119to przetwarzanie funkcji.<br data-start=\"5216\" data-end=\"5219\" \/>Kolejne stany: <em>DONE, ABORT_REQUESTED<\/em><\/p>\n<p data-start=\"5264\" data-end=\"5436\"><strong data-start=\"5264\" data-end=\"5272\">DONE<\/strong> \u2013 zapytanie przetworzone; ewentualne b\u0142\u0119dy przekazywane zale\u017cnie od implementacji. Stan niezale\u017cny od b\u0142\u0119d\u00f3w; mo\u017cliwe zmiany danych trwa\u0142ych.<br data-start=\"5414\" data-end=\"5417\" \/>Stan ko\u0144cowy.<\/p>\n<p data-start=\"5439\" data-end=\"5607\"><strong data-start=\"5439\" data-end=\"5458\">ABORT_REQUESTED<\/strong> \u2013 zapytanie by\u0142o w <em>IN_PROCES<\/em>S, ale aplikacja za\u017c\u0105da\u0142a przerwania; implementacja mo\u017ce przerwa\u0107 albo doko\u0144czy\u0107.<br data-start=\"5570\" data-end=\"5573\" \/>Kolejne stany: <em>DONE, ABORTED<\/em><\/p>\n<p data-start=\"5610\" data-end=\"5707\"><strong data-start=\"5610\" data-end=\"5621\">ABORTED<\/strong> \u2013 aplikacja za\u017c\u0105da\u0142a przerwania; nie zmieniono danych trwa\u0142ych.<br data-start=\"5685\" data-end=\"5688\" \/>Stan ko\u0144cowy.<\/p>\n<p data-start=\"5710\" data-end=\"5851\"><strong data-start=\"5710\" data-end=\"5724\">QUEUE_FULL<\/strong> \u2013 brak mo\u017cliwo\u015bci przetworzenia z powodu przepe\u0142nienia kolejek instancji; nie zmieniono danych trwa\u0142ych.<br data-start=\"5829\" data-end=\"5832\" \/>Stan ko\u0144cowy.<\/p>\n<p data-start=\"5854\" data-end=\"5999\"><strong data-start=\"5854\" data-end=\"5875\">SVM_NOT_AVAILABLE<\/strong> \u2013 wskazany serwer aplikacyjny nie dzia\u0142a albo nie ma instancji us\u0142ugi; nie zmieniono danych trwa\u0142ych.<br data-start=\"5977\" data-end=\"5980\" \/>Stan ko\u0144cowy.<\/p>\n<p data-start=\"6002\" data-end=\"6160\"><strong data-start=\"6002\" data-end=\"6027\">SERVICE_NOT_AVAILABLE<\/strong> \u2013 zapytanie wys\u0142ano na serwer, na kt\u00f3rym nie dzia\u0142a instancja wskazanej us\u0142ugi; nie zmieniono danych trwa\u0142ych.<br data-start=\"6138\" data-end=\"6141\" \/>Stan ko\u0144cowy.<\/p>\n<p data-start=\"6163\" data-end=\"6319\"><strong data-start=\"6163\" data-end=\"6180\">ABORT_TIMEOUT<\/strong> \u2013 aplikacja \u017c\u0105da przerwania, ale instancja nie zareagowa\u0142a w czasie; nie wiadomo, czy dane trwa\u0142e zosta\u0142y zmienione.<br data-start=\"6297\" data-end=\"6300\" \/>Stan ko\u0144cowy.<\/p>\n<h5 data-start=\"6326\" data-end=\"6353\" id=\"api-do-wywolania-funkcji\" ><span class=\"ez-toc-section\" id=\"API_do_wywolania_funkcji\"><\/span>API do wywo\u0142ania funkcji<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p data-start=\"6355\" data-end=\"6440\">Funkcje instancji us\u0142ugi wywo\u0142uje si\u0119 metod\u0105 <em>sendRequest<\/em> klasy <em>CisServiceManager<\/em>:<\/p>\n<p data-start=\"6355\" data-end=\"6440\">Request sendRequest(Class&lt;? extends CisService&gt; serviceClass,<\/p>\n<p data-start=\"6355\" data-end=\"6440\">String serviceId,<\/p>\n<p data-start=\"6355\" data-end=\"6440\">int action,<\/p>\n<p data-start=\"6355\" data-end=\"6440\">CisParameterList parameters)<\/p>\n<p data-start=\"7699\" data-end=\"7732\">Parametry <em>serviceClass<\/em> oraz <em>serviceId<\/em> jednoznacznie identyfikuj\u0105 serwis. Parametr <em>serviceClass<\/em> jest klas\u0105, kt\u00f3ra implementuje interfejs serwisu. serviceId jest dowolnym ci\u0105giem znak\u00f3w, kt\u00f3ry wraz z klas\u0105 dodatkowo identyfikuje serwis. Nazwa bazy danych OLTP jest cz\u0119sto cz\u0119\u015bci\u0105 serviceId. Parametr action identyfikuje wywo\u0142ywan\u0105 funkcj\u0119, a parametr parameters zawiera parametry funkcji. Wynikiem wywo\u0142ania funkcji jest request.<\/p>\n<p data-start=\"7699\" data-end=\"7732\"><section class=\"document-alert-box example\"><div class=\"document-alert-title\">Przyk\u0142ad<\/div><div class=\"document-alert-content\"><\/p>\n<p data-start=\"440\" data-end=\"489\">CisServiceManager srvm = env.getServiceManager();<\/p>\n<p data-start=\"491\" data-end=\"541\">CisDatabaseManager dbm = env.getDatabaseManager();<\/p>\n<p data-start=\"546\" data-end=\"566\">\/\/ wys\u0142anie requestu<\/p>\n<p data-start=\"568\" data-end=\"603\">CisServiceManager.Request request =<\/p>\n<p data-start=\"605\" data-end=\"622\">srvm.sendRequest(<\/p>\n<p data-start=\"624\" data-end=\"657\">WarehouseManagementService.class,<\/p>\n<p data-start=\"659\" data-end=\"700\">dbm.getDatabaseName(env.getDatabaseGuid),<\/p>\n<p data-start=\"702\" data-end=\"746\">WarehouseManagementService.XYZ, parameters);<\/p>\n<p data-start=\"751\" data-end=\"772\">\/\/ wykonanie requestu<\/p>\n<p data-start=\"774\" data-end=\"803\">if (!request.waitExecute()) {<\/p>\n<p data-start=\"805\" data-end=\"850\">mm.sendMessage(request.createStateMessage());<\/p>\n<p data-start=\"852\" data-end=\"853\">\u2026<\/p>\n<p data-start=\"855\" data-end=\"856\">}<\/p>\n<p data-start=\"855\" data-end=\"856\"><\/div><\/section><\/p>\n<p data-start=\"858\" data-end=\"991\">Opcjonalnie do metody <em>sendRequest<\/em> mo\u017cna przekaza\u0107 <em>Guid<\/em> serwera aplikacji, w kt\u00f3rego instancji serwisu ma zosta\u0107 wywo\u0142ana funkcja.<\/p>\n<p data-start=\"993\" data-end=\"1029\">Stan <em>requestu<\/em> mo\u017cna sprawdzi\u0107 metod\u0105<\/p>\n<ul>\n<li data-start=\"1031\" data-end=\"1047\"><em>short getState()<\/em><\/li>\n<\/ul>\n<p data-start=\"1049\" data-end=\"1105\">Stany s\u0105 sta\u0142ymi w klasie <em>CisServiceRequestState<\/em>. Metoda:<\/p>\n<ul>\n<li data-start=\"1107\" data-end=\"1128\">boolean isProcessed()<\/li>\n<\/ul>\n<p data-start=\"1130\" data-end=\"1282\">sprawdza, czy request znajduje si\u0119 w stanie ko\u0144cowym (<em>DONE, SVM_NOT_AVAILABLE, SERVICE_NOT_AVAILABLE, ABORTED, ABORT_TIMEOUT<\/em>). Wynik mo\u017cna pobra\u0107 metod\u0105<\/p>\n<p data-start=\"1284\" data-end=\"1312\"><em>CisParameterList getResult()<\/em><\/p>\n<p data-start=\"1314\" data-end=\"1372\">Jednak wynik jest zdefiniowany tylko w stanie DONE. Metod\u0105<\/p>\n<ul>\n<li data-start=\"1374\" data-end=\"1389\"><em>void waitDone()<\/em><\/li>\n<\/ul>\n<p data-start=\"1391\" data-end=\"1491\">Program aplikacyjny mo\u017ce czeka\u0107, a\u017c request osi\u0105gnie stan DONE lub up\u0142ynie timeout zapytania. Metoda<\/p>\n<ul>\n<li data-start=\"1493\" data-end=\"1505\"><em>void abort()<\/em><\/li>\n<\/ul>\n<p data-start=\"1507\" data-end=\"1572\">wysy\u0142a \u017c\u0105danie przerwania i czeka, a\u017c up\u0142ynie timeout przerwania.<\/p>\n<p data-start=\"1574\" data-end=\"1580\">Metoda:<\/p>\n<ul>\n<li data-start=\"1582\" data-end=\"1603\">boolean waitExecute()<\/li>\n<\/ul>\n<p data-start=\"1605\" data-end=\"1627\">jest skr\u00f3tem sekwencji<\/p>\n<p data-start=\"1629\" data-end=\"1640\">waitDone();<\/p>\n<p data-start=\"1642\" data-end=\"1663\">if (!isProcessed()) {<\/p>\n<p data-start=\"1665\" data-end=\"1673\">abort();<\/p>\n<p data-start=\"1675\" data-end=\"1676\">}<\/p>\n<p data-start=\"1678\" data-end=\"1727\">return getState() == CisServiceRequestState.DONE;<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">waitDone();\n\nif (!isProcessed()) {\n\nabort();\n\n}\n\nreturn getState() == CisServiceRequestState.DONE;<\/pre>\n<p data-start=\"1729\" data-end=\"1776\">i tym samym u\u0142atwia wywo\u0142ywanie funkcji. Metoda:<\/p>\n<p data-start=\"1778\" data-end=\"1809\"><em>CisMessage createStateMessage()<\/em><\/p>\n<p data-start=\"1811\" data-end=\"1868\" data-is-last-node=\"\" data-is-only-node=\"\">tworzy obiekt <em>CisMessage<\/em> dla aktualnego (b\u0142\u0119dnego) stanu.<\/p>\n<p data-start=\"7699\" data-end=\"7732\">[\/example]<\/p>\n<h5 data-start=\"7739\" data-end=\"7755\" id=\"api-dla-uslug\" ><span class=\"ez-toc-section\" id=\"API_dla_uslug\"><\/span>API dla us\u0142ug<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p data-start=\"7757\" data-end=\"7864\">Us\u0142uga sk\u0142ada si\u0119 zwykle z interfejsu, kt\u00f3ry kieruje zapytania do jednego lub wielu zada\u0144 przetwarzaj\u0105cych.<\/p>\n<h6 data-start=\"7866\" data-end=\"7892\" id=\"rejestracja-interfejsu\" ><span class=\"ez-toc-section\" id=\"Rejestracja_interfejsu\"><\/span>Rejestracja interfejsu<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<p data-start=\"7894\" data-end=\"8025\">Interfejs musi dziedziczy\u0107 po <em>CisService<\/em>. Podczas startu zadania przetwarzaj\u0105cego rejestruje si\u0119 go w <em>CisServiceManager<\/em> metod\u0105:<\/p>\n<p data-start=\"8027\" data-end=\"8142\"><code data-start=\"8027\" data-end=\"8142\">&lt;T extends CisService&gt; T register(<\/code><\/p>\n<p data-start=\"8027\" data-end=\"8142\"><code data-start=\"8027\" data-end=\"8142\">Class&lt;T&gt; serviceClass, <\/code><\/p>\n<p data-start=\"8027\" data-end=\"8142\"><code data-start=\"8027\" data-end=\"8142\">String serviceId, <\/code><\/p>\n<p data-start=\"8027\" data-end=\"8142\"><code data-start=\"8027\" data-end=\"8142\">CisServiceRequestProcessor processor);<\/code><\/p>\n<ul data-start=\"8144\" data-end=\"8296\">\n<li data-start=\"8144\" data-end=\"8195\"><em>serviceClass<\/em> i <em>serviceId<\/em> identyfikuj\u0105 us\u0142ug\u0119<\/li>\n<li data-start=\"8144\" data-end=\"8195\"><em>processor<\/em> identyfikuje zadanie przetwarzaj\u0105ce i musi implementowa\u0107 <em>CisServiceRequestProcessor<\/em>.<\/li>\n<\/ul>\n<p data-start=\"0\" data-end=\"493\">Wynikiem jest instancja interfejsu klasy serviceClass. Na jeden serwer aplikacyjny i serwis (identyfikowany przez <em>serviceClass<\/em> oraz <em>serviceId<\/em>) tworzona jest maksymalnie jedna instancja klasy <em>serviceClass<\/em>. Oznacza to, \u017ce je\u015bli wiele zada\u0144 przetwarzania na jednym serwerze aplikacyjnym zarejestruje ten sam serwis, to zostanie utworzona tylko jedna instancja interfejsu serwisu.<br data-start=\"376\" data-end=\"379\" \/>Je\u017celi zadanie przetwarzania nie obs\u0142uguje ju\u017c \u017cadnych dalszych zapyta\u0144, musi si\u0119 wyrejestrowa\u0107 za pomoc\u0105 metody<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">boolean deregister(\n\u00a0\u00a0CisService service,\n\u00a0\u00a0CisServiceRequestProcessor processor);<\/pre>\n<p data-start=\"605\" data-end=\"743\" data-is-last-node=\"\" data-is-only-node=\"\">Je\u017celi ostatni u\u017cytkownik, identyfikowany przez parametr <em>processor<\/em>, wyrejestruje si\u0119 z interfejsu, instancja interfejsu zostanie usuni\u0119ta.<\/p>\n<h6 data-start=\"8710\" data-end=\"8747\" id=\"struktura-interfejsu\" ><span class=\"ez-toc-section\" id=\"Struktura_interfejsu\"><\/span>Struktura interfejsu<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<p data-start=\"32\" data-end=\"195\">Podczas implementacji interfejsu przetwarzanie zapyta\u0144 mo\u017ce by\u0107 zaprojektowane w stosunkowo dowolny spos\u00f3b. Poni\u017cej opisano zalecan\u0105 \u015bcie\u017ck\u0119 przetwarzania zapyta\u0144.<\/p>\n<p data-start=\"197\" data-end=\"343\">Zadaniem interfejsu jest przekazywanie zapyta\u0144 do zada\u0144 przetwarzaj\u0105cych. Klasa <em>CisService <\/em>jest klas\u0105 bazow\u0105 wszystkich interfejs\u00f3w dla us\u0142ug.<\/p>\n<p data-start=\"345\" data-end=\"390\">Ka\u017cde zapytanie przechodzi nast\u0119puj\u0105ce etapy:<\/p>\n<p data-start=\"8749\" data-end=\"8783\">Zalecany przep\u0142yw obs\u0142ugi zapyta\u0144:<\/p>\n<ol data-start=\"8784\" data-end=\"9037\">\n<li data-start=\"8784\" data-end=\"8834\">\n<p data-start=\"8787\" data-end=\"8834\">aplikacja wysy\u0142a zapytanie do instancji us\u0142ugi<\/p>\n<\/li>\n<li data-start=\"8835\" data-end=\"8877\">\n<p data-start=\"8838\" data-end=\"8877\">zapytanie trafia do kolejki odbiorczej<\/p>\n<\/li>\n<li data-start=\"8878\" data-end=\"8934\">\n<p data-start=\"8881\" data-end=\"8934\">zapytanie jest przypisywane do kolejki przetwarzania<\/p>\n<\/li>\n<li data-start=\"8935\" data-end=\"9000\">\n<p data-start=\"8938\" data-end=\"9000\">zapytanie jest pobierane z kolejki przetwarzania i wykonywane<\/p>\n<\/li>\n<li data-start=\"9001\" data-end=\"9037\">\n<p data-start=\"9004\" data-end=\"9037\">wynik jest odsy\u0142any do aplikacji<\/p>\n<\/li>\n<\/ol>\n<div class=\"flex flex-col text-sm @w-xl\/main:pt-header-height pb-25\">\n<article class=\"text-token-text-primary w-full focus:outline-none [--shadow-height:45px] has-data-writing-block:pointer-events-none has-data-writing-block:-mt-(--shadow-height) has-data-writing-block:pt-(--shadow-height) [&amp;:has([data-writing-block])&gt;*]:pointer-events-auto scroll-mt-[calc(var(--header-height)+min(200px,max(70px,20svh)))]\" dir=\"auto\" tabindex=\"-1\" data-turn-id=\"request-WEB:3c1cb249-82d3-43cf-832c-74b7b0a200a9-4\" data-testid=\"conversation-turn-10\" data-scroll-anchor=\"true\" data-turn=\"assistant\">\n<div class=\"text-base my-auto mx-auto pb-10 [--thread-content-margin:--spacing(4)] @w-sm\/main:[--thread-content-margin:--spacing(6)] @w-lg\/main:[--thread-content-margin:--spacing(16)] px-(--thread-content-margin)\">\n<div class=\"[--thread-content-max-width:40rem] @w-lg\/main:[--thread-content-max-width:48rem] mx-auto max-w-(--thread-content-max-width) flex-1 group\/turn-messages focus-visible:outline-hidden relative flex w-full min-w-0 flex-col agent-turn\" tabindex=\"-1\">\n<div class=\"flex max-w-full flex-col grow\">\n<div class=\"min-h-8 text-message relative flex w-full flex-col items-end gap-2 text-start break-words whitespace-normal [.text-message+&amp;]:mt-1\" dir=\"auto\" data-message-author-role=\"assistant\" data-message-id=\"83928c83-9728-4791-8ebb-816babfc4274\" data-message-model-slug=\"gpt-5-2\">\n<div class=\"flex w-full flex-col gap-1 empty:hidden first:pt-[1px]\">\n<div class=\"markdown prose dark:prose-invert w-full break-words light markdown-new-styling\">\n<p data-start=\"0\" data-end=\"66\" data-is-last-node=\"\" data-is-only-node=\"\">Przebieg krok\u00f3w od 1 do 4 jest przedstawiony na poni\u017cszej grafice:<\/p>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"z-0 flex min-h-[46px] justify-start\"><a href=\"https:\/\/pomoc.comarch.pl\/cee\/wp-content\/uploads\/2025\/12\/Uslugi-grafika3.drawio.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-41670\" src=\"https:\/\/pomoc.comarch.pl\/cee\/wp-content\/uploads\/2025\/12\/Uslugi-grafika3.drawio.png\" alt=\"\" width=\"641\" height=\"481\" srcset=\"https:\/\/pomoc.comarch.pl\/cee\/wp-content\/uploads\/2025\/12\/Uslugi-grafika3.drawio.png 641w, https:\/\/pomoc.comarch.pl\/cee\/wp-content\/uploads\/2025\/12\/Uslugi-grafika3.drawio-300x225.png 300w, https:\/\/pomoc.comarch.pl\/cee\/wp-content\/uploads\/2025\/12\/Uslugi-grafika3.drawio-50x38.png 50w, https:\/\/pomoc.comarch.pl\/cee\/wp-content\/uploads\/2025\/12\/Uslugi-grafika3.drawio-600x450.png 600w, https:\/\/pomoc.comarch.pl\/cee\/wp-content\/uploads\/2025\/12\/Uslugi-grafika3.drawio-320x240.png 320w\" sizes=\"auto, (max-width: 641px) 100vw, 641px\" \/><\/a><\/div>\n<\/div>\n<\/div>\n<\/article>\n<\/div>\n<p>Ka\u017cda instancja <em>CisService<\/em> dzia\u0142a w osobnej sesji i nie ma domy\u015blnie przypisanej bazy OLTP, wi\u0119c transakcje na OLTP nale\u017cy otwiera\u0107 z u\u017cyciem GUID bazy OLTP.<\/p>\n<p>Metody <em>receive<\/em> i abort s\u0142u\u017c\u0105 do przypisywania i usuwania zapyta\u0144 z kolejki (dla kolejki wewn\u0119trznej):<\/p>\n<div class=\"contain-inline-size rounded-2xl corner-superellipse\/1.1 relative bg-token-sidebar-surface-primary\">\n<div class=\"overflow-y-auto p-4\" dir=\"ltr\"><code class=\"whitespace-pre! language-java\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title function_\">receive<\/span><span class=\"hljs-params\">(Request request)<\/span> {<br \/>\n<\/code><\/div>\n<div class=\"overflow-y-auto p-4\" dir=\"ltr\"><code class=\"whitespace-pre! language-java\">  offer(getInternalQueue(), request);<br \/>\n<\/code><\/div>\n<div class=\"overflow-y-auto p-4\" dir=\"ltr\"><code class=\"whitespace-pre! language-java\">}<br \/>\n<\/code><\/div>\n<div class=\"overflow-y-auto p-4\" dir=\"ltr\"><code class=\"whitespace-pre! language-java\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title function_\">abort<\/span><span class=\"hljs-params\">(Request request)<\/span> {<br \/>\n<\/code><\/div>\n<div class=\"overflow-y-auto p-4\" dir=\"ltr\"><code class=\"whitespace-pre! language-java\">  remove(getInternalQueue(), request);<br \/>\n}<br \/>\n<\/code><\/div>\n<\/div>\n<div class=\"flex flex-col text-sm @w-xl\/main:pt-header-height pb-25\">\n<article class=\"text-token-text-primary w-full focus:outline-none [--shadow-height:45px] has-data-writing-block:pointer-events-none has-data-writing-block:-mt-(--shadow-height) has-data-writing-block:pt-(--shadow-height) [&amp;:has([data-writing-block])&gt;*]:pointer-events-auto scroll-mt-[calc(var(--header-height)+min(200px,max(70px,20svh)))]\" dir=\"auto\" tabindex=\"-1\" data-turn-id=\"request-WEB:95bcae5c-4e2c-4cde-b71c-bf8bcddd5752-2\" data-testid=\"conversation-turn-6\" data-scroll-anchor=\"true\" data-turn=\"assistant\">\n<div class=\"text-base my-auto mx-auto pb-10 [--thread-content-margin:--spacing(4)] @w-sm\/main:[--thread-content-margin:--spacing(6)] @w-lg\/main:[--thread-content-margin:--spacing(16)] px-(--thread-content-margin)\">\n<div class=\"[--thread-content-max-width:40rem] @w-lg\/main:[--thread-content-max-width:48rem] mx-auto max-w-(--thread-content-max-width) flex-1 group\/turn-messages focus-visible:outline-hidden relative flex w-full min-w-0 flex-col agent-turn\" tabindex=\"-1\">\n<div class=\"flex max-w-full flex-col grow\">\n<div class=\"min-h-8 text-message relative flex w-full flex-col items-end gap-2 text-start break-words whitespace-normal [.text-message+&amp;]:mt-1\" dir=\"auto\" data-message-author-role=\"assistant\" data-message-id=\"3fff72f8-9ce2-4403-8c1e-62c83e5728f8\" data-message-model-slug=\"gpt-5-2\">\n<div class=\"flex w-full flex-col gap-1 empty:hidden first:pt-[1px]\">\n<div class=\"markdown prose dark:prose-invert w-full break-words light markdown-new-styling\">\n<p data-start=\"0\" data-end=\"109\" data-is-last-node=\"\" data-is-only-node=\"\">Zapytania z wewn\u0119trznej kolejki przetwarzania s\u0105 przetwarzane w klasie <em>CisService <\/em>w metodzie <em>process<\/em>.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<p class=\"z-0 flex min-h-[46px] justify-start\">Poniewa\u017c zapytania w wewn\u0119trznej kolejce przetwarzania s\u0105 obs\u0142ugiwane w tej samej sesji, w kt\u00f3rej wykonywana jest metoda <em>receive<\/em>, w czasie gdy jedno zapytanie jest przetwarzane w metodzie <em>process<\/em>, nie jest mo\u017cliwe przypisanie kolejnego zapytania w metodzie <em>receive<\/em> do kolejki przetwarzania. Oznacza to, \u017ce zapytania o d\u0142ugim czasie wykonania blokuj\u0105 interfejs, je\u017celi s\u0105 przetwarzane bezpo\u015brednio w jego ramach. Z tego wzgl\u0119du za po\u015brednictwem wewn\u0119trznej kolejki przetwarzania powinny by\u0107 obs\u0142ugiwane wy\u0142\u0105cznie zapytania o kr\u00f3tkim czasie wykonania. Zapytania o d\u0142ugim czasie wykonania powinny by\u0107 przypisywane do innej kolejki przetwarzania. Zapytania te s\u0105 nast\u0119pnie przetwarzane przez zadania przetwarzaj\u0105ce zarejestrowane jako <em>CisServiceRequestProcessor<\/em>.<\/p>\n<p>W wielu przypadkach zapytania maj\u0105 by\u0107 jednak przetwarzane w zadaniach przetwarzaj\u0105cych. W tym celu interfejs powinien udost\u0119pnia\u0107 dodatkow\u0105 kolejk\u0119 przetwarzania. Aby mo\u017cliwe by\u0142o zarz\u0105dzanie statusem zapytania, zapytanie musi zosta\u0107 przypisane do odpowiedniej kolejki przetwarzania w metodzie <em>receive <\/em>za pomoc\u0105 metody <em>offer<\/em>, natomiast w metodzie <em>abort <\/em>musi zosta\u0107 anulowane za pomoc\u0105 metody <em>remove<\/em>.<\/p>\n<div class=\"mt-3 w-full empty:hidden\">\n<div class=\"text-center\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/article>\n<\/div>\n<h6 data-start=\"9776\" data-end=\"9813\" id=\"przyklad-implementacji-interfejsu\" ><span class=\"ez-toc-section\" id=\"Przyklad_implementacji_interfejsu\"><\/span>Przyk\u0142ad implementacji interfejsu<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<p data-start=\"9815\" data-end=\"10009\">W poni\u017cszym przyk\u0142adzie wszystkie zapytania s\u0105 przypisywane do w\u0142asnej kolejki przetwarzania. Wewn\u0119trzna kolejka przetwarzania nie jest wykorzystywana.<\/p>\n<p data-start=\"9815\" data-end=\"10009\"><section class=\"document-alert-box example\"><div class=\"document-alert-title\">Przyk\u0142ad<\/div><div class=\"document-alert-content\"><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">class WarehouseManagementServiceService extends CisService {\n private BlockingQueue&lt;Request&gt; queue;\n\n public WarehouseManagementServiceService() {\n queue = new LinkedBlockingQueue&lt;Request&gt;();\n }\n\n @Overwrite\n public void receive(Request request) {\n offer(queue, request);\n }\n @Overwrite\n public void abort(Request request) {\n remove(queue, request);\n }\n public BlockingQueue&lt;Request&gt; getQueue() {\n return queue;\n }\n}<\/pre>\n<p data-start=\"9815\" data-end=\"10009\"><\/div><\/section><\/p>\n<h6 data-start=\"10011\" data-end=\"10053\" id=\"implementacja-zadania-przetwarzajacego\" ><span class=\"ez-toc-section\" id=\"Implementacja_zadania_przetwarzajacego\"><\/span>Implementacja zadania przetwarzaj\u0105cego<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<p data-start=\"10055\" data-end=\"10078\">Poni\u017cszy schemat przedstawia schematyczny przep\u0142yw w ramach zlecenia przetwarzania, kt\u00f3re przetwarza zapytania us\u0142ugi.<\/p>\n<p data-start=\"10055\" data-end=\"10078\"><a href=\"https:\/\/pomoc.comarch.pl\/cee\/wp-content\/uploads\/2025\/12\/Uslugi-grafika4-1.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-41666\" src=\"https:\/\/pomoc.comarch.pl\/cee\/wp-content\/uploads\/2025\/12\/Uslugi-grafika4-1.png\" alt=\"\" width=\"678\" height=\"751\" srcset=\"https:\/\/pomoc.comarch.pl\/cee\/wp-content\/uploads\/2025\/12\/Uslugi-grafika4-1.png 678w, https:\/\/pomoc.comarch.pl\/cee\/wp-content\/uploads\/2025\/12\/Uslugi-grafika4-1-271x300.png 271w, https:\/\/pomoc.comarch.pl\/cee\/wp-content\/uploads\/2025\/12\/Uslugi-grafika4-1-45x50.png 45w, https:\/\/pomoc.comarch.pl\/cee\/wp-content\/uploads\/2025\/12\/Uslugi-grafika4-1-600x665.png 600w, https:\/\/pomoc.comarch.pl\/cee\/wp-content\/uploads\/2025\/12\/Uslugi-grafika4-1-320x354.png 320w\" sizes=\"auto, (max-width: 678px) 100vw, 678px\" \/><\/a><br \/>\nZlecenia przetwarzania:<\/p>\n<ul data-start=\"10079\" data-end=\"10422\">\n<li data-start=\"10079\" data-end=\"10110\">\n<p data-start=\"10081\" data-end=\"10110\">rejestruje u\u017cycie interfejsu<\/p>\n<\/li>\n<li data-start=\"10111\" data-end=\"10158\">\n<p data-start=\"10113\" data-end=\"10158\">dzia\u0142a w p\u0119tli do chwili \u017c\u0105dania zako\u0144czenia<\/p>\n<\/li>\n<li data-start=\"10159\" data-end=\"10211\">\n<p data-start=\"10161\" data-end=\"10211\">cyklicznie sprawdza, czy wymagane jest przerwanie<\/p>\n<\/li>\n<li data-start=\"10212\" data-end=\"10284\">\n<p data-start=\"10214\" data-end=\"10284\">przed przetwarzaniem sprawdza, czy <em>Request<\/em> nie zosta\u0142 ju\u017c anulowany<\/p>\n<\/li>\n<li data-start=\"10285\" data-end=\"10383\">\n<p data-start=\"10287\" data-end=\"10383\">opcjonalnie sprawdza podczas przetwarzania, czy istnieje \u017c\u0105danie przerwania <em>(ABORT_REQUESTED)<\/em><\/p>\n<\/li>\n<li data-start=\"10384\" data-end=\"10422\">\n<p data-start=\"10386\" data-end=\"10422\">po zako\u0144czeniu ustawia wynik i stan<\/p>\n<\/li>\n<\/ul>\n<section class=\"document-alert-box example\"><div class=\"document-alert-title\">Przyk\u0142ad<\/div><div class=\"document-alert-content\"><\/p>\n<p>Poni\u017cszy przyk\u0142ad przedstawia implementacj\u0119 zlecenia przetwarzania dla obs\u0142ugi zapytania\u00a0us\u0142ugi.<\/p>\n<p>class WarehouseManagementService extends CisBatchApplication<\/p>\n<p>implements CisServiceRequestProcessor {<\/p>\n<p>public void run(int action, parameters) {<\/p>\n<p>WarehouseManagementServiceService service =<\/p>\n<p>svrm.register(WarehouseManagementServiceService.class,<\/p>\n<p>dbm.getDatabaseName(env.getDatabaseGuid()),<\/p>\n<p>this);<\/p>\n<p>try {<\/p>\n<p>while (! env.isToBeRemoved()) {<\/p>\n<p>CisService.Request request =<\/p>\n<p>service.getQueue().poll(TIMEOUT);<\/p>\n<p>if (request==null) {<\/p>\n<p>continue;<\/p>\n<p>}<\/p>\n<p>process(request);<\/p>\n<p>}<\/p>\n<p>} finally {<\/p>\n<p>svrm.deregister(service,this);<\/p>\n<p>}<\/p>\n<p>}<\/p>\n<p>public void process(CisService.Request request) {<\/p>\n<p>\/\/ Zapytanie jest przyjmowane do przetwarzania i jest sprawdzane, czy zapytanie ma by\u0107 jeszcze \/\/ przetwarzane.<\/p>\n<p>if (! request.setState(CisServiceRequestState.IN_PROCESS)) {<\/p>\n<p>return;<\/p>\n<p>}<\/p>\n<p>try {<\/p>\n<p>\u2026<\/p>\n<p>\/\/ Opcjonalne sprawdzenie, czy wyst\u0119puje \u017c\u0105danie anulowania.<\/p>\n<p>if (request.getState()==<\/p>\n<p>CisServiceRequestState.ABORT_REQUESTED) {<\/p>\n<p>request.setState(CisServiceRequestState.ABORTED);<\/p>\n<p>return;<\/p>\n<p>}<\/p>\n<p>\u2026<\/p>\n<p>} finally {<\/p>\n<p>\/\/ Je\u017celi zapytanie nie zosta\u0142o anulowane, ustawiany jest wynik zapytania.<\/p>\n<p>if (! request.isProcessed()) {<\/p>\n<p>request.setResult(result);<\/p>\n<p>request.setState(CisServiceRequestState.DONE);<\/p>\n<p>}<\/p>\n<p>}<\/p>\n<p>}<\/p>\n<p><\/div><\/section>\n<p data-start=\"10424\" data-end=\"10781\">Blok <em>try\/finally<\/em> wewn\u0105trz metody <em>process<\/em> musi by\u0107 w ka\u017cdym serwisie zaimplementowany dok\u0142adnie w taki sam spos\u00f3b. Sprawdzenie <em>ABORT_REQUESTED<\/em> jest jednak opcjonalne. Status <em>ABORT<\/em> mo\u017ce by\u0107 ustawiony wy\u0142\u0105cznie w przypadku zg\u0142oszenia \u017c\u0105dania przerwania dla <em>requestu<\/em>. Je\u017celi nie ma \u017c\u0105dania przerwania, to status \u2013 niezale\u017cnie od tego, czy podczas przetwarzania \u017c\u0105dania wyst\u0105pi\u0142y b\u0142\u0119dy \u2013 musi zosta\u0107 ustawiony na <em>DONE<\/em>. Serwis jest sam odpowiedzialny za prezentacj\u0119 stan\u00f3w b\u0142\u0119d\u00f3w w wyniku \u017c\u0105dania (np. poprzez status b\u0142\u0119du OK, ERROR1, ERROR2, \u2026).<\/p>\n<p data-start=\"10816\" data-end=\"10977\" data-is-last-node=\"\" data-is-only-node=\"\">Narz\u0119dzie <em>dspsrvins<\/em> umo\u017cliwia wy\u015bwietlenie instancji us\u0142ug w systemie. Szczeg\u00f3\u0142y znajduj\u0105 si\u0119 w artykule <a title=\"Wy\u015bwietlenie instancji us\u0142ug (dspsrvins)\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/wyswietlenie-instancji-uslug-dspsrvins\/\"><em>Wy\u015bwietlenie instancji us\u0142ug (dspsrvins)<\/em><\/a>.<\/p>\n","protected":false},"author":32,"comment_status":"closed","ping_status":"closed","template":"","format":"standard","meta":{"footnotes":""},"class_list":["post-9627","ht_kb","type-ht_kb","status-publish","format-standard","hentry","ht_kb_category-interfejsy-techniczne"],"_links":{"self":[{"href":"https:\/\/pomoc.comarch.pl\/cee\/index.php\/wp-json\/wp\/v2\/ht_kb\/9627","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/pomoc.comarch.pl\/cee\/index.php\/wp-json\/wp\/v2\/ht_kb"}],"about":[{"href":"https:\/\/pomoc.comarch.pl\/cee\/index.php\/wp-json\/wp\/v2\/types\/ht_kb"}],"author":[{"embeddable":true,"href":"https:\/\/pomoc.comarch.pl\/cee\/index.php\/wp-json\/wp\/v2\/users\/32"}],"replies":[{"embeddable":true,"href":"https:\/\/pomoc.comarch.pl\/cee\/index.php\/wp-json\/wp\/v2\/comments?post=9627"}],"version-history":[{"count":19,"href":"https:\/\/pomoc.comarch.pl\/cee\/index.php\/wp-json\/wp\/v2\/ht_kb\/9627\/revisions"}],"predecessor-version":[{"id":41672,"href":"https:\/\/pomoc.comarch.pl\/cee\/index.php\/wp-json\/wp\/v2\/ht_kb\/9627\/revisions\/41672"}],"wp:attachment":[{"href":"https:\/\/pomoc.comarch.pl\/cee\/index.php\/wp-json\/wp\/v2\/media?parent=9627"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}