Rafał Gajewski

G2Soft Sp. z o.o.

Dedykowane Aplikacje i Systemy Informatyczne
Programy na Zamówienie

Kilka słów o intergacji z ePUAP-em

Kto korzystał lub przynajmniej próbował złożyć coś przez z ePUAPu ten wie, że ergonomią to on nie grzeszy. Podobnie wygląda sprawa przy próbie integracji własnego systemu z ePUAPem. Dokumantacja jest bardzo ogólna. Ciekawa sprawa jest z przykładami które kiedyś były oficjalnie dostępne, a teraz ich nie ma. Jeśli pomimo to nie zrazisz się, to czeka Cię niespodzianka: wersja testowa już nie istnieje. Była ale już jej nie ma. Może dlatego, że była "trochę" inna niż produkcyjna.

Zatem pozostaje budowanie integracji na żywym systemie ministerstwa..

Wydajność

Jakiś czas temu, w czasach gdy ePUAP zalecał tworzenie oddzielnych skrytek do każdej budowanej usługi, a sam ePUAP nie był jeszcze oficjalnie nakazany do komunikacji między urzędami w niektórych typach spraw, jego wydajność była, powiedzmy, do zaakceptowania. Natomiast teraz jeśli ktoś miał kilkadziesiąt usług, do każdej podpiętą skrytę i monitorował to w trybie pull co 5min, to (poza tym, że ktoś z ePUAPu dzwonił i prosił by rzadziej się łączyć) po sprawdzeniu pierwszych 4-5 skrytek ePUAP wysiadał i odpowiadał błędem. Inny bład był taki, że czasami skrytka się blokowała, wyrzucała błąd i nie można było z niej nic odebrać.

Jak sobie z tym poradziłem? Oprócz wydłużenia timera odpytywania do 20min i przepięcia tych skrytek które można było - do jednej zbiorczej skrytki, w prosty sposób: otóż mieszałem losowo tablicę skrytek. Dzięki temu pierwsze, losowe 3-4 skrytki były zbierane bez problemu. A jeśli jedna się blokowała, to w następnym przebiegu losowane były inne. Dzięki całe odbieranie nie było blokowane.

Oczywiście, w przypadku większej ilości skrytek i dłuższego timera, zamiasta losowania (bo jest większa szansa, że w ciągy 24h wszystkich nie wolosujemy) należy już zapamiętywać która skrytka była ostatnio odpytana i przy następnym ticku timera zaczynać od skrytki ostatnia+1.

Przykład

Przykład mieszania dwóch list w C#

// pomieszaj pozycje na dwóch listach jednocześnie
private void RandomizeOrder2Lists(ref List lstAdresySkrytek, ref List lstNazwySkrytek)
{
List lstAdresySkrytekOut = new List();
List lstNazwySkrytekOut = new List();

// lista numerków
List numerki = new List();
for (int idx = 0; idx < lstAdresySkrytek.Count; idx++)
numerki.Add(idx);

// mieszkanie numerków
var shuffledcards = numerki.OrderBy(a => Guid.NewGuid());
var numerkiRnd = shuffledcards.ToArray();

// przestawienie list
for (int idx = 0; idx < lstAdresySkrytek.Count; idx++)
{
lstAdresySkrytekOut.Add(lstAdresySkrytek[numerkiRnd[idx]]);
lstNazwySkrytekOut.Add(lstNazwySkrytek[numerkiRnd[idx]]);
}

// zwrócenie pomieszanych list
lstAdresySkrytek = lstAdresySkrytekOut;
lstNazwySkrytek = lstNazwySkrytekOut;
}
Zamiast dwóch list można też użyć jednego obiektu, ewentualnie skorzystać z tablicy dwuwymiarowej.
Wszystko zależy od formatu danych wejściowych lub zasadności dokonywania konwersji typów.