Bei Struts Beans updaten ohne ein Request zu verarbeiten

Status
Nicht offen für weitere Antworten.

Traut

Mitglied
Hallo,

ich habe mich entschlossen einen Webclient mit Struts zu schreiben. Den normalen Ablauf von Struts denke ich verstanden zu haben.

In der Geschäftslogik habe ich allerdings ein Problem. Ich habe da eine TCP/Ip Schnittstelle zu einem Datenserver. Dieser stellt mir sich dauernd ändernde Daten zur Verfügung. Diese Daten werden von allen Benutzern benötigt und sollen bei jeder Anfrage schon zur Verfügung stehn, aber nicht jedesmal neu angefordert werden. Für jede Anfrage die Daten neu zu besorgen würde den Datenserver stärker belasten als es mir erlaubt ist. Desshalb sollen die Daten nur alle paar Minuten neu angefordert werden.

Ich brauche nun also ein Servlet oder ähnliches, welches permanent im Hintergrund läuft und alle 5 Minuten sich neue Daten besorgt. Diese Daten sollen dann dem Rest des Systems zur Verfügung gestellt werden. Dazu muss dieses Servlet in die Beans schreiben können, sodass ich dann ganz normal den Standartstrutsablauf nutzen kann.

Request -> Controller -> FormBean -> Action -> Controller -> JSP (benutzt Bean) -> Browser

Dieser Teil der Daten sollte, dann als immer aktuell angesehn werden und in der Action wird dann nur noch requestspezifisches verarbeitet wie es das Strutsmodell vorsieht.

Gibt es sowas wie ein permanent laufendes Servlet überhaupt ?
Und wie kann man dieses in Struts integrieren, dass ich auf die Beans schreiben kann?
 

KSG9|sebastian

Top Contributor
Ich weiß nicht ob ich das komplett verstanden hab, aber mit einfachen Worten willst du folgendes:

Deine Applikation lädt alle 5min die Daten und speichert sie (in den Beans).
Die Daten werden per Struts dargestellt. Bei ner Aktion werden
a) wenn 5min rum sind die Daten neu geholt
b) wenn 5min nicht rum sind die "alten" Daten verwendet.

Soweit richtig?

Wie können sich die Daten (aus einer Datenbank?) ändern? Gibts in deiner Anwendung ein Frontend mit dem man Daten erfassen kann oder werden die Daten über andere Anwendungen in die Datenbank gebracht?

Von der Architektur solltest du mal bissl was über SoA (Service-oriented Architecture) anschauen. Da lässt sich dein Problem recht einfach lösen.
Ein Servlet dazu verwenden ist doch Quark. Würd das ganze so implementieren:

Aufbau vom Programm:

Sämtliche Actions erben von einer AbstractAction (AbstractAction erbt von der Strutsklasse Action)
AbstractAction hat ne Referenz auf nen DatabaseService
DatabaseService wiederum hat ne Referenz auf nen ObjektBroker (MySQL, XML, ist völlig wurschd).
Lesen, speichern u.s.w. funktioniert aus der sicht des Beans so:

Code:
class SaveUserToDatabaseAction extends AbstractAction{
   public ActionForward execute(....){
      User u = ...; //Userdaten von irgendwoherholen
 
// Referenz auf die "DatenbankHandler-Klasse"
      DatabaseService service = super.serviceLocator.getDatabaseService(); 

       service.saveUser(u);
   }
}

jetzt noch der Fall für den Ladevorgang

Code:
class LoadUserFromDatabaseAction extends AbstractAction{
   public ActionForward execute(....){
      int id = 123; // UserID
 
// Referenz auf die "DatenbankHandler-Klasse"
      DatabaseService service = super.serviceLocator.getDatabaseService(); 

       User user = service.getUser(id);   
       // user-Objekt in Bean schreiben .....
   }
}


Fall 1

Deine DatabaseService-Klasse muss folgendes machen
-> User-Objekt in die Datenbank schreiben
-> User-Objekt in eine Map o.ä. schreiben aus dem es wieder geladen wird (so verhinderst du unnützen Zugriff auf die Datenbank)

Beim Laden eines Users muss folgendes passieren
-> User-Objekt anhand der ID aus dem Cash (Map o.ä.) lesen
-> Ist das Userobjekt im Cash-Objekt vorhanden?
-> Ja: return userObjekt
-> Nein: UserObjekt aus DB lesen
-> UserObjekt in Cash schreiben
-> return userObjekt

Fall 2
Alle x Minuten sollen die Daten neu geholt werden.

