HTTP Grundstzfrage verteilte Anwendung

agent47

Aktives Mitglied
Ich entwickle eine kleine SmartHome Anwendung. Dafür ist eine Server Anwendung geplant die per REST Service die Daten für Clients aller Art (Desktop APP, Smartphone APP's usw.) bereit stellen soll.
Der REST Service sollte per SSL verschlüsselt werden können.
Soweit ist das ja auch kein Problem.

Nun muss ich aber für das verarbeiten der Daten (z.B.: Sensordaten) einen permanent laufenden Thread haben der die Daten der Server Anwendung manipuliert (quasi in Echtzeit).

Theoretisch würde sich JavaEE dafür anbieten, da weiß ich aber nicht ob es möglich ist einen Prozess/Thread dauerhaft laufen zu lassen der die Anwendungsdaten manipuliert. Kann mir jemand eine Tipp geben wie ich das unter einen Hut bekomme ohne alles komplett neu erfinden zu müssen?
 

TheBohne

Aktives Mitglied
Eine Möglichkeit wäre eine Methode alle X Sekunden auf zu rufen
Code:
@Schedule(second="*/3", minute="*", hour="*")
private void mache(){
}
 

dayaftereh

Top Contributor
Spring Boot ist dein Freund. Kannst deine Rest Resources einfach definieren und Methoden Scheduled markieren, so dass sie jede X ms aufgerufen werden.
 

agent47

Aktives Mitglied
Das ist schon ein Ansatz, hat aber den Nachteil das ich alle Daten bei jedem Aufruf wieder laden muss und am ende Speichern muss. Das wird bei einem Aufruf alle paar Sekunden denke ich sehr viel Prozessorleistung nur für das laden und speichern der Daten verschwenden.
 

dayaftereh

Top Contributor
Na ja, ich denke das du nicht mit na while true, dauernd über die Dateien läuft. Zudem muss ja jemand auch die Dateien aktualisiert bzw schreiben. Wenn du jetzt alle 10 ms die Dateien ließt dann interessiert die cpu das kaum.

Ich würde mal sagen die Dateien werden mit einer bestimmten Frequenz geschrieben. Da du sie in Echtzeit verarbeiten willst musst du sie in der Frequenz einfach lesen. Echtzeit bedeutet ja die Daten so schnell zu verarbeiten wie sie erzeugt werden.

Daher wird dass auf jeden Fall ausreichen.Falls nicht, muss du die Sensordaten auslesen bzw schreiben ändern, da hier der Design Fehler ist.
 

agent47

Aktives Mitglied
Es ändern sich ja nicht immer alle Daten. Das schellste wäre ja denke ich die Daten immer aktuell im Speicher zu halten und nur geänderte Daten zu aktualisieren. Aus diesem Pool an Daten müsste dann auch der REST Service gefüttert werden. Für die Persitenz würde ich dann ale 30 Sekunden die Daten in eind Datenbank schreiben.

Das System wie du es beschrieben hast die Daten bei jedem Aufruf zu laden, verarbeiten und speichern habe ich aktuell noch in PHP implementiert. Das hat sich aber als sehr instabil erwiesen. Daher die Idee alles im Speicher zu halten.
Die Menge der Daten ist verhältnismäßig gering. Selbst bei vielen Sensoren und aktoren kommt das ganze kaum über 500KB raus.
 

mrBrown

Super-Moderator
Mitarbeiter
Kann man die Daten nicht direkt an den Server weitergeben, ohne das sie vorher in eine Datei geschrieben werden?
 

agent47

Aktives Mitglied
Ja, das ist das Zeil des ganzen. Die Daten nur zum dauerhaften speichern in eine Datenbank zu schreiben.
Die Daten die verarbeitet werden sollen kommen auch über den REST Service.

Ich weis nicht ob das sinn macht, aber bei den Datenmengen könnte ich doch das ganze auch in der von JaveEE bereit gestellten Session speichern. So würde auch das aufrufen in Zeitabständen ausreichen?
 
Zuletzt bearbeitet:

mrBrown

Super-Moderator
Mitarbeiter
Ich würde die Daten, sobald der Server sie hat, in 'ner Datenbank speichern, und erst wenn ein Client sie abfragt, diese wieder laden.

Wie soll der Server denn mal an die Daten kommen?
 

agent47

Aktives Mitglied
Die Daten kommen auch über den REST Service.

Beispiel:
Ein Temperatursensor schickt seinen Wert per REST (HTTP) an den Application Server. Der überwacht im Sekundentakt den Wert auf veränderungen. Steigt der Wert z.B.: über 30°C soll eine Reaktion daruf hin ausgelöst werden.

Das bedeutet das die Daten im Sekundentakt geladen, verarbeitet und gespeichert werden müssten. Die Daten werden nicht wie bei einer Typischen Webanwendung nur geladen wenn ein Client diese Abfragt.
 

mrBrown

Super-Moderator
Mitarbeiter
Beispiel:
Ein Temperatursensor schickt seinen Wert per REST (HTTP) an den Application Server. Der überwacht im Sekundentakt den Wert auf veränderungen. Steigt der Wert z.B.: über 30°C soll eine Reaktion daruf hin ausgelöst werden.
Der Sensor schickt die Daten per POST oä, der Server muss sie also nicht selbstständig irgendwo abholen?

Das bedeutet das die Daten im Sekundentakt geladen, verarbeitet und gespeichert werden müssten. Die Daten werden nicht wie bei einer Typischen Webanwendung nur geladen wenn ein Client diese Abfragt.
Für wen und warum werden die Daten denn gebraucht (gebraucht != neue Daten vom Sensor bekommen), wenn sie grad kein Client braucht?

Hast du ein grobes Flussdiagramm, was wann, wie und warum passiert?
 

mrBrown

Super-Moderator
Mitarbeiter
Bisher sehe ich da keine Stelle, an der der Server im Sekundentakt was von sich aus machen müsste...

Sensor sendet Daten -> Server prüft auf zB >30°, wenn ja mache irgendwas -> Daten in DB speichern für Client

Client fragt Daten ab -> Server lädt Daten aus DB, bereitet sie auf und liefert sie aus
 

agent47

Aktives Mitglied
So einfach ist das leider nicht, auch nicht so einfach zu erklären.

Der Server muss die Daten nicht selbst holen, sondern bekommt die geschickt.
Der Server soll Aktionen unabhängig vom Benutzer ausführen. Da nicht nur ein Sensor überwacht wird sondern das zusammenspiel vieler Daten und zustände reicht es nicht darauf zu reagieren wenn es neue Daten gibt.

Ein Flussdiagramm habe ich so noch nicht. Das kann ich vor Samstag auch nicht erstellen.
 

mrBrown

Super-Moderator
Mitarbeiter
Der Server soll Aktionen unabhängig vom Benutzer ausführen. Da nicht nur ein Sensor überwacht wird sondern das zusammenspiel vieler Daten und zustände reicht es nicht darauf zu reagieren wenn es neue Daten gibt.

Gibt es irgendein Beispiel für Dinge, die der Server überwachen muss (kann?), ohne das neue Daten ankommen?


Der Vorschlag mir SpringBoot passt aber immer noch.
Zwischen DatenBank und Logik kommt ein Service, der sich um's cache, laden, speichern, etc kümmert, für die Logik ist dann egal, ob die Daten geladen werden müssen, oder im Speicher gehalten werden, oder sonstiges. Kann man dann nachträglich immer noch anpassen, falls es performancetechnisch nicht passt, ohne was an der Anwendung ändern zu müssen.
Das überwachen kann man dann mit @Scheduled im passenden Zeitintervall laufen lassen, oder jeweils bei neuen (relevanten) Daten anstoßen.

Wenns aktuell PHP ist, kanns nur besser werden ;)
 

