Inicjalizacja listy w @postConstruct i późniejszy dostęp do niej

0

Dzień dobry,
Temat dotyczy spring boot.
Potrzebuję w @PostConstruct zainicjować zmienną a dokładnie listę ArrayList abym potem mógł mieć do niej dostęp z każdego miejsca w programie.
Czy statyczna zmienna to dobre rozwiązanie?
Jak to najlepiej zrobić?

14

Statyczna zmienna inicjalizowana w @PostConstruct. Zaraz raka dostanę. Na co ci to? Po co ci to? Co chcesz tym rozwiązać?

4
  1. PostConstruct odnosi się do akcji po utworzeniu obiektu więc do static pasuje jak pięść do oka
  2. Czemu musisz tą inicjalizacje wykonać akurat w PostConstruct? Jaki problem chcesz rozwiazać?
1

Tak to jest brać się za Springa bez dobrej znajomości javy i OOP

Nawiasem mówiąc tenże Spring (Spring, a nie Spring Boot) ma środki do danych ogólnie dostępnych

1

A potem będziesz ten ArrayList z wielu wątków obsługiwał (np. bean jest singletonem w aplikacji webowej)? Jeżeli tak to lepiej uważaj, teoretycznie tylko odczyt nie powinien nic popsuć ale np. w takim Random psuje.

Rozważ awans listy do osobnego bean'a, i wstrzyknięcie tam gdzie trzeba zamiast postConstruct'a, lub po prostu zwykłe pole instancyjne jeżeli nie da się inaczej. Dodatkowo pomyśl o tej wielowątkowości...

0
Shalom napisał(a):
  1. PostConstruct odnosi się do akcji po utworzeniu obiektu więc do static pasuje jak pięść do oka
  1. Czemu musisz tą inicjalizacje wykonać akurat w PostConstruct? Jaki problem chcesz rozwiazać?

Static to był żart.
W postconstruct wczytuję dane z bazy danych o swoich urządzeniach do ArrayList. Tych urządzeń czasem jest 5 czasem 20. Liczba może się zmieniać i na stałe nie może być zapisana w programie. Wysyłam do nich potem konfiguracje w zapytaniu get.
Konfiguracja wysyła się więc raz podczas uruchomienia pliku jar.

Mam endpoint, w uproszczeniu robi on coś takiego, że po otrzymaniu zapytania sprawdza „uprawnienia” i jeśli jest ok to przesyła zapytanie do wybranego urządzenia przez httpClient.

Te urządzenia to jest totalna porażka ale nie mam na nie żadnego wpływu. W skrócie nie mogę w tym samym czasie przesłać dwóch zapytań, bo się zawieszają.

Wpadłem na pomysł żeby w @PostConstruct zrobić drugą listę z ExecutorService. Inicjuje każdy executorService jako SingleThreadExecutor.

W kontrolerze ładuje swój serwis a w tym serwisie robię @Autowired na tej klasie co ma @PostConstruct. Potem w ArrayList szukam odpowiedniego executorService i wywołuję submit z tym zapytaniem przez httpClient.
Dzięki temu w tym samym czasie nie są robione równolegle zapytania.

0
  1. Czemu nie robisz tego normalnie w konstruktorze?
  2. Kombinujesz strasznie, czemu nie trzymać tych executorów w mapie? I nie widzę też powodu żeby to było jakoś potrzebne "wszędzie", ot masz jednego beana/serwis który trzyma tą mapę i zajmuje się obsługiwaniem requestów i tyle.
public class SubmissionService{
    private final Map<Key,Submitter> executors = new HashMap<>();
    public SubmissionService(){
        // query do bazy i zbudowanie mapy
    }
    public Optional<Result> submitRequest(Key key, Input input){
        Optional.ofNullable(executors.get(key))
            .map(submitter -> submitter.submit(input));
    }
}


public class Submitter{
    private final DeviceConfiguration confoguration;
    private final ExecutorService executor;

    public Result submit(Input input){
        // bla bla
    }
}
0

@AntyKtokolwiek
Proponujesz rozwiązania, które wymagają napisania wszystkiego od 0. Narzekasz na zły design.
Weź ze swoimi ambicjami idź do innych tematów :D, bo nie ma odpowiednich funduszy i czasu na to wszystko.

Kolejny wątek, że OP ukrywa pełną treść zagadnienia, ujawnia to po kilkunastu postach w jakiś fragmencikach, a ty publiko produkuj się co wiesz.

Kolejny XY problem, który należało by u samych fundamentów inaczej zaprojektować, w szczególności nie patrzeć "bazą danych" a inną koncepcją (event sourcing, saga, whatever)”

0
Shalom napisał(a):
  1. Czemu nie robisz tego normalnie w konstruktorze?
  1. Kombinujesz strasznie, czemu nie trzymać tych executorów w mapie? I nie widzę też powodu żeby to było jakoś potrzebne "wszędzie", ot masz jednego beana/serwis który trzyma tą mapę i zajmuje się obsługiwaniem requestów i tyle.
  1. W postconstruct wszystkie zależności będą już zainicjowane a w konstruktorze nie.
  2. W sumie to racja ale z listą też zadziała.
  3. Da się zrobić żeby kolejka w executor nie została utracona podczas np. niespodziewanego wyłączenia programu?

1 użytkowników online, w tym zalogowanych: 0, gości: 1