DatenbankService hat nen Timestamp (lastUpdate).
Cash-Mechanismus bleibt erhalten

Deine DatabaseService-Klasse muss folgendes machen
-> User-Objekt in die Datenbank schreiben
-> User-Objekt in eine Map o.ä. schreiben aus dem es wieder geladen wird (so verhinderst du unnützen Zugriff auf die Datenbank)

Beim Laden eines Users muss folgendes passieren
-> aktueller Timestamp - lastUpdate > 5 (letztes Update war vor mehr als 5min)
-> Ja: sämtliche Daten aus der DB holen und in Cash schreiben
-> Nein: weiter mit dem nächsten Punkt
-> User-Objekt anhand der ID aus dem Cash (Map o.ä.) lesen
-> Ist das Userobjekt im Cash-Objekt vorhanden?
-> Ja: return userObjekt
-> Nein: kann nicht passier


Wobei das ganze Anhand von ner bestimmten Zeit festzumachen ist imho quatsch.
Vor allem weil dann alle Daten aus der Datenbank gezogen werden müssen. Mit ner normalen Cash-Funktion wird ein benötigter Datensatz gezogen und in den Cash geschrieben. Mit dem anderen Mechanismuss müssen immer die komplette Tabelle rausgeschrieben werden, da ja nur alle 5min ein DB-Zugriff "erlaubt" ist.

gruß seb
 

Traut

Mitglied
KSG9|sebastian hat gesagt.:
Deine Applikation lädt alle 5min die Daten und speichert sie (in den Beans).
Die Daten werden per Struts dargestellt. Bei ner Aktion werden
a) wenn 5min rum sind die Daten neu geholt
b) wenn 5min nicht rum sind die "alten" Daten verwendet.

Ja genau so war es gedacht.

Da ich mit SoA nicht wirklich vertraut bin, kann ich deinem Lösungvorschlag noch nicht vollständig folgen.

Aber da es mir anscheint nicht gelungen ist mein Problem gut zu beschreiben versuche ich noch ein paar Sachen zu ergänzen. Warum ich auf die Idee mit dem Update alle 5 min gekommen bin.

Im Prinzip ist das was ich als Bean bezeiche eine Art Cash, dort möchte ich Daten der View zu Verfügung stellen.

KSG9|sebastian hat gesagt.:
Beim Laden eines Users muss folgendes passieren
-> User-Objekt anhand der ID aus dem Cash (Map o.ä.) lesen
-> Ist das Userobjekt im Cash-Objekt vorhanden?
-> Ja: return userObjekt
-> Nein: UserObjekt aus DB lesen
-> UserObjekt in Cash schreiben
-> return userObjekt
-> Nein: UserObjekt aus DB lesen

Was ich nicht haben wollte ist:
- das bei jeder Anfrage der Datenserver kontaktiert werden muss
- das die Daten, wenn sie veraltet sind erst neu geholt werden müssen

Die Daten müssen nicht umbedingt aktuell sein, aber sollten schnell verfügbar sein. Desshalb wäre es gut, wenn die Daten, sobald eine Anfrage rein kommt, schon in den Beans liegt und nicht erst in der Action neu vom Datenserver geholt werden müssen, wenn diese älter als 5 min sind.

Daher kahm die Idee mit Updateservlet, welches die Daten aktuell halten sollte.
 

KSG9|sebastian

Top Contributor
Klar kannst du ein Servlet laufen lassen, aber

1) läuft das Servlet nur wenn ein Request statt findet, d.h. du müsstest dauerhaft nen Request erzeugen

Das ganze ist aber state-of-the-art:

Wenn eine Action ausgeführt wird wird eine Zwischenschicht kontaktiert welche
1) Das Objekt aus dem Cash lädt, falls vorhanden
2) Das Objekt aus der DB holt, in den Cash speichert

