BEA WebLogic 9.2

+ andere TechDocs
+ Java EE
+ EJB
+ BEA WebLogic
+


Java EE (Java Platform, Enterprise Edition) ist eine durch Schnittstellen definierte Architektur für Unternehmensanwendungen, bestehend aus verschiedenen Komponenten.

Java-EE-Anwendungen werden auf Java EE Application Servern betrieben. Bekannte Java EE Application Server sind zum Beispiel: Sun GlassFish, JBoss, Oracle WebLogic, IBM WebSphere und Apache Geronimo.

Falls Sie nicht BEA WebLogic 9, sondern aktuellere WebLogic-Versionen einsetzen, finden Sie eher geeignete Hinweise unter BEA WebLogic 10 und Oracle WebLogic 10.3.



Inhalt

  1. Installation des BEA WebLogic Server 9.2 unter Windows
  2. Einrichtung einer Data Source zu einer MySQL-Datenbank
  3. JNDI-Einträge anzeigen
  4. EJB erstellen und deployen
  5. Webanwendung mit Servlet, JSP, JavaBean, EJB-Zugriff und DB-Zugriff
  6. Classloader-Reihenfolge
  7. Monitoring-Tools für BEA WebLogic
  8. Profiling mit YourKit 7.5.6 auf BEA WebLogic
  9. Links auf weiterführende Informationen


Installation des BEA WebLogic Server 9.2 unter Windows

Basisinstallation

  1. Downloaden Sie BEA WebLogic Server 9.2 von http://www.bea.com/framework.jsp?CNT=start.htm&FP=/content/products/weblogic/server (z.B. 'server920_win32.exe').

  2. Führen Sie das downgeloadete Installationsprogramm aus (z.B. 'server920_win32.exe').

    In der folgenden Beschreibung wird davon ausgegangen, dass Sie in das Verzeichnis 'C:\WebLogic' installieren.

  3. Starten Sie WebLogic über 'Start' | 'Alle Programme' | 'BEA Products' | 'WebLogic Server 9.2' oder über den Kommandozeilenbefehl (eine Zeile, passen Sie den Pfad an):

    C:\WebLogic\weblogic92\common\bin\consolew.exe /k "C:\WebLogic\weblogic92\samples\domains\wl_server\startWebLogicEx.cmd"

  4. Überprüfen Sie die Installation. Starten Sie die Beispiele, die über den Links auf folgenden Seiten erreichbar sind:

    http://localhost:7001/index.jsp

    http://localhost:7001/examplesWebApp/index.jsp

    Sehen Sie sich die entstandenen Log-Einträge an unter:

    C:\WebLogic\weblogic92\samples\domains\wl_server\servers\examplesServer\logs

  5. Lesen Sie die Hinweise unter:

    http://localhost:7001/fast_track.html

    http://edocs.bea.com/wls/docs92

    http://edocs.bea.com/wls/docs92/ConsoleHelp/core

  6. Stoppen Sie WebLogic (Benutzername/Passwort = 'weblogic'):

    http://localhost:7001/Shutdown

Domain erstellen im WebLogic Configuration Wizard

  1. Starten Sie den WebLogic Configuration Wizard über:
    'Start' | 'Alle Programme' | 'BEA Products' | 'Tools' | 'Configuration Wizard'.
  2. Wählen Sie 'Create a new WebLogic domain'.
  3. Im Folgenden wird davon ausgegangen, dass Sie als 'User name' und 'User password' 'weblogic' eintragen.
  4. Für Entwicklungszwecke wählen Sie eher das Sun JDK (z.B. Sun SDK 1.5.0_04). Sie können aber auch das JRockit SDK wählen.
  5. 'Do you want to customize any of the follwing options?' beantworten Sie mit 'No'.
  6. Als 'Domain name' tragen Sie ein: 'MeineDomain'.
  7. Beenden Sie den Configuration Wizard mit 'Done'.
  8. Sehen Sie sich das folgende neu entstandene Verzeichnis an:

    C:\WebLogic\user_projects\domains\MeineDomain

  9. Starten und stoppen Sie WebLogic über folgende Kommandozeilenbefehle (jeweils eine Zeile, passen Sie die Pfade an):

    C:\WebLogic\user_projects\domains\MeineDomain\bin\startWebLogic.cmd

    C:\WebLogic\user_projects\domains\MeineDomain\bin\stopWebLogic.cmd

  10. Die WebLogic-Administrationskonsole erreichen Sie über (Username/Password = 'weblogic'):

    http://localhost:7001/console

