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ć?
Statyczna zmienna inicjalizowana w @PostConstruct. Zaraz raka dostanę. Na co ci to? Po co ci to? Co chcesz tym rozwiązać?
- PostConstruct odnosi się do akcji po utworzeniu
obiektu
więc dostatic
pasuje jak pięść do oka - Czemu musisz tą inicjalizacje wykonać akurat w PostConstruct? Jaki problem chcesz rozwiazać?
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
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...
Shalom napisał(a):
- PostConstruct odnosi się do akcji po utworzeniu
obiektu
więc dostatic
pasuje jak pięść do oka
- 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.
- Czemu nie robisz tego normalnie w konstruktorze?
- 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
}
}
@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)”
Shalom napisał(a):
- Czemu nie robisz tego normalnie w konstruktorze?
- 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.
- W postconstruct wszystkie zależności będą już zainicjowane a w konstruktorze nie.
- W sumie to racja ale z listą też zadziała.
- Da się zrobić żeby kolejka w executor nie została utracona podczas np. niespodziewanego wyłączenia programu?