und zurückgibt.
Falls du unterbinden willst dass "ständig" auf den DB-Server zugegriffen wird (was eigentlich nicht passiert, nur wenn insert's stattfinden, und das passiert wohl nicht allzuoft) dann mach es so wie ich im Fall 2 geschrieben hab

Code:
private long lastUpdate = -1;
private Map cash = new HashMap();
public UserObjekt getFromDb(int userId){
   long aktuell = new Date().getTime()
   if(lastUpdate == -1 || (aktuell - lastUpdate > <5min ?>)){
      cash.clear();
      // SELECT ausführen und alle Results in die cash-Map  schreiben ( Key, Value: userObjekt.getUserId(), user)
     lastUpdate = aktuell;
   }
   return (UserObjekt)cash.get(new Integer(userId));
}

Das ganze über ein Servlet zu regeln geht schon, ist aber imho nicht so der Hit....mehr schlecht als recht :)
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
A Probleme mit Struts Java Basics - Anfänger-Themen 3
A Struts: Über Collection iterieren mir Taglibs? Java Basics - Anfänger-Themen 13
H Struts: In JSP error auswerten Java Basics - Anfänger-Themen 7
F Struts/Jsp/ logic:equals :( wie funktionierts Java Basics - Anfänger-Themen 2
A Combobox Struts Java Java Basics - Anfänger-Themen 7
RaoulDuke Struts ActionForms / Mehrere auf einer Seite Java Basics - Anfänger-Themen 5
S Struts Daten bedingt anzeigen ! Java Basics - Anfänger-Themen 3
I No Jakarta Enterprise Beans found with interface ignorieren? Java Basics - Anfänger-Themen 2
I @Entity Klassen, Service Beans etc. aus einem Share Projekt beziehen? Java Basics - Anfänger-Themen 26
frager2345 Java Beans -> PropertyChangeListener Java Basics - Anfänger-Themen 3
S Was sind Java Beans? Java Basics - Anfänger-Themen 7
N Java Beans Java Basics - Anfänger-Themen 2
B BeanBuilder, Java Beans Java Basics - Anfänger-Themen 5
D Beans Erklärung Java Basics - Anfänger-Themen 11
alderwaran closed source jar, kein javadoc. was macht methode x eigentlich? ( oracle forms pjc beans ) Java Basics - Anfänger-Themen 2
Binary.Coder Java Beans - Entity erstellen Java Basics - Anfänger-Themen 6
T Java Beans JDateChooser Java Basics - Anfänger-Themen 2
M beans Java Basics - Anfänger-Themen 33
A von Java-Beans Klassen aufrufen Java Basics - Anfänger-Themen 3
N Unterschied zwischen Beans finden Java Basics - Anfänger-Themen 2
G Java Beans Java Basics - Anfänger-Themen 2
G Unterschied Observer&Observable<->java.beans.Prope Java Basics - Anfänger-Themen 4
B Java Beans Java Basics - Anfänger-Themen 5
M in Beans gibt es keinen konstruktor? Java Basics - Anfänger-Themen 4
G Message Driven Beans Java Basics - Anfänger-Themen 4
M API? Java Beans? Was ist das? Java Basics - Anfänger-Themen 13
G Webapplikation mit JSP und Beans - Eingaben sichern, wie? Java Basics - Anfänger-Themen 11
S Java Beans - Bound Properties Java Basics - Anfänger-Themen 6
H Wie arbeitet man mit Beans? Java Basics - Anfänger-Themen 8
M Beans - Bohnen ??? Java Basics - Anfänger-Themen 5
B JaxB - Unique Name updaten / Referenzen in XML Java Basics - Anfänger-Themen 0
S Daten/Klassen/Packages richtig updaten!? Java Basics - Anfänger-Themen 2
C ProgressBar updaten Java Basics - Anfänger-Themen 4
M Jtable änderung updaten Java Basics - Anfänger-Themen 2
T OOP GUI aus anderer Klasse updaten Java Basics - Anfänger-Themen 6
E Gui updaten während langer Methode Java Basics - Anfänger-Themen 2
E JTable + TableModel updaten? Java Basics - Anfänger-Themen 1
G drawString/ JLabel updaten Java Basics - Anfänger-Themen 1
H java version updaten Java Basics - Anfänger-Themen 11
G JFreeChart | Plot updaten bei neuem Dataset | wahrscheinlich "Thread-abhängig" Java Basics - Anfänger-Themen 3
J Servertime updaten Java Basics - Anfänger-Themen 4
Screen Threads Wie thread stoppen/closen ? und wie GUI at runntime updaten? Java Basics - Anfänger-Themen 10
B Progress Bar Updaten Java Basics - Anfänger-Themen 4
S JFRAME updaten Java Basics - Anfänger-Themen 6
J arraylist ausserhalb der main Methode zugänglich machen (Elemente adden und updaten) Java Basics - Anfänger-Themen 4
G JList updaten Java Basics - Anfänger-Themen 7
MegaWatt Wie Applet mit Timer updaten, warum 2. Thread ? Java Basics - Anfänger-Themen 5
M JTable updaten woran liegt es bloß? Java Basics - Anfänger-Themen 2
J Dateien in JAR-Datei updaten Java Basics - Anfänger-Themen 4

Ähnliche Java Themen

Neue Themen


Oben