RMI RMI-Server und gleichzeitiger Aufruf einer Methode

Dit_

Bekanntes Mitglied
Hallo,

ich möchte mit Hilfe von RMI, Objekte vom Typ Report, auf meiner HP in der DB abspeichern.

also hat mein Server die methode
Code:
addNewReport(Report report);

Was passiert aber wenn mehrere Benutzer (Clients) gleichzeitig dieses Methode aufrufen? Kommt es dabei zu Problemen? Muss ich warteschlange oder sowas implementieren?
muss die Methode synchronized sein? Werde wahrscheinlich hibernate verwenden -> transaktions.

Ist ein Lernprojekt, kenn mich mit RMI wenig aus ... 😳 :rtfm:


Danke schon mal
 
denke mal in folgende Richtung:
Lösungen sind eine Sache, aber Problemfeststellung ist auch schon eine,
baue Logging ein, wann welcher Nutzer kommt, welche exakten Threads und sonstige Server-Objekte benutzt werden,
speichere sie oder Information darüber (Hashcode) in einer statischen Liste, vergleiche sie,
teste aktiv Überlappung der Aktionen, schaue dir an, ob und was genau du an Fehlzuständen überhaupt zu erzeugen (und am besten auch zu reproduzieren) schaffst

ansonsten:
meiner Ansicht nach ist jeder RMI-Aufruf ein neuer Thread in einem neuen Server-Objekt,
wobei ich persönlich noch nie mehr als eine Handvoll gleichzeitig hatte,
von der Sicht aus wäre RMI kein Problem, was danach in deinem Code passiert musst du wissen
 
Ich glaube nicht, dass Du RMI benutzt. Homepage und Hibernate hört sich für mich nach normaler Connection zur Datenbank an. Unter den Voraussetzungen musst Du die Methode nicht synchronized machen und musst auch keine Warteschlangen implementieren.
 
Ah ok, ich hatte gedacht, Du würdest die Serverseite Deiner Anwendung meinen. Aber Du willst einen Client programmieren, richtig?

Für die Clientseite: Steht HP denn nicht für Homepage? Dann ist es doch eine Webanwendung und dafür würde ich einen http-Client programmieren und keinen RMI-Client. Aber vielleicht hab ich von den Begriffen in die Irre führen lassen...
 
Also ich habe in meiner Anwendung RMI Client implementiert. Die HomePage ist eine ganze normale Webseite PHP,MYSQL.
Ein Report kann zB ein Bug sein. Sprich der Benutzer kann in der Anwendung, so wie in Eclipse, Fehler oder Vorschlag senden. Ich habe erstmal direkt in der Anwendung mittels JDBC die "Reports" gespeichert, dafür musste ich aber die Zugangsdaten irgendwie im Code unterbringen... Dann wurde mir hier im Forum RMI vorgeschlagen.

Funktioniert eigentlich super. Es wird eigentlich nie vorkommen, dass mehrere Benutzer auf RMI-server gleichzeitig zugreifen, ist nur ein test-lern Projekt, wollte bloß für die Zukunft wissen, wie das ist... im "worst case"...

Wie SlaterB schon sagte jeder RMI-Aufruf verläuft im einem extra-Thread. Das bedeuted doch dass ich erstens auf jeden fall mit Transaktions arbeiten muss und zweitens dass ich ggf für die Synchronisation sorgend muss.
Richtig?
 
> Die HomePage ist eine ganze normale Webseite PHP,MYSQL.
passt überhaupt nicht zum RMI-Begriff und verwirrt weiterhin,
wenn du mit einem Java-Client irgendwas anstellst, so dass auf allgemeine Web-Art (HTTP) ein PHP-Server ansprochen wird, dann ist das kein RMI

Transaktionen und Synchronisation sollte man gewiss nicht vergessen, wie in quasi jedem Programm,
da kann man pauschal wenig zu sagen
 
Das bedeuted doch dass ich erstens auf jeden fall mit Transaktions arbeiten muss und zweitens dass ich ggf für die Synchronisation sorgend muss.
Richtig?
- Sofern Deine Methode "addNewReport(Report report)" nur mit ihrem Parameter und nicht mit Membervariablen arbeitet und Report selbst nicht von anderen Trheads benutzt wird bzw. immutable ist, brauchst Du die Methode nicht zu synchronisieren.
- Wenn Du Hibernate verwendest, bekommst Du Transaktionen und ACID Deiener Datenbank frei Haus. Du musst also auch diese nicht selbst implementieren.
 