agent47

Aktives Mitglied
Das ist eine gute Frage, das habe ich ganz vergessen zu schreiben. Zusätzlich zum Auswerten der Sensordaten gibt es auch eine Zeitsteuerung. Ich kann da also einstellen das jeten Tag um 5 oder jeden Wochentag um 5 z.B.: das Licht im Wohnzimmer an geht.

Wenn du sagst das sollte mit SpringBoot gehen, schaue ich mir das mal genauer an.

Mit PHP hast du vollkommen recht, das habe ich nur leider erst sehr spät erkannt.
 

mrBrown

Super-Moderator
Mitarbeiter
Das ist eine gute Frage, das habe ich ganz vergessen zu schreiben. Zusätzlich zum Auswerten der Sensordaten gibt es auch eine Zeitsteuerung. Ich kann da also einstellen das jeten Tag um 5 oder jeden Wochentag um 5 z.B.: das Licht im Wohnzimmer an geht.

Wenn du sagst das sollte mit SpringBoot gehen, schaue ich mir das mal genauer an.

Sekündlich was laufen lassen, um zu prüfen ob der passende Zeitpunkt erreicht ist, ist etwas unschön...
Geht zwar bei dynamischen Intervallen nicht mit @Scheduled, dürfte aber gehen, wenn man 'nen TaskScheduler als Bean bereitstellt, und aus der Nutzerwahl passende CronJobs erstellt...
 

agent47

Aktives Mitglied
Also folgendes muss der Thread machen:
  • Sensordaten auswerten -> Aktionen bei Änderungen auslösen
  • zu einstellbaren Zeiten Aktionen ausführen
  • SmartHome Daten von der FritzBox holen
  • Statusdaten von EDIMAX WLan Steckdosen holen
  • Im Netzwerk befindliche Geräte überwachen (per Ping püfen ob das gerät erreichbar ist)
