2015-04-07 53 views
5

Potrzebuję zachować prosty licznik, który jest unikalny w aplikacji, dla wszystkich użytkowników i wszystkich węzłów w środowisku klastrowym. Myślałem o użyciu singleton sesji fasola adnotacji javax.ejb.Singleton tak:W jaki sposób singleton jest javax.ejb.Singleton w środowisku klastrowym?

package foo; 

import javax.ejb.Singleton; 

@Singleton 
public class Bean { 
    private int counter; 
    [...] 
} 

Wygląda to proste, ale nie mogę znaleźć odpowiedzi, czy to działa zgodnie z oczekiwaniami w środowisku klastrowym. Czy każdy węzeł klastra ma własną instancję, czy nie?

Oczywiście mógłbym utrzymać zawartość fasoli w bazie danych, ale tak naprawdę to tylko licznik, a to byłoby przesadą. Ponadto chcę, aby licznik zresetował awarię aplikacji lub uruchomił się ponownie, więc utrzymanie go spowoduje więcej problemów niż rozwiązuje.

+0

Nawet jeśli zdecydujesz się go utrzymać, rozwiązanie może nie być pełnym dowodem. Co się stanie, gdy pojawi się żądanie w węźle 2, a węzeł 1 będzie zajęty utrzymaniem zaktualizowanej wartości licznika? :-) – Abhishek

+0

Jeśli używasz db, który obsługuje sekwencje, możesz z nich korzystać. Czemu? Ponieważ uważam, że jest to najlepsze niezawodne rozwiązanie. W swoim singleton można użyć adnotacje cyklu życia do wykonania operacji resetowania sekwencji, czy na starcie lub zniszczyć, zależy od ciebie. – Raman

+0

Muszę policzyć i obniżyć, a serwer aplikacji ma inny cykl życia niż baza danych, więc to nie działa, ale dzięki. –

Odpowiedz

9

Czy każdy węzeł klastra ma własną instancję, czy nie?

Tak, każdy węzeł klastra będzie mieć inną instancję Singleton. Dlatego adnotacja @Singleton nie jest rozwiązaniem Twojego problemu.

Należy pamiętać, że specyfikacja Java EE nie definiuje żadnego rodzaju zachowania klastra. Musisz znaleźć konkretne rozwiązanie dostawcy, aby osiągnąć ten wymóg. Przykładem tego jest link.

+0

Dzięki. Zastanawiam się, czy istnieje opcja bez zależności od konkretnego produktu. Może włamać się do JNDI? –

+1

Myślę, że możliwe byłoby wdrożenie własnego rozwiązania, ale napotkasz problemy (wyzwania), które zostały już rozwiązane dla wyspecjalizowanych zespołów programistów. –

2

Można użyć hazelcast. Jest to magazyn kluczy i zasobów rozproszonych w pamięci. Wygląda na to, że idealnie pasuje. Implementuje także JSR-107, który jest specyfikacją JCache.

-2

Ha singleton to podejście. Z góry istnieją pewne ograniczenia. Jeśli czytasz, będziesz miał element bean bez profilu, który uzyska dostęp do usługi za pomocą metody "getValue()". Wartość get wywołuje metody pojedynczej fasoli i daje ci wartość ... aż do tego momentu.

Ale jeśli chcesz pracować z komponentem bean, strategia powinna zwrócić instancję SingletonBean, aby uzyskać wartość, ale ... będziesz mieć więcej instancji tego pojedynczego komponentu bean ... i jest problem.