3 Stimmen

Wie unterscheidet man zwischen Webanwendungen und eigenständigen Anwendungen?

Gibt es eine Möglichkeit, innerhalb einer bestimmten Methode zu unterscheiden, ob sie in einer Webanwendung (z. B. ganze Anwendungen auf Tomcat/Web Sphere usw. bereitgestellt) oder als eigenständige Anwendung ausgeführt wird?

1 Stimmen

Wofür wollen Sie sich auszeichnen?

0 Stimmen

Ich habe es mit einem Legacy-Code zu tun, die Anwendung kann eigenständig oder unter Tomcat laufen. Und es gibt einen Thread, der während der Initialisierung der Anwendung startet. Ich kann jetzt, wenn die Web-Anwendung bereits gestartet oder wird heruntergefahren. Ich wollte mir ein Bild machen. Das Problem ist, wenn es nicht läuft Standalone-Thread ist Ausnahme werfen, während Start / Stopp der Web-App.

2voto

ChssPly76 Punkte 97241

Die Antwort lautet "Nein". Es gibt keinen garantierten Weg, um festzustellen, ob Ihr Code in einer Art App-Server/Servlet-Container oder eigenständig läuft, ohne sich auf externe Informationen zu verlassen.

Sie könnten jedoch in einem Fall eine Systemeigenschaft angeben und im anderen Fall nicht und deren Vorhandensein überprüfen:

java -Dstandalone.mode=true MyApplication

In Ihrem Code:

if (Boolean.getBoolean("standalone.mode")) {
  // we're in standalone mode
}

1voto

Adam Paynter Punkte 45274

Sie könnten prüfen, ob eine Instanz von HttpServlet wird in der aktuellen Stack-Trace angezeigt. Obwohl dies nicht narrensicher ist, kann es Ihren speziellen Anforderungen entsprechen.

Nota: Ich habe nicht versucht, diesen Beispielcode auszuführen. Die Behandlung von Ausnahmen wurde ausgelassen.

public boolean isWebApplication() {
    Class<?> httpServletClass;
    try {
        httpServletClass = Class.forName("javax.servlet.http.HttpServlet");
    } catch (ClassNotFoundException e) {
        return false;
    }

    StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace()

    for (StackTraceElement element : stackTrace) {
        Class<?> elementClass = Class.forName(element.getClassName());
        if (httpServletClass.isAssignableFrom(elementClass)) {
            return true;
        }
    }

    return false;
}

2 Stimmen

"Nicht narrensicher" ist eine Untertreibung. Dies wird für Servlets funktionieren, aber nicht Filter / gespawnte Threads oder, im Falle eines vollständigen EE-Containers, Beans.

2 Stimmen

So wie es aussieht, würde Ihr Beispielcode erfordern, dass sich HttpServlet in Ihrem Klassenpfad befindet, was für die Geschäftslogik wahrscheinlich nicht der Fall ist

0 Stimmen

@ChssPly76: Deshalb habe ich gesagt: "Es könnte Ihren speziellen Bedürfnissen entsprechen" :)

1voto

Dave Ray Punkte 38948

Vermutlich möchten Sie dies innerhalb eines "generischen" Geschäftslogikcodes überprüfen, der nicht mit einem App-Server oder J2EE-APIs im Klassenpfad kompiliert ist, d. h. Sie können nicht direkt auf HttpServlet zugreifen. In diesem Fall denke ich, dass die Durchführung einer Class.forName() für eine J2EE- oder app-server-spezifische Klasse wäre die beste Wahl. Wenn es eine Ausnahme auslöst, ist es eigenständig, sonst sind Sie vielleicht in einem App-Server.

0voto

Chris Thompson Punkte 34220

Ihre Frage ist schwierig, weil es nicht viel gibt, was zwischen den beiden "anders" ist, abgesehen davon, in was sie laufen. Sie könnten versuchen, die

org.apache.catalina.util.ServerInfo.getServerBuilt()

Und wenn er fehlschlägt, dann läuft Tomcat nicht. Ich kenne mich mit Web Sphere nicht aus, aber ich könnte mir vorstellen, dass der Versuch, eine spezielle Methode dafür aufzurufen, ebenfalls funktionieren würde. Es ist definitiv eine schmutzige Art, Dinge zu tun, aber es wird funktionieren.

0voto

Yishai Punkte 87548

Ich denke, der einfachste Weg wäre ein Test auf das JNDI-Systemeigenschaften (vorausgesetzt, diese werden nicht im Standalone-Modus auf einen entfernten Server gesetzt - und selbst dann sollten Sie in der Lage sein, den Unterschied in den Werten zu erkennen, z. B. dass der Server nicht auf einen localhost verweist).

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X