> Die HomePage ist eine ganze normale Webseite PHP,MYSQL.
passt überhaupt nicht zum RMI-Begriff und verwirrt weiterhin,
wenn du mit einem Java-Client irgendwas anstellst, so dass auf allgemeine Web-Art (HTTP) ein PHP-Server ansprochen wird, dann ist das kein RMI

Die WebSeite läuft halt auf einem Virtuellen Server, da kann ich halt alles laufen lassen oder?

bin jetzt selbst verwirrt... klärt mich bitte auf :bahnhof:
 
So wie ich den Zweck Deiner Anwendung verstehe, speicherst Du Reports in einer Datenbank und benutzt eine PHP-Webandwendung, um diese in einer Webseite darzustellen.

Nun müssen die Reports natürlich irgendwie in die Datenbank rein. Dein erster Versuch war, sie direkt von den Clients aus über jdbc reinzupumpen. Dir hat aber nicht gefallen, dass das DB-Passwort auf den Clients sichtbar war (sehe ich übrigens nicht als so großes Problem an, wenn man nur für diesen Zweck einen eigenen DB-Account einrichtet).

Du suchst nun nach Alternativen. Eine wäre, die Clients per RMI anzubinden. Kann man machen. Aber auch hier solltest Du einen Passwortmechanismus einbauen. Auch so ein Passwort ist dann auf Clientseite bekannt.

Nachdem Du schon eine Webanwendung hast, wäre der naheliegenste Weg eben auch diese für das submitten von Reports zu benutzen. Wenn es geht, programmier ein Formular, in das die Benutzer die benötigten Daten direkt über den Browser eingeben. Dann brauchst Du garkeine Client-Software mehr.

Wenn Du einen Client haben willst und kein Webformular benutzen willst, dann benutze einen http-Post, um die Daten zu übertragen. Auf der Serverseite brauchst Du dann natürlich ein Script, dass die Posts verarbeitet.
 
genau. alles was ich möchte halt, dass beides geht. Die Webseite bietet ebenfalls die Möglichkeit ein Report anzulegen. Sonst ist es komisch das man die Reports(Bugs) nur anschauen kann. Wenn ein Report über meine Java-Anwendung geschickt wird, kann ich noch zusätzliche Infos mit senden(ThreadPool Zustand, Welche Module gerade aktiviert sind und und und)

Das mit http-Port hört sich gut an. Wie geht das?
Sende ich einen String der auf der HP seite geparst und als Report interpretiert wird?

danke
 
Das mit http-Port hört sich gut an. Wie geht das?
Sende ich einen String der auf der HP seite geparst und als Report interpretiert wird?
Ja, Du sendest etwas, dass auf der HP-Seite als Report interpretiert wird. Es ist aber kein String und parsing würde ich das auch nicht nennen.

Ein HTTP-Post besteht aus einem Header (ehrer uninteressant) und aus einem Body. In dem Body sind die Werte als key/value-Paare enthalten. Sie werden als Post-Parameter bezeichnet. Die bestehen aus Strings. Auf der Serverseite musst Du die Post-Parameter aus dem Request herausholen. (Bei PHP gibt es dafür im Request einen assoziativen Array 'POST' oder so ähnlich).

Auf der Clientseite musst Du den Post-Request zusammenbauen und an das PHP-Script schicken. Dafür würde ich eine API nehmen, die das erleichtert. Z.B. den httpClient von Apache: HttpClient - HttpComponents HttpClient Overview
 
Zuletzt bearbeitet von einem Moderator:
ok danke sehr! und letzte Frage, gibt es Erfahrungswerte was Performance http-Port vs RMI angeht? no so aus interesse 😳

ich meine bei RMI wird ja schon einiges gemacht: Verbindungsaufbau, senden, empfangen, speichern(hibernate, java-jdbc)...
 
Ich habe keine Erfahrungswerte. Verbindungsaufbau etc. muss aber auch bei der http-Variante gemacht werden. Ich behaupte aber mal, dass die Performance mehr als ausreichend ist.
 
Solange deine User per RMI nur Bugreports anlegen, musst du dich eigentlich um Synchronisation wenig kümmern (außer du vergibst die ID selber). Denn wenn zwei Leute gleichzeitig einfügen ist die Reihenfolge in diesem Falle ja egal. Alternativ könntest du die Kommunikation auch per SOAP oder REST implementieren.
 

Zurück
Oben