{"id":9637,"date":"2025-11-17T08:17:24","date_gmt":"2025-11-17T07:17:24","guid":{"rendered":"https:\/\/pomoc.comarch.pl\/cee\/?post_type=ht_kb&#038;p=9637"},"modified":"2025-11-17T08:20:35","modified_gmt":"2025-11-17T07:20:35","slug":"menedzer-schematow-numeracji","status":"publish","type":"ht_kb","link":"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/menedzer-schematow-numeracji\/","title":{"rendered":"Mened\u017cer schemat\u00f3w numeracji"},"content":{"rendered":"<h3 id=\"wprowadzenie\" >Wprowadzenie<\/h3>\n<p>W artykule opisano podstawow\u0105 procedur\u0119 pobierania numer\u00f3w dla schemat\u00f3w numeracji oraz unikalnych licznik\u00f3w przy u\u017cyciu mened\u017cera schemat\u00f3w numer\u00f3w.<\/p>\n<h3 id=\"grupa-docelowa\" >Grupa docelowa<\/h3>\n<ul>\n<li>Programi\u015bci aplikacji<\/li>\n<li>Administratorzy systemu<\/li>\n<li>Konsultanci techniczni<\/li>\n<\/ul>\n<h3 id=\"definicje\" >Definicje<\/h3>\n<p><strong>Mened\u017cer schemat\u00f3w numeracji<\/strong> &#8211; to interfejs programistyczny dla deweloper\u00f3w, kt\u00f3rzy chc\u0105 u\u017cywa\u0107 schemat\u00f3w numeracji i unikalnych licznik\u00f3w w swoich aplikacjach. S\u0142u\u017cy do okre\u015blania nast\u0119pnego wolnego numeru dla schemat\u00f3w numeracji i unikalnych licznik\u00f3w.<\/p>\n<p><strong>Unikalny licznik<\/strong> &#8211; to licznik, kt\u00f3rego aplikacja mo\u017ce u\u017cywa\u0107 do generowania numer\u00f3w identyfikacyjnych typu danych long. U\u017cycie licznik\u00f3w unikalnych jest zale\u017cne od aplikacji.<\/p>\n<p><strong>Us\u0142uga schemat\u00f3w numeracji<\/strong> &#8211; pobiera numery dla schemat\u00f3w numeracji i licznik\u00f3w unikalnych. Jest u\u017cywana przez mened\u017cera schemat\u00f3w numeracji i dzia\u0142a na serwerze komunikat\u00f3w.<\/p>\n<p><strong>W\u0142a\u015bciwo\u015b\u0107 rosn\u0105ca <\/strong>&#8211; wszystkie liczby przypisane do schemat\u00f3w numeracji lub unikatowego licznika s\u0105 trwa\u0142e w odniesieniu do ich kolejno\u015bci, tj. \u017cadna wi\u0119ksza liczba nie jest zapisywana wcze\u015bniej ni\u017c mniejsza liczba w odniesieniu do okre\u015blonego punktu w czasie.<\/p>\n<p><strong>W\u0142a\u015bciwo\u015b\u0107 ci\u0105g\u0142a <\/strong>&#8211; wszystkie liczby schematu numeracji lub unikalne liczniki przechowywane w bazie danych s\u0105 kolejne, bez luk. Ta w\u0142a\u015bciwo\u015b\u0107 domy\u015blnie spe\u0142nia w\u0142a\u015bciwo\u015b\u0107 <em>rosn\u0105ca<\/em>.<\/p>\n<h3 id=\"pobieranie-numerow\" >Pobieranie numer\u00f3w<\/h3>\n<p>Mened\u017cer schemat\u00f3w numeracji jest u\u017cywany do pobierania nowych numer\u00f3w dla schemat\u00f3w numeracji i unikalnych licznik\u00f3w. Mened\u017cer schemat\u00f3w numeracji u\u017cywa us\u0142ugi schemat\u00f3w numeracji serwera komunikat\u00f3w do pobierania numer\u00f3w. Us\u0142uga schemat\u00f3w numeracji pobiera numery blokowo, wi\u0119c pobranie numeru za pomoc\u0105 mened\u017cera schemat\u00f3w numeracji zwykle nie wymaga ani dost\u0119pu do bazy danych, ani wy\u0142\u0105cznych blokad Persistence service na liczniku schemat\u00f3w numeracji.<\/p>\n<h4 id=\"dostep-do-menedzera-schematow-numeracji\" >Dost\u0119p do mened\u017cera schemat\u00f3w numeracji<\/h4>\n<p>Aplikacja mo\u017ce uzyska\u0107 dost\u0119p do mened\u017cera schemat\u00f3w numeracji za po\u015brednictwem \u015brodowiska:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">com.cisag.pgm.appserver.CisNumberRangeManager nrm= CisEnviron-ment.getInstance().getNumberRangeManager();<\/pre>\n<p>Interfejs com.cisag.pgm.appserver.CisNumberRangeManager zapewnia wymagane metody do pobierania liczb dla schemat\u00f3w i licznik\u00f3w unikalnych.<\/p>\n<h4 id=\"schematy-numeracji\" >Schematy numeracji<\/h4>\n<p>Mened\u017cer schemat\u00f3w numeracji mo\u017ce by\u0107 u\u017cywany tylko do pobierania numer\u00f3w, kt\u00f3re nie musz\u0105 spe\u0142nia\u0107 w\u0142a\u015bciwo\u015bci <i>ci\u0105g\u0142ej<\/i> i <i>rosn\u0105cej<\/i>. W takim przypadku m\u00f3wi si\u0119 o jawnym pobieraniu numer\u00f3w. Je\u015bli schemat numeracji musi spe\u0142nia\u0107 w\u0142a\u015bciwo\u015bci <i>ci\u0105g\u0142ej<\/i> lub <i>rosn\u0105cej<\/i>, jego numery musz\u0105 by\u0107 pobierane niejawnie przez Persistence service podczas zapisywania Instancji Obiektu Biznesowego. Niejawne pobieranie numer\u00f3w opisano w artykule <a title=\"Persistence service\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/persistence-service\/\">Persistence service.<\/a><\/p>\n<p>Metoda <em>getNextNumber()<\/em> mo\u017ce by\u0107 u\u017cyta do okre\u015blenia nast\u0119pnego wolnego numeru dla schematu numeracji przekazanego jako argument.<\/p>\n<p>Nast\u0119pny wolny numer pozycji mo\u017cna okre\u015bli\u0107 za pomoc\u0105 metody <em>getNextDetailNumber()<\/em>.<\/p>\n<h4 id=\"unikalny-licznik\" >Unikalny licznik<\/h4>\n<p>Za po\u015brednictwem mened\u017cera schemat\u00f3w numeracji mog\u0105 by\u0107 pobierane tylko numery dla unikalnych licznik\u00f3w, kt\u00f3re nie musz\u0105 spe\u0142nia\u0107 w\u0142a\u015bciwo\u015bci ci\u0105g\u0142ej i rosn\u0105cej. Oferuje on jednak mo\u017cliwo\u015b\u0107 zapewnienia, \u017ce unikalny licznik spe\u0142nia w\u0142a\u015bciwo\u015b\u0107 rosn\u0105c\u0105 w okre\u015blonym momencie. Wszystkie numery pobrane do tego momentu s\u0105 albo utrwalone, albo odrzucone.<\/p>\n<p>Metoda:<\/p>\n<ul>\n<li>getNextUniqueCounter() mo\u017ce by\u0107 u\u017cyta do okre\u015blenia nast\u0119pnego wolnego numeru dla unikalnego identyfikatora licznika przekazanego jako argument.<\/li>\n<li>getNextUniqueCounterBlock() mo\u017ce by\u0107 u\u017cyta do okre\u015blenia nast\u0119pnych n wolnych numer\u00f3w dla unikalnego identyfikatora licznika przekazanego jako argument.<\/li>\n<li>getLastUniqueCounter() mo\u017ce by\u0107 u\u017cyta do okre\u015blenia ostatniego pobranego numeru dla unikalnego identyfikatora licznika przekazanego jako argument.<\/li>\n<\/ul>\n<h5 id=\"zapewnienie-wlasciwosci-rosnacej\" >Zapewnienie w\u0142a\u015bciwo\u015bci <i>rosn\u0105cej<\/i><\/h5>\n<p>W celu umo\u017cliwienia w\u0142a\u015bciwo\u015bci rosn\u0105cej, mened\u017cer schemat\u00f3w numeracji u\u017cywa blokad Persistence service podczas pobierania numer\u00f3w. Dla ka\u017cdego inikalnego licznika istnieje inny obiekt blokuj\u0105cy, dla kt\u00f3rego \u017c\u0105dane s\u0105 blokady Persistence service. Z tego powodu, aby zapewni\u0107 w\u0142a\u015bciwo\u015b\u0107 rosn\u0105c\u0105, wywo\u0142anie pobrania nowego numeru lub nowego bloku numer\u00f3w musi nast\u0105pi\u0107 w ramach transakcji, w kt\u00f3rej zapisywana jest r\u00f3wnie\u017c instancja obiektu biznesowego z unikalnym licznikiem.<\/p>\n<p>Wywo\u0142uj\u0105c metody getNextUniqueCounter() lub getNextUniqueCounterBlock(), blokada odczytu jest utrzymywana na obiekcie blokady. Jest ona niejawnie anulowana, gdy transakcja najwy\u017cszego poziomu, w kt\u00f3rej wykonano wywo\u0142anie, zostanie zako\u0144czona. Je\u015bli nie ma kontekstu transakcji, gdy wywo\u0142ywane s\u0105 metody, blokada odczytu jest utrzymywana tylko podczas wywo\u0142ywania metody.<\/p>\n<p>Metoda getLastUniqueCounter() mo\u017ce by\u0107 u\u017cyta do zapytania o ostatni przypisany numer. W ramach tej metody wy\u0142\u0105czna blokada obiektu blokady jest wymagana w oddzielnej transakcji najwy\u017cszego poziomu. Jest ona przyznawana tylko wtedy, gdy nie ma wi\u0119cej blokad odczytu na obiekcie blokady. Oznacza to, \u017ce wszystkie pobrane numery musz\u0105 zosta\u0107 przetworzone. W\u0142a\u015bciwo\u015b\u0107 <em>rosn\u0105ca<\/em> jest zatem spe\u0142niona a\u017c do zwr\u00f3conego numeru; wszystkie mniejsze liczby s\u0105 albo trwa\u0142e, albo reprezentuj\u0105 luki. Zazwyczaj zadanie przetwarzania lub aplikacja reorganizacji okre\u015bli, do kt\u00f3rego numeru przetwarzanie powinno odbywa\u0107 si\u0119 w ten spos\u00f3b po uruchomieniu.<\/p>\n<h5 id=\"limity-czasu-blokady\" >Limity czasu blokady<\/h5>\n<p>Dop\u00f3ki blokady odczytu s\u0105 utrzymywane, nie mo\u017cna przyzna\u0107 blokady wy\u0142\u0105cznej, a w konsekwencji r\u00f3wnie\u017c blokad odczytu \u017c\u0105danych p\u00f3\u017aniej. Z tego powodu metody pobierania nowych numer\u00f3w powinny by\u0107 wywo\u0142ywane w ramach transakcji najwy\u017cszego poziomu tak p\u00f3\u017ano, jak to mo\u017cliwe, aby blokady odczytu trwa\u0142y jak najkr\u00f3cej.<\/p>\n<p>Programista musi obs\u0142u\u017cy\u0107 wszelkie wyj\u0105tki LockExceptions, kt\u00f3re wyst\u0105pi\u0105 z powodu przekroczenia limitu czasu blokady. Zalecan\u0105 procedur\u0105 jest kilkukrotne powt\u00f3rzenie odpowiedniego wywo\u0142ania metody.<\/p>\n<h5 id=\"dodawanie-nowego-unikalnego-licznika\" >Dodawanie nowego unikalnego licznika<\/h5>\n<p>Je\u015bli ma zosta\u0107 wprowadzony nowy unikalny typ licznika, nale\u017cy rozszerzy\u0107 ValueSet <em>com.cisag.app.general.CounterType<\/em>. Metoda <em>isValidCounterType()<\/em> klasy <em>com.cisag.app.general.log.NumberRangeLogic<\/em> sprawdza, czy okre\u015blony typ licznika unikatowego, dla kt\u00f3rego ma zosta\u0107 wylosowana liczba, jest prawid\u0142owy. Kontrola ta musi zosta\u0107 dostosowana tak, aby nowy unikalny typ licznika by\u0142 rozpoznawany jako prawid\u0142owy.<\/p>\n<p>Nale\u017cy post\u0119powa\u0107 w nast\u0119puj\u0105cy spos\u00f3b:<\/p>\n<ul>\n<li>Nale\u017cy utworzy\u0107 nowy obiekt deweloperski Java class<\/li>\n<li>Aby odpowiednia Klasa Java zosta\u0142a u\u017cyta przez system, nale\u017cy w polu<em> Zast\u0105piona klasa Java<\/em> tego obiektu deweloperskiego wpisa\u0107 klas\u0119 <em>com.cisag.app.general.log.NumberRangeLogic<\/em>.<\/li>\n<li>Nowa Klasa Java musi dziedziczy\u0107 z <em>klasy com.cisag.app.general.log.NumberRangeLogic<\/em>, w kt\u00f3rej jest metoda <em>adaptableIsValidUniqueCounterType()<\/em>.<\/li>\n<li>W tej metodzie nale\u017cy zaimplementowa\u0107 sprawdzenie dodanego typu unikalnego licznika. Je\u015bli jest to nowy typ, metoda musi zwr\u00f3ci\u0107 <em>true<\/em>, w przeciwnym razie <em>false<\/em>. Metoda <em>adaptableIsValidUniqueCounterType()<\/em> jest wywo\u0142ywana przez metod\u0119 <em>isValidCounterType()<\/em> klasy bazowej do sprawdzania typu.<\/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<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">public class NumberRangeLogicAdapted extends\n\ncom.cisag.app.general.log.NumberRangeLogic {\n\n\n\n\npublic boolean adaptableIsValidUniqueCounterType(short type) {\n\nswitch (type) {\n\ncase CounterType.NEW_UNIQUE_COUNTER:\n\nreturn true;\n\ndefault:\n\nreturn false;\n\n}\n\n}<\/pre>\n<p><\/div><\/section>\n<ul>\n<li>Aby klasa pochodna zosta\u0142a u\u017cyta przez system, musi zosta\u0107 zarejestrowana. Nast\u0119puje to w klasie <i>com.cisag.app.Replacements<\/i>. W metodzie <em>register () <\/em>musi zosta\u0107 okre\u015blone, \u017ce klasa <em>com.cisag.app.general.log.NumberRangeLogic<\/em>\u00a0jest zast\u0119powana przez klas\u0119 pochodn\u0105.<\/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<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">public static void register(Map replacements) {\n\n...\n\nreplacements.put(\"com.cisag.app.general.log.NumberRangeLogic\",\n\n\"com.&lt;Prefix&gt;.app.general.log.NumberRangeLogicAdapted\");\n\n}<\/pre>\n<p><\/div><\/section>\n<h4 id=\"usluga-schematow-numeracji\" >Us\u0142uga schemat\u00f3w numeracji<\/h4>\n<p>Na serwerze komunikat\u00f3w dzia\u0142a us\u0142uga schemat\u00f3w numeracji, kt\u00f3ra dostarcza nast\u0119pny wolny numer dla funkcji numeracja schematu numeracji lub unikalnego licznika. Sama us\u0142uga pobiera numery blokowo dla ka\u017cdego schematu numeracji lub unikalnego licznika, tzn. okre\u015blany jest blok numer\u00f3w, a jego najwi\u0119kszy numer jest zapisywany w odpowiednim liczniku. Wolne numery bloku s\u0105 przechowywane w pami\u0119ci g\u0142\u00f3wnej. Z tego nast\u0119pnie zwracany jest najmniejszy nieprzypisany numer na \u017c\u0105danie nowego numeru przez mened\u017cera schemat\u00f3w numeracji. Dzi\u0119ki utrzymywaniu dodatkowych numer\u00f3w w pami\u0119ci g\u0142\u00f3wnej, nowy numer jest zazwyczaj okre\u015blany bez dost\u0119pu do bazy danych.<\/p>\n<p>Je\u015bli serwer komunikat\u00f3w zostanie nieprawid\u0142owo zamkni\u0119ty, nieprzypisane numery przechowywane w pami\u0119ci g\u0142\u00f3wnej zostan\u0105 utracone.<\/p>\n<p>Je\u015bli serwer komunikat\u00f3w zostanie zamkni\u0119ty prawid\u0142owo, nieprzypisane numery nie zostan\u0105 utracone. Najwi\u0119kszy numer przechowywany w bazie danych jest korygowany do ostatniego przypisanego numeru bloku w pami\u0119ci g\u0142\u00f3wnej. Je\u015bli licznik schemat\u00f3w numeracji lub unikalny licznik zosta\u0142 zmieniony przez inne logiki poza us\u0142ug\u0105 zakresu numer\u00f3w, numery nie mog\u0105 zosta\u0107 przywr\u00f3cone.<\/p>\n","protected":false},"author":29,"comment_status":"closed","ping_status":"closed","template":"","format":"standard","meta":{"footnotes":""},"class_list":["post-9637","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\/9637","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\/29"}],"replies":[{"embeddable":true,"href":"https:\/\/pomoc.comarch.pl\/cee\/index.php\/wp-json\/wp\/v2\/comments?post=9637"}],"version-history":[{"count":5,"href":"https:\/\/pomoc.comarch.pl\/cee\/index.php\/wp-json\/wp\/v2\/ht_kb\/9637\/revisions"}],"predecessor-version":[{"id":40046,"href":"https:\/\/pomoc.comarch.pl\/cee\/index.php\/wp-json\/wp\/v2\/ht_kb\/9637\/revisions\/40046"}],"wp:attachment":[{"href":"https:\/\/pomoc.comarch.pl\/cee\/index.php\/wp-json\/wp\/v2\/media?parent=9637"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}