2014-01-29 5 views
5

Also, ich habe einen Web-Client und einen EJB-Timer, separat bereitgestellt.Wie kann ich einen einzelnen EJB-Zeitgeber koordinieren, der auf mehreren Servern in meinem WebLogic-Cluster bereitgestellt wird?

Der Arbeitsablauf ist wie folgt:

1) User-Client zugreift. 2) Der Benutzer fordert eine Aktion an, von der bekannt ist, dass sie lange läuft. Daher schreiben wir die Anforderung, diesen Prozess in einer Datenbanktabelle auszuführen. 3) TimerOne überprüft diese Tabelle alle paar Sekunden, um zu sehen, ob wartende Aufgaben vorhanden sind, so dass es die Anfrage des Benutzers findet und die Aufgabe ausführt.

Mein Problem ist, dass wir in einigen Umgebungen, in denen unsere Anwendung ausgeführt wird, Serverclustering nutzen. Wenn Sie das tun, werden der Client und der EJB-Zeitgeber auf jedem Server in dem Cluster bereitgestellt.

Es ist in Ordnung, wenn der Client auf mehreren Servern bereitgestellt wird, da dies bei der Arbeitslast hilft; es ist jedoch ein Problem, wenn der Timer auf mehreren Servern ausgeführt wird. Wenn der Benutzer die Ausführung einer lang andauernden Aufgabe anfordert, greifen beide Timer gleichzeitig die Aufgabe aus der Datenbank und starten sie. Da die Jobs mit langer Laufzeit normalerweise in die Datenbank schreiben, führt dieses Szenario unter anderem zu Kollisionen.

Mein Ziel ist es, meinen EJB-Timer für beide Server bereitstellen zu können, aber für einige Status im Cluster, die von den Timern verwendet werden können, um zu entscheiden, ob sie den Task übernehmen oder ob einer davon die anderen Instanzen haben es bereits aufgenommen.

Ich habe versucht, die Datenbank dafür und versuchte Dateispeicher, aber diese sind entweder zu langsam, oder ich konnte nicht mit einem kugelsicheren Workflow für die Synchronisation.

Kennt jemand eine gute Möglichkeit, dieses Problem zu behandeln? Ist es überhaupt möglich?

Die Lösung sollte in einer geclusterten WebLogic-Domäne, einer nicht geclusterten WebLogic-Domäne, einer gruppierten Glassfish-Domäne und einer nicht geclusterten Glassfish-Domäne ausgeführt werden können.

Ich bin offen für die Art und Weise, wie dies gemacht wird, wenn es eine andere, elegentere Lösung gibt.

Danke für jede Idee!

Antwort

3
0

Ich bin offen, um den Weg zum Ändern dies geschehen ist, wenn es eine andere ist, mehr elegent Lösung.

Ich weiß, dass Ihre Frage zu einem EJB Timer, aber die folgenden nehmen im Sinn: Meiner Meinung nach, haben Sie eine Anforderung, die den Vorteil der asynchronen Verarbeitung benötigen.

In früheren Java EE-Versionen bestand eine der Alternativen, um diese Anforderung zu erfüllen, darin, JMS zu verwenden, mit dem Sie eine Nachricht senden können, die später für eine Business-Layer-Komponente verarbeitet wird. Andere Möglichkeit war die, die Sie beschrieben haben, die die Verwendung von EJB Timer erforderte. Ich denke, dass beide Fälle ein Workaround waren, der eine Lücke in der EE-Spezifikation füllte.

Seit Java EE 6 können Sie asynchronous services definieren, mit dem Sie asynchrone Aufrufe durchführen können, um zu vermeiden, dass Features für andere Zwecke verwendet werden.