Ogłosiłem Spring bean, który odpytuje mój serwer e-mail co sekundę. Jeśli istnieje poczta, pobiera ją i próbuje wyodrębnić dołączone do niej pliki. Pliki te są następnie przesyłane do programu do przesyłania, który bezpiecznie je przechowuje. Przesyłający jest również zadeklarowany jako komponent Spring. Trzeci komponent bean kojarzy nadawcę wiadomości e-mail z nazwą pliku i przechowuje go w bazie danych.Przy domyślnym zasięgu komponentu bean jako pojedynczym, czy nie będzie źle, gdy będą występowały połączenia równoległe?
Okazało się, że gdy kilka osób próbowało wysyłać wiadomości e-mail w tym samym czasie, wydarzyło się mnóstwo bałaganu. Rekordy w DB mają błędne nazwy plików. Niektóre z nich nie otrzymywały nazw plików itp.
Przypisałem problem temu, że fasola ma domyślnie zasięg do singletonu. Oznacza to, że kilka wątków prawdopodobnie miesza się z jednym i tym samym wystąpieniem w tym samym czasie. Pytanie brzmi, jak to rozwiązać.
Jeśli zsynchronizuję wszystkie wrażliwe metody, wszystkie wątki będą układać się w stos i czekać na siebie nawzajem, co jest sprzeczne z całą koncepcją wielowątkowości.
Z drugiej strony, określenie zakresu fasolę na „żądanie” zamierza stworzyć nowe instancje każdego z nich, co nie jest naprawdę dobre albo, jeśli mówimy o zużyciu pamięci i harmonogram wątku
jestem zmieszany. Co powinienem zrobić?
trzeba zsynchronizować swoje metody, ale co ważniejsze, musisz upewnić się, że wywoływane metody nie modyfikują danych instancji, na których opierają się inne wątki. Zgaduję tylko dlatego, że nie dostarczyłeś kodu, ale to chyba znacznie więcej niż prosta synchronizacja metod. Wydaje się, że masz systemowy problem nadpisywania danych, zanim skończysz. –