PDA

View Full Version : Performanceprobleme beim Abruf von Internetseiten Java-As400



Franz_Rust
19-06-06, 17:24
Hallo,
ich möchte Informationen von https-Seiten abrufen per Kombination RGP-Java.
Der Aufruf eines Java-Programms aus RPG sollte kein Problem machen. Das Java-Programm auch nicht und es funktioniert auch(siehe Anhang). Eine Abfrage einer Internetseite dauert zwischen 5 und 10 Sekunden.
Nur soll dieses nicht einmal geschehen, sondern viele Male, quasi gleichzeitig.
Starte ich das Programm quasi gleichzeitig bis zu 10 mal, ist unsere AS400 bei einer Auslastung von 100% und die Abfragen dauern in der Summe bis zu einer Minute.
Ich vermute, es liegt am mehrfachen Laden der Virtuelle Java-Maschine.
Hat jemand eine Idee, wie es besser zu machen ist ?


Viele Grüße
Franz Rust

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.security.Security;
import javax.net.SocketFactory;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
public class TestPerformance2 {

public static void main(String argv[]) throws Exception {
if (argv.length != 1) {
System.out.println("Usage: java HttpsGetTrustAll");
System.exit(0);
}
String URLString = argv[0]; //z.B. https://www.sun.com (https://www.sun.com)
String request = "";

Security.addProvider(new com.ibm.jsse.IBMJSSEProvider());

// Get a Socket factory
SocketFactory factory = SSLSocketFactory.getDefault();

// Create a trust manager that does not validate certificate chains
TrustManager[] trustAllCerts = new TrustManager[]{
new X509TrustManager() {
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
return null;
}
public void checkClientTrusted(
java.security.cert.X509Certificate[] certs, String authType) {
}
public void checkServerTrusted(
java.security.cert.X509Certificate[] certs, String authType) {
}
}
};

// Install the all-trusting trust manager
try {
SSLContext sc = SSLContext.getInstance("SSL");
sc.init(null, trustAllCerts, new java.security.SecureRandom());
HttpsURLConnection.setDefaultSSLSocketFactory(sc.g etSocketFactory());
} catch (Exception e) {
}
// Now you can access an https URL without having the certificate in the truststore
try {
URL url = new URL(URLString + request);

BufferedReader in = new BufferedReader(new InputStreamReader(
url.openStream()));
String line;
StringBuffer sb = new StringBuffer();
while ((line = in.readLine()) != null) {
sb.append(line);
}
in.close();
System.out.println(sb.toString());

} catch (MalformedURLException e) {
}
}
}

Nili
20-06-06, 10:30
Moin!

kannst Du es nicht andersrum machen?
Eine JVM inder Du z.B. jede Abfrage in einem eigenem
Thread packst und von dort zusätzlich das RPG Programm
aufrufst für die Weiterverarbeitung.

RobertPic
20-06-06, 14:57
Also das öffnen der JVM und das Vorkomipilieren braucht viele Resourcen, jede JVM braucht auch viel Hauptspeicher.

Lies dir dazu auch die Homepage von Forumsmitglied "Dieter Bender" durch.

Für die weitere Vorgangsweise, noch folgende Frage:
Wieviel RPG-Jobs fragen (gleichzeitig) an?

Um auf ein vernünftige Performance zu kommen, ist es auf jeden Fall notwendig, den Javajob permanent als Serverjob laufen zu lassen.

Eine einfach Variante wäre, den Javajob eine DataQueue abhorchen zu lassen.
Abhängig von der obigen Frage (mehr als ein Anforderer?) reicht entweder eine Antwort DataQueue oder eine Antwortdatei oder....

Ich mache gerade was ein ähnliches Projekt. Beim mir gibt es viele Anforderer. Ich schwanke zwischen DataQueues und Sockets.

Ich berichte....

Achja, schneller wird es natürlich wenn man je Anforderung an einen neuen bzw. vorgestarteten Thread übergibt.

Robert P.

Nachtrag: Das Starten läßt sich beschleunigen, wenn man mit CRTJVAPGM (Level--> je höher, desto schneller) die Javaprogramme vorkompiliert Das ändert aber nichts am Hauptspeicherhunger viel JVM's - ist also keine Lösung.

Franz_Rust
20-06-06, 18:55
Ziel ist es, im Maximum 100 Abrufe von genausovielen Usern eines RPG-Programms gleichzeitig durchführen zu können. Die Abrufinformationen kommen aus RPG und werden an Java übergeben.
Erste Tests mit einem Javajob und Threads sehen sehr gut aus. Ich konnte 13 Abrufe auf in 9 Sekunden abhandeln
Nun wird der nächste Schritt die Übergabe der Daten aus RPG an den Javajob sein. Ich denke an Dataqueues. Dann die Rückgabe der Antwortdaten.
Wahrscheinlich werde ich die Daten in eine DB schreiben und das aufrufende RPG-Programm alle paar Sekunden auf diese Datei suchen lassen

Danke für die Ideen
Franz

BenderD
24-06-06, 12:17
Hallo,

die wesentlichen Infos hast du bereits von RobertPic bekommen. Ich habe da zwei Ergänzungen/Anmerkungen:
- die Idee mit dem warten und wühlen in dem anfordernden RPG Programm würde ich durch einen Antwort Mechanismus über DataQ lösen (AntwortQ pro Job erstellen und da die Antwort oder fertig Meldung rein, RPG Programm macht Receive DataQ mit Wait, eventuell Timeout vorsehen).
- die System.out.println Diagnostics durch log4j ersetzen mit der Möglichkeit das logging feinkörnig zu steuern und zwischen Entwicklung, Test, Fehlersuche und Produktion differenzierte Ausgaben zu machen ohne Programm Änderung.

mfg

Dieter Bender


Ziel ist es, im Maximum 100 Abrufe von genausovielen Usern eines RPG-Programms gleichzeitig durchführen zu können. Die Abrufinformationen kommen aus RPG und werden an Java übergeben.
Erste Tests mit einem Javajob und Threads sehen sehr gut aus. Ich konnte 13 Abrufe auf in 9 Sekunden abhandeln
Nun wird der nächste Schritt die Übergabe der Daten aus RPG an den Javajob sein. Ich denke an Dataqueues. Dann die Rückgabe der Antwortdaten.
Wahrscheinlich werde ich die Daten in eine DB schreiben und das aufrufende RPG-Programm alle paar Sekunden auf diese Datei suchen lassen

Danke für die Ideen
Franz