2016-06-09 16 views
3

Ich habe ejb vor kurzem studiert und ich lese auch über den Timer-Dienst, aber obwohl ich über Stateless, Stateful und Singleton Typen von Session Beans gelesen habe, habe ich immer noch einige Schwierigkeiten herauszufinden, was den Timer Service macht Habe ein Mehrfachinstanzattribut.Warum verwendet der EJB Timer Service Singleton als Standard?

Ich habe einige Beispiele gesehen, und sogar die einfachsten benutzen die Singleton Session Bean, also, Wenn ich ein einfaches Programm schreiben würde, um es zu testen, wäre es in Ordnung, ein Stateless Bean zu verwenden oder wird es empfohlen Verwenden Sie einen Singleton trotzdem? Kann ich, wenn möglich, auch einen Fall haben, in dem ein Staatenloser nicht optimal wäre?

Antwort

0

Die Gründe es Singletons verwendet sind mindestens 2-fach:

1.

nur Singletons haben die Fähigkeiten von Start-up-Initialisierung. Das bedeutet, dass Sie Ihre Timer-Dienste beim Start Ihrer Anwendung registrieren können.

2.

wenn es staatenlos Bohnen verwendet, dann wird ein neuer Timer Service mit jedem stateless Bean Setup registriert werden, um eine Anfrage zu dienen. Ein Singleton garantiert, dass nur einer Ihrer Timer registriert ist. Stellen Sie sich einen Konflikt oder Integritätsprobleme oder Geldverluste vor, wenn Sie versehentlich einen Zeitgeber in einer statuslosen Bean verwenden und dann mehr als 1 mehr oder weniger zur gleichen Zeit erstellt wird, um Anfragen zu bedienen.

1

Verwenden Sie ein Singleton, wenn Sie sicherstellen möchten, dass alle Timeout-Callbacks für dieselbe zugrunde liegende Bean-Instanz aufgerufen werden. Dies ist wichtig, wenn Sie den Status in der Bean-Instanz selbst beibehalten möchten und sicherstellen möchten, dass nur ein Timeout-Callback gleichzeitig aufgerufen werden kann (standardmäßig verwendet der Timeout-Callback die Singleton-Einstellungen für die Parallelitätsverwaltung, die standardmäßig festgelegt sind Container-verwaltet mit einer Schreibsperre, so dass jeweils nur eine Methode auf dem Singleton aufgerufen werden kann).

Verwenden Sie ein Stateless, wenn Sie mehrere Timeout-Callbacks gleichzeitig aufrufen möchten. Der EJB-Container erstellt neue Bean-Instanzen, wenn mehrere Timeout-Callbacks gleichzeitig ausgeführt werden.

Wenn Sie einen nicht persistenten Zeitgeber konfigurieren möchten, der beim Starten der Anwendung gestartet wird, können Sie entweder die @Schedule-Annotation für eine statuslose oder Singleton-Bean oder eine @Singleton @Startup-Bean verwenden mit einem @PostConstruct (und wenn Sie das statuslose Verhalten möchten, können Sie das statuslose Bean in das statuslose Bean injizieren und einen createTimer für das statusfreie Session-Bean während des Starts aufrufen).