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..
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 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.