Ich habe mir jetzt folgenden Testaufbau zusammen gestellt. Als Grundlage habe ich jetzt Java SE verwendet, dazu Grizzly und Jersey per Maven geholt. Zusätzlich einen SSL Kontext erstellt. So habe ich jetzt einen SSL gesicherten REST Service der die Daten ganz normal aus dem kompletten Java Programm laden kann. Die Threads zum bearbeiten der SmartHome Daten kann ich da ganz normal in Java SE programmieren.
 

agent47

Aktives Mitglied
Schau dir mal Jersey oder https://grizzly.java.net/ an.
Beide libraries sind nicht nur schneller als Spring, sondern passen auch glaube viel besser zu seinem Use Case.

Genau diese konstellation habe ich auch verwendet (also Jersey und Grizzly). Die Antwortzeiten liegen deutlich unter 100ms (im Lokalen Netz), selbst auf dem Raspberry Pi.
Aktuell kämpfe ich nur mit dem Problem das ein Datei Upload nicht mlglich ist (Multipart-Form-Data). Sobald ich das programmiere startet der ganze Server nicht mehr.

OpenHab ist mir bereits bekannt, ich möchte das aber lieber selbst machen.
 

JuKu

Top Contributor
Was nützt du jetzt? Jersey oder Grizzly?
Nen Datei Upload ist auch nur nen normaler POST Request mit weiteren Parametern.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
B Konzept Verteilte Datensicherung Netzwerkprogrammierung 1
P Verteilte JAVA Systeme Netzwerkprogrammierung 21
M Verteilte Anwendung - welche Technik? Netzwerkprogrammierung 31
A Socket-Anwendung (BufferedWriter/Reader liest nicht aktuellen Wert) Netzwerkprogrammierung 6
R Anfängerbeispiel: Suche Java-Anwendung die http-Anfragen in Tomcat liest Netzwerkprogrammierung 8
L Webbasierte Anwendung - Authentifizierung über LDAP/ActiveDirectory Netzwerkprogrammierung 5
B Webview für Anwendung Netzwerkprogrammierung 7
C Mini Client-Server-Anwendung funktioniert nicht Netzwerkprogrammierung 8
S HTTP Würdet Ihr Euch bei einer intern genutzten Anwendung auf Cookies verlassen? Netzwerkprogrammierung 2
gamebreiti Socket Server / Client Anwendung Manipulation von Objekten durch Server Netzwerkprogrammierung 9
F Server Client Anwendung mit UDP Netzwerkprogrammierung 2
P Kritische Java-Anwendung und Citrix veröffentlichen Netzwerkprogrammierung 1
V erste Client - Server Anwendung, paar Fragen wie Socketverbindung checken usw. Netzwerkprogrammierung 4
S Client Anwendung mit zentraler SQL-Datenbank Netzwerkprogrammierung 3
C GWTEventService kleine Anwendung Netzwerkprogrammierung 1
T Peer-to-Peer Anwendung Netzwerkprogrammierung 2
D RMI Problem beim shutdown von verteilter CORBA-Anwendung Netzwerkprogrammierung 6
P Java Web = Webside Anwendung Netzwerkprogrammierung 2
Ollek Socket Sucher passende Server/Client Lösung für meine Anwendung Netzwerkprogrammierung 2
S Socket Einfache Client/Server-Anwendung Netzwerkprogrammierung 11
Y einfache TCP/IP Anwendung Netzwerkprogrammierung 4
J Nachricht kommt erst nach beendigung der Anwendung an Netzwerkprogrammierung 4
K Mobile online Anwendung - Java mit SAP Netzwerkprogrammierung 2
W Server-Client Anwendung Netzwerkprogrammierung 2
E Erste Server-Client Anwendung Netzwerkprogrammierung 2
J Anwendung friert bei .listNames() ein! Netzwerkprogrammierung 11
P Proxy für Anwendung setzten Netzwerkprogrammierung 3
B Server / Client Anwendung, Client GUI Probleme Netzwerkprogrammierung 11
J Mit Java Anwendung ein (externes) Programm auf einem AIX Rechner starten Netzwerkprogrammierung 6
P Mp3s Streamen - Client-Server-Anwendung Netzwerkprogrammierung 17
D Javascript Funktion aus Java Anwendung ausführen Netzwerkprogrammierung 5
I RMI Anwendung mit Zugriffsschutz versehen Netzwerkprogrammierung 8
A Verständnisproblem mit Client/Server-Anwendung Netzwerkprogrammierung 20
S Server - Client Anwendung Netzwerkprogrammierung 3
K RMI macht Anwendung langsam? Netzwerkprogrammierung 8
G Performance einer verteilten RMI-Anwendung Netzwerkprogrammierung 4
R proxy für java anwendung angeben [resolved] Netzwerkprogrammierung 15

Ähnliche Java Themen


Oben