Startoptionen

  1. Für große Java-EE-Anwendungen sollten Sie mehr Arbeitsspeicher zur Verfügung stellen. Um mit 256 MByte zu starten und maximal 768 MByte zu erlauben, fügen Sie dem Java-Startkommando in 'startWebLogic.cmd' die Parameter '-Xms256m -Xmx768m' hinzu. Oder Sie rufen 'startWebLogic.cmd' über eine vorgeschaltete Batchdatei mit folgendem Inhalt auf:

    set JAVA_OPTIONS=%JAVA_OPTIONS% -Xms256m -Xmx768m

    startWeblogic.cmd

  2. Für Remote-Debugging (z.B. mit Eclipse) rufen Sie 'startWebLogic.cmd' über eine vorgeschaltete Batchdatei mit folgendem Inhalt auf:

    set JAVA_OPTIONS=%JAVA_OPTIONS% -Xdebug -Xrunjdwp:transport=dt_socket,address=8001,server=y,suspend=n

    startWeblogic.cmd

  3. Tracing für JDBC/JTA/JTS schalten Sie ein, indem Sie dem Startkommando folgende Kommandozeilenoption hinzufügen:

    -Dweblogic.Debug=weblogic.JDBCConn,weblogic.JDBCSQL,weblogic.JTA2PC,weblogic.JTAXA,weblogic.JTAJDBC

  4. Falls Sie die WebLogic-Monitoring-Tools verwenden wollen, muss das Startkommando um den -Xmanagement-Parameter erweitert werden, wie unten unter Monitoring-Tools für BEA WebLogic beschrieben ist.



Einrichtung einer Data Source zu einer MySQL-Datenbank

  1. Falls Sie noch keine MySQL-Datenbank installiert haben: Installieren Sie MySQL zum Beispiel wie beschrieben unter: mysql.htm#InstallationUnterWindows. Die folgende Beschreibung geht davon aus, dass Sie als 'Database-Name' "MeineDb" wählen ("CREATE DATABASE MeineDb;") (Sie können auch stattdessen unten einen anderen 'Database Name' und eine andere 'URL' eintragen).
  2. Downloaden Sie den zur Datenbank passenden JDBC-Treiber, für MySQL zum Beispiel 'mysql-connector-java-5.1.11.zip'. Entpacken Sie die .zip-Datei und kopieren Sie die darin enthaltene Treiberdatei 'mysql-connector-java-5.1.11-bin.jar' in das zu Ihrer WebLogic-Domain gehörende lib-Verzeichnis, in diesem Beispiel also nach: 'WebLogic\user_projects\domains\MeineDomain\lib'.
  3. Starten Sie die WebLogic-Administrationskonsole über:
    http://localhost:7001/console

  4. Klicken Sie in der linken Spalte unter 'Change Center' auf 'Lock & Edit'.

  5. Klicken Sie in der linken Spalte unter 'Domain Structure' auf das '[+]' vor 'Services', das '[+]' vor 'JDBC' und auf 'Data Sources'.

  6. Klicken Sie in der Mitte unter 'Data Sources' auf 'New' und geben Sie ein:

    Name: MeinMySqlDataSourceName
    JNDI Name: jdbc/MeinDatasourceJndiName
    Database Type: MySQL
    Database Driver: com.mysql.jdbc.Driver
    'Next'
    'Next'
    Database Name: MeineDb   [anpassen!]
    Host Name: 192.168.0.100   [anpassen!]
    Port: 3306
    Database User Name: root
    Password: mysqlpwd
    Confirm Password: mysqlpwd
    'Next'
    URL überprüfen: jdbc:mysql://192.168.0.100:3306/MeineDb
    'Test Configuration'
    'Next'
    Unter 'Servers': Checkbox vor dem gewünschten Server aktivieren.
    'Finish'
  7. Klicken Sie in der linken Spalte auf 'Activate Changes'.

  8. Sehen Sie sich das Ergebnis an in: 'WebLogic\user_projects\domains\MeineDomain\config\jdbc\MeinMySqlDataSourceName-????-jdbc.xml'.

  9. Lesen Sie die Hinweise in: http://edocs.bea.com/wls/docs92/jdbc_admin.



JNDI-Einträge anzeigen

JNDI (Java Naming and Directory Interface) bietet einen Namens- und Verzeichnisdienst, über den Objekte und Dienste gefunden und verfügbar gemacht werden.

Besonders zu Beginn kann es sehr hilfreich sein, die genauen Namen aller JNDI-Einträge anzeigen zu lassen. Zum Beispiel der Name für das 'UserTransaction'-Objekt heißt bei den verschiedenen Java EE Application Servern unterschiedlich.

Führen Sie hierfür das Testprogramm unter jee-jndi.htm#Auslesen-Namen-im-JNDI aus.



EJB erstellen und deployen

Um EJBs zu erstellen und zu deployen führen Sie zuerst die unter
jee-ejb.htm#GemeinsameDateien-fuer-Beispiele und dann die unter
jee-ejb.htm#Beispiel-StatefulSessionBean und
jee-ejb.htm#Beispiel-CMP-EntityBean beschriebenen Schritte aus.



Webanwendung mit Servlet, JSP, JavaBean, EJB-Zugriff und DB-Zugriff

  1. Installieren Sie sowohl ein aktuelles Java SE JDK (z.B. JDK 6) als auch Ant, zum Beispiel wie beschrieben unter java-install.htm.

  2. Legen Sie für eine Projektverzeichnisstruktur folgende in eckigen Klammern dargestellten Verzeichnisse an:

    [\MeinWorkspace]
      `- [MeineWebApp]
           |- [lib]
           |    `- servlet.jar
           |- [src]
           |    |- [meinjavabeanpkg]
           |    |- [meinservletpkg]
           |    `- [meinsessionbeanpkg]
           `- [webapp]
                `- [WEB-INF]
                     `- [lib]
    
  3. Kopieren Sie die 'servlet.jar'-Lib (bzw. 'servlet-api.jar'-Lib) in das '<Projektverzeichnis>\lib'-Verzeichnis.
    Je nach Java EE Application Server finden Sie diese Lib in:
    BEA WebLogic: WebLogic\workshop92\eclipse\plugins\org.eclipse.tomcat_4.1.30.1
    IBM WebSphere: IbmWebSphere\AppServer\deploytool\itp\plugins\org.eclipse.tomcat_4.1.30.1
    Tomcat: Tomcat\common\lib

  4. Speichern Sie im Verzeichnis '<Projektverzeichnis>\src\meinservletpkg' die folgende Servlet-Datei 'MeinServlet.java':

    package meinservletpkg;
    
    import java.io.*;
    import javax.servlet.*;
    import javax.servlet.http.*;
    
    public class MeinServlet extends HttpServlet
    {
      public void doGet( HttpServletRequest requ, HttpServletResponse resp )
      throws ServletException, IOException
      {
        resp.setContentType( "text/html" );
        PrintWriter out = resp.getWriter();
        out.println( "<html>" );
        out.println( "Hallo, mein erstes Servlet meldet sich." );
        out.println( "</html>" );
        out.close();
      }
    }
    
  5. Speichern Sie im Verzeichnis '<Projektverzeichnis>\src\meinjavabeanpkg' die folgende JavaBean-Datei 'MeineJavaBean.java':

    package meinjavabeanpkg;
    
    import java.text.SimpleDateFormat;
    import java.util.Date;
    
    public class MeineJavaBean
    {
      public String getDateString()
      {
        return (new SimpleDateFormat("yyyy-MM-dd, HH:mm:ss")).format(new Date()) + " h";
      }
    }
    
  6. Speichern Sie im Verzeichnis '<Projektverzeichnis>\src\meinsessionbeanpkg' das folgende EJB-Remote-Interface 'IHelloWorld.java':

    package meinsessionbeanpkg;
    
    public interface IHelloWorld
    {
      String  sayHello();
      Integer getCount();
    }
    
  7. Speichern Sie im Verzeichnis '<Projektverzeichnis>\src\meinsessionbeanpkg' das folgende EJB-Home-Interface 'IHelloWorldHome.java':

    package meinsessionbeanpkg;
    
    public interface IHelloWorldHome
    {
      public IHelloWorld create();
      public IHelloWorld create( String myname );
    }
    
  8. Speichern Sie im Verzeichnis '<Projektverzeichnis>\webapp' die folgende Start-Index-Datei 'index.jsp':

    <html>
    <head><title>Meine Start-Seite</title></head>
    <body>
    <h1>Meine Start-Seite (index.jsp)</h1>
    <p><a href="helloservlet">helloservlet</a></p>
    <p><a href="HelloJSP.jsp">HelloJSP.jsp</a></p>
    <p><a href="HelloJavaBean.jsp">HelloJavaBean.jsp</a></p>
    <p><a href="HelloEJB.jsp">HelloEJB.jsp</a></p>
    <p><a href="HelloDB.jsp">HelloDB.jsp</a></p>
    </body>
    </html>
    
  9. Speichern Sie im Verzeichnis '<Projektverzeichnis>\webapp' die folgende JSP-Datei 'HelloJSP.jsp':

    <%@ page import="java.text.SimpleDateFormat" %>
    <%@ page import="java.util.Date" %>
    
    <html>
    <head><title>Hello JSP</title></head>
    <body>
    <h2>Hallo, meine erste JSP-Seite meldet sich.</h2>
    <%= request.getRemoteHost() %>,
    <%= (new SimpleDateFormat("yyyy-MM-dd, HH:mm:ss")).format(new Date()) + " h" %>
    </body>
    </html>
    
  10. Speichern Sie im Verzeichnis '<Projektverzeichnis>\webapp' die folgende JSP-Datei 'HelloJavaBean.jsp':

    <%@ page import="meinjavabeanpkg.MeineJavaBean" %>
    
    <html>
    <head><title>Hello JavaBean</title></head>
    <body>
    <h2>Hallo, meine JSP-Seite mit JavaBean meldet sich.</h2>
    <%= request.getRemoteHost() %><br>
    <%
      MeineJavaBean jb = new MeineJavaBean();
      out.println( jb.getDateString() );
    %>
    </body>
    </html>
    
  11. Voraussetzung für die folgende JSP-Seite ist eine korrekt im Java EE Application Server deployte 'HelloWorld'-EJB, wie oben unter EJB erstellen und deployen beschrieben ist.

    Speichern Sie im Verzeichnis '<Projektverzeichnis>\webapp' die folgende JSP-Datei 'HelloEJB.jsp':

    <%@ page import="javax.naming.*" %>
    <%@ page import="javax.rmi.PortableRemoteObject" %>
    <%@ page import="meinsessionbeanpkg.*" %>
    
    <html>
    <head><title>Hello EJB</title></head>
    <body>
    <h2>Hallo, meine JSP-Seite mit EJB-Zugriff meldet sich.</h2>
    <%
      Context ctx = new InitialContext();
      // Je nach Java EE Application Server bzw. Deployment-Descriptor:
      //   "HelloWorld" oder
      //   "meinsessionbeanpkg.IHelloWorldHome"
      Object  ref = ctx.lookup( "HelloWorld" );
      IHelloWorldHome home = (IHelloWorldHome) PortableRemoteObject.narrow(
                                                 ref, IHelloWorldHome.class );
      IHelloWorld helloWorld = home.create();
      out.println( helloWorld.sayHello() + "<br>" );
      out.println( helloWorld.sayHello() + "<br>" );
      out.println( helloWorld.getCount() + "<br>" );
    %>
    </body>
    </html>
    

    (Bezüglich EJB und 'ctx.lookup()' siehe: jee-ejb.htm und jee-jndi.htm.)

  12. Voraussetzung für die folgende JSP-Seite ist die Einrichtung einer DataSource im Java EE Application Server, zum Beispiel so wie beschrieben für BEA WebLogic und Sun GlassFish (ansonsten können Sie auf diese JSP-Seite auch verzichten).

    Speichern Sie im Verzeichnis '<Projektverzeichnis>\webapp' die folgende JSP-Datei 'HelloDB.jsp':

    <%@ page import="java.sql.*" %>
    <%@ page import="java.util.*" %>
    <%@ page import="javax.naming.*" %>
    <%@ page import="javax.sql.DataSource" %>
    <%@ page import="javax.transaction.*" %>
    
    <html>
    <head><title>Hello DB</title></head>
    <body>
    <h2>Hallo, meine JSP-Seite mit Datenbank-Zugriff meldet sich.</h2>
    <%
      Context   ctx = new InitialContext();
      DataSource ds = (DataSource) ctx.lookup( "jdbc/MeinDatasourceJndiName" );
      Connection cn = null;
      Statement  st = null;
      ResultSet  rs = null;
      try {
        cn = ds.getConnection();
        st = cn.createStatement();
        rs = st.executeQuery( "Select * from MeineTestTabelle" );
        if( rs.next() ) out.println( "Ergebnis: " + rs.getString( 1 ) + "<br>" );
        out.println( cn.getMetaData().getDatabaseProductName() + ", " );
        out.println( cn.getMetaData().getDatabaseProductVersion() + "<br>" );
      } finally {
        try { if( null != rs ) rs.close(); } catch( Exception ex ) {}
        try { if( null != st ) st.close(); } catch( Exception ex ) {}
        try { if( null != cn ) cn.close(); } catch( Exception ex ) {}
      }
    %>
    </body>
    </html>
    

    Passen Sie 'MeinDatasourceJndiName' und 'MeineTestTabelle' an Ihre DataSource an.

  13. Speichern Sie im Verzeichnis '<Projektverzeichnis>\webapp\WEB-INF' die folgende Webanwendungs-Konfigurations-Datei 'web.xml':

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE web-app PUBLIC
      '-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN'
      'http://java.sun.com/dtd/web-app_2_3.dtd'>
    <web-app>
      <display-name>Meine WebApp</display-name>
      <servlet>
        <servlet-name>MeinServletName</servlet-name>
        <servlet-class>meinservletpkg.MeinServlet</servlet-class>
      </servlet>
      <servlet-mapping>
        <servlet-name>MeinServletName</servlet-name>
        <url-pattern>/helloservlet</url-pattern>
      </servlet-mapping>
      <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
      </welcome-file-list>
    </web-app>
    
  14. Speichern Sie im Verzeichnis '<Projektverzeichnis>' die folgende Ant-Datei 'build.xml':

    <project name="MeinWebAppProjekt" default="usage">
      <!-- Overwrite the following props in a 'build.properties' file:
      <property name="deploy.dir" value="..." />
      -->
      <property file="build.properties" />
      <property name="app.name"   value="MeineWebApp" />
      <property name="deploy.dir" value="dist" />
      <property name="dist.dir"   value="dist" />
      <property name="lib.dir"    value="lib" />
      <property name="src.dir"    value="src" />
      <property name="webapp.dir" value="webapp" />
      <property name="WEBINF.dir" value="${webapp.dir}/WEB-INF" />
      <path id="compile.classpath">
        <fileset dir="${lib.dir}" includes="*.jar" />
        <fileset dir="${WEBINF.dir}/lib" />
        <pathelement path="${WEBINF.dir}/classes" />
      </path>
      <target name="usage">
        <echo message="Availiable Targets" />
        <echo message="  clean     : Delete ${WEBINF.dir}/classes, ${dist.dir}" />
        <echo message="  compile   : Compile from ${src.dir} to ${WEBINF.dir}/classes" />
        <echo message="  create-war: Create ${dist.dir}/${app.name}.war" />
        <echo message="  deploy-war: Copy ${dist.dir}/${app.name}.war to ${deploy.dir}" />
      </target>
      <target name="clean"
              description="Delete ${WEBINF.dir}/classes, ${dist.dir}">
        <delete dir="${WEBINF.dir}/classes" />
        <delete dir="${dist.dir}" />
      </target>
      <target name="compile"
              description="Compile from ${src.dir} to ${WEBINF.dir}/classes">
        <mkdir dir="${WEBINF.dir}/lib" />
        <mkdir dir="${WEBINF.dir}/classes" />
        <javac srcdir="${src.dir}" destdir="${WEBINF.dir}/classes">
          <classpath refid="compile.classpath" />
        </javac>
        <copy todir="${WEBINF.dir}/classes">
          <fileset dir="${src.dir}" excludes="**/*.java" />
        </copy>
      </target>
      <target name="create-war" depends="compile"
              description="Create ${dist.dir}/${app.name}.war">
        <mkdir dir="${dist.dir}" />
        <war destfile="${dist.dir}/${app.name}.war" webxml="${WEBINF.dir}/web.xml">
          <fileset dir="${webapp.dir}" includes="**/*.*"
                   excludes="**/web.xml, **/servlet*.jar, **/junit*.jar" />
        </war>
      </target>
      <target name="deploy-war" depends="create-war"
              description="Copy ${dist.dir}/${app.name}.war to ${deploy.dir}">
        <copy todir="${deploy.dir}" preservelastmodified="true">
          <fileset dir="${dist.dir}" includes="${app.name}.war" />
        </copy>
      </target>
    </project>
    
  15. Falls Ihr Java EE Application Server für Auto-Deployment konfiguriert ist:
    Speichern Sie im Verzeichnis '<Projektverzeichnis>' eine Properties-Datei 'build.properties' mit der Angabe des Auto-Deployment-Verzeichnisses.

    Für BEA WebLogic zum Beispiel so:

    deploy.dir=C:/WebLogic/user_projects/domains/MeineDomain/autodeploy
    

    Für Sun GlassFish V2 zum Beispiel so:

    deploy.dir=C:/GlassFish/glassfish/domains/domain1/autodeploy
    

    Für JBoss zum Beispiel so:

    deploy.dir=/JBoss/server/default/deploy
    
  16. Ihr Projektverzeichnis muss jetzt so aussehen ('dist' und 'classes' erscheinen erst nach dem 'Ant'-Lauf):

    [\MeinWorkspace]
      `- [MeineWebApp]
           |- [dist]
           |    `- ...
           |- [lib]
           |    `- servlet.jar
           |- [src]
           |    |- [meinjavabeanpkg]
           |    |    `- MeineJavaBean.java
           |    |- [meinservletpkg]
           |    |    `- MeinServlet.java
           |    `- [meinsessionbeanpkg]
           |         |- IHelloWorld.java
           |         `- IHelloWorldHome.java
           |- [webapp]
           |    |- [WEB-INF]
           |    |    |- [classes]
           |    |    |     `- ...
           |    |    |- [lib]
           |    |    `- web.xml
           |    |- HelloDB.jsp
           |    |- HelloEJB.jsp
           |    |- HelloJavaBean.jsp
           |    |- HelloJSP.jsp
           |    `- index.jsp
           |- build.properties
           `- build.xml
    
  17. Falls Ihr Java EE Application Server für Auto-Deployment konfiguriert ist:

    Öffnen Sie ein Kommandozeilenfenster und geben Sie die folgenden Kommandos ein:

    cd \MeinWorkspace\MeineWebApp

    ant deploy-war

    Im Auto-Deployment-Verzeichnis (z.B. 'WebLogic\user_projects\domains\MeineDomain\autodeploy') wird das Webarchiv 'MeineWebApp.war' generiert und vom Java EE Application Server automatisch deployt.

  18. Falls Ihr Java EE Application Server nicht für Auto-Deployment konfiguriert ist:

    Öffnen Sie ein Kommandozeilenfenster und geben Sie die folgenden Kommandos ein:

    cd \MeinWorkspace\MeineWebApp

    ant create-war

    Im '<Projektverzeichnis>\dist'-Verzeichnis wird das Webarchiv 'MeineWebApp.war' generiert.

    Deployen Sie diese .war-Datei über die Administrationskonsole des Java EE Application Servers, zum Beispiel für BEA WebLogic über 'http://localhost:7001/console'.

  19. Testen Sie Ihre Webanwendung: Klicken Sie für die einzelnen Tests nacheinander auf die Links der Startseite:

    BEA WebLogic: http://localhost:7001/MeineWebApp
    Sun GlassFish V2: http://localhost:8080/MeineWebApp
    Andere Java EE Application Server: Eventuell andere Portnummer einsetzen
  20. Falls Sie beim Compilieren eine Fehlermeldung ähnlich zu '...\MeineWebApp\src\meinservletpkg\MeinServlet.java: package javax.servlet does not exist' erhalten, fehlt die 'servlet*.jar'-Library.

    Falls Sie eine Fehlermeldung ähnlich zu 'javax.servlet.ServletException: javax.naming.NameNotFoundException: HelloWorld not found' erhalten, erwartet Ihr Java EE Application Server einen anderen JNDI-Namen. Probieren Sie in 'webapp/HelloEJB.jsp' beim 'ctx.lookup()'-Aufruf zum Beispiel 'meinsessionbeanpkg.IHelloWorldHome' statt 'HelloWorld' und führen Sie obiges 'ant'-Kommando erneut aus. Oder: Sehen Sie mit dem JNDI-Auslese-Programm nach, welchen JNDI-Namen Ihr Java EE Application Server vergeben hat.

    Falls Sie beim Application-Server-Deployment auf der Serverkonsole eine Fehlermeldung ähnlich zu 'java.lang.UnsupportedClassVersionError: Bad version number in .class file' erhalten, müssen Sie die Webanwendung mit derselben Java-Version kompilieren, die Ihr Java EE Application Server verwendet. Das kann für BEA WebLogic zum Beispiel folgendermaßen erfolgen (bitte Pfade anpassen):
    cd \MeinWorkspace\MeineWebApp
    set JAVA_HOME=C:\WebLogic\jdk150_06
    set PATH=%JAVA_HOME%\bin;%PATH%
    ant clean deploy-war

    Falls Sie im Server-Logfile eine Fehlermeldung ähnlich zu 'java.lang.IllegalStateException: Class interface meinsessionbeanpkg.IHelloWorldHome must extend java.rmi.Remote' erhalten, müssen Sie 'IHelloWorldHome.java' erweitern wie in jee-ejb.htm#StatefulSessionBean-HomeInterface. Allerdings benötigen Sie dann auch zusätzlich eine entsprechende .jar-lib.

    Falls Sie im Server-Logfile eine Fehlermeldung ähnlich zu 'java.rmi.MarshalException: org.omg.CORBA.MARSHAL: vmcid: Maybe' erhalten, können Sie versuchen, die 'MeineWebApp.war' und 'HelloWorldBean.jar' nicht getrennt, sondern gemeinsam in einer '.ear'-Datei zu deployen.



Classloader-Reihenfolge

Ab WebLogic 9.2 ist die Classloader-Reihenfolge geändert worden. Falls Sie auf Probleme mit unterschiedlichen Versionen eigener und bereits im 'weblogic.jar' vorhandenen Bibliotheken stoßen (z.B. mit "org.apache.*" oder "javax.jws.*"), dann versuchen Sie je nach Anwendung einen der beiden oder beide folgenden Vorschläge:



Monitoring-Tools für BEA WebLogic

Mit den Monitoring-Tools für BEA WebLogic können der Speicherverbrauch, GC-Aktivitäten, Threads, MBeans, die VM u.a. des BEA WebLogic beobachtet werden.

Hilfreich kann sein, dass im laufenden Betrieb Snapshots von Thread-Stacktraces einzelner Threads erstellt werden können. Wenn man dies vielleicht zehnmal macht, ist die Wahrscheinlichkeit groß, auf Methoden mit großem Zeitverbrauch zu stoßen.

Thread-Stacktrace-Dump mit "Strg + Pause"

Management Console unter BEA WebLogic 8.1

  1. Der BEA WebLogic 8.1 muss mit dem Parameter "-Xmanagement" gestartet werden.
    Dies kann zum Beispiel im Startkommando C:\WebLogic\user_projects\domains\MeineDomain\startWebLogic.cmd erfolgen, zum Beispiel so:

    set JAVA_OPTIONS=-Xdebug -Xrunjdwp:transport=dt_socket,address=8001,server=y,suspend=n -Xmanagement

  2. Die JRockit Management Console kann zum Beispiel mit folgendem Kommando gestartet werden:

    start /b C:\WebLogic\jrockit81sp6_142_10\bin\javaw -jar C:\WebLogic\jrockit81sp6_142_10\console\ManagementConsole.jar

  3. Unter 'Connection' | 'New Connection ...' wird der BEA-WebLogic-Server eingetragen.
  4. Im laufenden Betrieb können über 'Tools' | 'View Thread Stack Dump' im laufenden Betrieb zu allen Threads Stacktrace-Snapshots erzeugt werden.

Andere Tools für Profiling, Diagnose und Monitoring



Profiling mit YourKit 7.5.6 auf BEA WebLogic

  1. YourKit muss installiert sein.

  2. Der BEA WebLogic muss mit speziellen Optionen gestartet werden. Eine entsprechende Batchdatei kann von YourKit automatisch erzeugt werden über 'Tools' | 'Integrate with J2EE Server...' | 'BEA WebLogic 9.x/10' und Angabe der bisherigen startWebLogic.cmd-Datei. Alternativ kann auch selbst eine entsprechende Batchdatei erstellt werden:

    set PATH=C:\Programme\YourKit Java Profiler 7.5.6\bin\win32;%PATH%
    set JAVA_OPTIONS=-agentlib:yjpagent=sessionname=WebLogic %JAVA_OPTIONS%
    set JAVA_VENDOR=Bea
    set DOMAIN_HOME=C:\WebLogic\user_projects\domains\MeineDomain
    call "%DOMAIN_HOME%\bin\startWebLogic.cmd" %*
    
  3. Die Verbindung von YourKit zum lokalen BEA WebLogic wird hergestellt über: 'File' | 'Open Profiling Session...' | 'Connect to locally running profiled application...'.

    Die Verbindung von YourKit zu einem entfernten BEA WebLogic wird hergestellt über: 'File' | 'Open Profiling Session...' | 'Connect to remote application...'.

  4. Unter http://www.yourkit.com/docs gibt es Hilfe und einführende Demos.

  5. In Produktionsumgebungen sollten einige Optionen eher nicht verwendet werden, da sie zu Timeouts bis hin zum mehrere Minuten langen Stillstand führen (z.B. "CPU Profiling" mit "Tracing" und "Capture Memory Snapshot"). Siehe hierzu: Profiling overhead.

  6. "CPU Profiling" (Laufzeiten von Methoden und SQL-Kommandos):

    YourKit-CpuProfiling.png - Oben in der Toolbar den Mauszeiger auf das "Start CPU Profiling"-Icon mit der Uhr und dem grünen Pfeil positionieren, aber noch nicht klicken.
    - Entweder "Sampling" für einfache Messungen oder "Tracing" für zeitaufwändige vollständige Messungen wählen. (Falls "Tracing" gewählt wird: Eventuell muss der JTA-Timeout erhöht werden.)
    - "Profile J2EE" aktivieren.
    YourKit-CpuProfiling-CaptureSnapshot.png - Zum Starten der Messung auf das Icon mit der Uhr und dem grünen Pfeil klicken ("Start CPU Profiling").
    - Zum Beenden der Messung (z.B. nach 5 Minuten) auf das Icon mit der Diskette klicken ("Capture Performance Snapshot").

    In der sich öffnenden Snapshot-Ansicht:

    Oben links unter "CPU statistics" die "Call tree"-, "Hot spot"- und "Method list"-Optionen anklicken, um die gewünschten Methoden zu finden.
    - Im rechten oberen Fenster gewünschte Methode markieren.
    - Im rechten unteren Fenster per "Back Traces"- und "Merged Callees"-Tabulatorreiter umschalten zwischen Aufrufern und aufgerufenen Methoden.
    - Mit 'Strg + S' oder der rechten Maustaste kann in eine .csv-Datei exportiert werden. Wenn in jeder Zeile nach der schließenden ')'-Klammer die Kommata durch Semikolons ersetzt werden, kann die .csv-Datei in Excel bearbeitet werden.

    Oben links unter "J2EE statistics" auf "SQL" klicken, um SQL-Laufzeiten zu sehen.
    - Wenn im rechten oberen Fenster ein SQL-Kommando markiert wird, erscheinen im rechten unteren Fenster die aufrufenden Methoden.

  7. "Memory Snapshot" (Speicherverbrauch und Memory Leaks):

    YourKit-GarbageCollection-CaptureMemorySnapshot.png - Für vergleichbare Ausgangsbedingungen sollte oben in der Toolbar über das Mülleimer-Icon eine explizite "Force Garbage Collection" ausgelöst werden.
    - Auf das Toolbar-Icon "Capture Memory Snapshot" klicken und warten, bis die Snapshot-Erstellung fertig ist. (Eventuell muss der JTA-Timeout erhöht werden.)
    - In dem geöffneten Snapshot oben links auf den Tabulatorreiter "Memory", oben links unter "Statistics" auf "Class list" und dann oben rechts auf "Calculate" klicken und warten, bis die Berechnung fertig ist (kann lange dauern).
    - "Shallow Size" gibt nur die Größe des Objekts selbst an. "Retained Size" schließt dagegen alle referenzierten Objekte mit ein.
    - In der Eingabezeile oberhalb des rechten oberen Fensters kann ein Klassenfilter gesetzt werden (z.B. "de.meinefirma.meinpackage").
    - Im rechten oberen Fenster eine Klasse markieren, im rechten unteren Fenster ein Objekt markieren und die Optionen unter der rechten Maustaste ansehen (z.B. "Paths from GC Roots" und "Selected Objects").
    - Oben links unter "Statistics" auf "Biggest objects (dominators)" klicken und Ergebnis ansehen.
    - Oben links unter "Statistics" auf "Inspections" klicken, "Run All Inspections" wählen und Ergebnisse ansehen (z.B. "Duplicate Strings", "Null Fields", "Sparse Arrays", "Zero Length Arrays", "Possible leaks").
    YourKit-GarbageCollection.png - Insbesondere für Vergleiche sollte vor jedem einzelnen "Memory Snapshot" eine explizite "Force Garbage Collection" ausgelöst werden (über das Toolbar-Mülleimer-Icon).
    - Wenn vor dem Start und nach Beendigung einer Anwendung jeweils ein "Memory Snapshot" erstellt wird, können diese verglichen und so eventuell Memory Leaks gefunden werden (über 'File' | 'Compare Snapshot with...').
    YourKit-AdvanceObjectGenerationNumber.png - Alternativ kann oben in der Toolbar über das Icon "Advance Object Generation Number" die Snapshot-Generierungsnummerierung um eins erhöht werden. Der folgende Snapshot wird dann unter "Generation #2" usw. aufgeführt und die verschiedenen Snapshots können verglichen werden.

  8. "Object Allocation Recording" (Garbage Collection vieler oder großer temporärer Objekte):

    YourKit-GarbageCollection.png - Für vergleichbare Ausgangsbedingungen sollte oben in der Toolbar über das Mülleimer-Icon eine explizite "Force Garbage Collection" ausgelöst werden.
    - Oben in der Toolbar den Mauszeiger auf das "Start Object Allocation Recording"-Icon (mit dem Speichersymbol und dem grünen Pfeil) positionieren, aber noch nicht klicken.
    YourKit-ObjectAllocationRecording.png - Normalerweise die beiden Einstellungen ("10" und "1048576") so lassen.
    - Auf das "Start Object Allocation Recording"-Icon klicken.
    YourKit-CaptureMemorySnapshot.png - Nach einigen Minuten auf das Toolbar-Icon "Capture Memory Snapshot" klicken und warten, bis die Snapshot-Erstellung fertig ist.
    - In dem geöffneten Snapshot auf den Tabulatorreiter "Garbage Collection" und dann wahlweise auf "Call tree ...", "Hot spots ..." oder "Method list" klicken und verdächtige Methoden oder Objekte suchen.



Links auf weiterführende Informationen





Weitere Themen: andere TechDocs | JSP | Java EE | EJB | SQL
© 1998-2008 Torsten Horn, Aachen