Oracle WebLogic 12.1.1

+ andere TechDocs
+ Java EE
+ EJB
+ Oracle 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: GlassFish, JBoss, Oracle WebLogic, IBM WebSphere und Apache Geronimo.

Falls Sie nicht Oracle WebLogic 12.1.1, sondern ältere WebLogic-Versionen einsetzen, finden Sie geeignete Hinweise eher unter Oracle WebLogic 10.3.5, Oracle WebLogic 10.3.4, Oracle WebLogic 10.3.3, Oracle WebLogic 10.3.2, Oracle WebLogic 10.3.0, BEA WebLogic 10 und BEA WebLogic 9.

Die von WebLogic 12.1.1 unterstützten Standards und die Unterschiede zu Vorgängerversionen finden Sie unter What's New in Oracle WebLogic Server.



Inhalt

  1. Installation des Oracle WebLogic Server 12.1.1 unter Windows mit dem Configuration Wizard
  2. Einrichtung einer Data Source zu einer MySQL-Datenbank
  3. Silent-Installation und Konfiguration mit WLST
  4. SQLAuthenticator per WLST im WebLogic konfigurieren
  5. Silent-Installation für WebLogic 64 Bit
  6. Installation als Windows-Service
  7. WLST, configToScript, Templates, Pack/Unpack
  8. JNDI-Einträge anzeigen
  9. EJB erstellen und deployen
  10. Webanwendung mit Servlet, JSP, JavaBean, EJB-Zugriff und DB-Zugriff
  11. Kompatibilitätsprobleme
  12. Monitoring-Tools für Oracle WebLogic
  13. Profiling mit YourKit 7.5.6 auf WebLogic
  14. Links auf weiterführende Informationen


Installation des Oracle WebLogic Server 12.1.1 unter Windows mit dem Configuration Wizard

Im Folgenden wird die manuelle Installation beschrieben. Alternativ können Sie das weiter unten beschriebene WLST verwenden.

Basisinstallation mit dem "Oracle Installer"

  1. Downloaden Sie Oracle WebLogic Server von http://www.oracle.com/technetwork/middleware/weblogic/downloads (z.B. 'wls1211_win32.exe').
  2. Starten Sie den downgeloadeten "Oracle Installer" (z.B. 'wls1211_win32.exe') mit Admin-Rechten (rechte Maustaste, "Als Administrator ausführen").
    In der folgenden Beschreibung wird davon ausgegangen, dass Sie in das "Middleware Home Directory" 'C:\WebLogic' installieren und ansonsten immer mit "Next" fortfahren.
  3. Beenden Sie den "Oracle Installer".

Konfiguration mit dem "Configuration Wizard"

  1. Starten Sie den "Configuration Wizard" über:
    'Start' | 'Alle Programme' | 'Oracle WebLogic' | 'WebLogic Server' | 'Tools' | 'Configuration Wizard'.
  2. Wählen Sie 'Create a new WebLogic domain'.
  3. Als 'Domain name' tragen Sie ein: 'MeineDomain'.
  4. Im Folgenden wird davon ausgegangen, dass Sie als 'User name' 'weblogic' und 'User password' 'weblogic0' eintragen.
  5. Sie können wahlweise das Sun JDK oder das JRockit SDK wählen.
  6. Beenden Sie den Configuration Wizard mit 'Create' | 'Done'.
  7. Sehen Sie sich das neu entstandene Verzeichnis

    C:\WebLogic\user_projects\domains\MeineDomain

    und darunter insbesondere die Konfigurationsdatei config\config.xml an.

  8. 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

  9. Die WebLogic-Administrationskonsole erreichen Sie über (Username/Password wie oben vergeben):

    http://localhost:7001/console

    Lesen Sie die Hinweise unter:

    http://download-llnw.oracle.com/docs/cd/E12840_01/wls/docs103/ConsoleHelp/core/

  10. Sehen Sie sich die WebLogic-Doku an:

    http://docs.oracle.com/cd/E21764_01/wls.htm

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 auf JMX basierende Monitoring-Tools verwenden wollen, muss das Startkommando um den "-Djavax.management.builder.initial=weblogic.management.jmx.mbeanserver.WLSMBeanServerBuilder"- und zusätzlich entweder um den "-Dcom.sun.management.jmxremote"-Parameter (falls Sun-JDK) oder um den "-Xmanagement"-Parameter (falls JRockit) erweitert werden (siehe hierzu Startparameter).



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. Für einige Datenbanken, und so auch für MySQL, ist der benötigte JNDI-Treiber bereits im WebLogic-Installationspaket enthalten. In diesem Fall brauchen Sie ihn nicht gesondert zu installieren.

  3. Falls Sie einen anderen nicht im WebLogic-Installationspaket enthaltenen JDBC-Treiber einbinden wollen (z.B. jt400.jar für AS/400): Es genügt oft nicht, diesen JDBC-Treiber einfach in das Domain-lib-Verzeichnis (z.B. C:\WebLogic\user_projects\domains\MeineDomain\lib) zu kopieren. Stattdessen müssen Sie ihn in ein anderes Verzeichnis kopieren (z.B. <MeineDomain>\config\jdbc) und den Pfad zum WebLogic-CLASSPATH hinzufügen, zum Beispiel indem Sie unter Windows in der startWebLogic.cmd als erste Zeile einfügen:

    set CLASSPATH=config\jdbc\jt400.jar

  4. Starten Sie bei laufendem WebLogic die WebLogic-Administrationskonsole über:
    http://localhost:7001/console

  5. Je nach WebLogic-Version (und Einstellung) müssen Sie eventuell in der linken Spalte oben links unter 'Change Center' auf 'Lock & Edit' klicken.

  6. Klicken Sie in der linken Spalte unter 'Domain Structure' ('Domainstruktur') auf das '[+]' vor 'Services', das '[+]' vor 'JDBC' und auf 'Data Sources' ('Datenquellen').

  7. Klicken Sie in der Mitte unter 'Data Sources' auf 'New' ('Neu') 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: localhost   [anpassen!]
    Port: 3306
    Database User Name: root
    Password: mysqlpwd
    Confirm Password: mysqlpwd
    'Next'
    URL überprüfen: jdbc:mysql://localhost:3306/MeineDb
    'Test Configuration'
    'Next'
    Unter 'Servers': Checkbox vor dem gewünschten Server aktivieren.
    'Finish'
  8. Je nach WebLogic-Version (und Einstellung) müssen Sie eventuell in der linken Spalte auf 'Activate Changes' klicken.

  9. Sehen Sie sich die konfigurierten Einstellungen an in: 'C:\WebLogic\user_projects\domains\MeineDomain\config\jdbc\MeinMySqlDataSourceName-5723-jdbc.xml'.

  10. Lesen Sie die Hinweise in: http://download-llnw.oracle.com/docs/cd/E12840_01/wls/docs103/jdbc_admin/.

  11. Alternativ zur hier beschriebenen manuellen Installation können Sie das im Folgenden beschriebene WLST verwenden.



Silent-Installation und Konfiguration mit WLST

Falls Sie bestimmte WebLogic-Installations- und Konfigurationsvorgänge mehrfach durchführen müssen, kann sich der Einsatz von Silent-Installation und WLST ("WebLogic Scripting Tool") lohnen.

Im Folgenden werden eine Silent-Installation und ein WLST-Jython-Skript vorgestellt, welche die zuvor gezeigten manuellen Installations- und Konfigurationsschritte für die Basisinstallation, die Domain und die Data Source automatisieren.

  1. Es wird eine installierte MySQL-Datenbank voraussetzt (wie oben beschrieben).
  2. Downloaden Sie Oracle WebLogic Server von http://www.oracle.com/technetwork/middleware/weblogic/downloads (z.B. 'wls1211_win32.exe') in ein beliebiges Verzeichnis (z.B. C:\WebLogic-silent-WLST).
  3. Legen Sie in diesem Verzeichnis folgende fünf Dateien an (passen Sie IPs, Pfade und Namen an) (einige Elemente werden erst im Folgekapitel benötigt):

    WebLogic12-Basis-install-silent.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <bea-installer>
      <input-fields>
        <data-value name="BEAHOME"         value="C:\WebLogic" />
        <data-value name="WLS_INSTALL_DIR" value="C:\WebLogic\wlserver_12" />
        <data-value name="COMPONENT_PATHS" value="WebLogic Server/Core Application Server|WebLogic Server/Administration Console|WebLogic Server/Configuration Wizard and Upgrade Framework|WebLogic Server/Web 2.0 HTTP Pub-Sub Server|WebLogic Server/WebLogic JDBC Drivers|WebLogic Server/Third Party JDBC Drivers|WebLogic Server/WebLogic Server Clients|WebLogic Server/Xquery Support" />
      </input-fields>
    </bea-installer>
    

    WebLogic12-DomainDbAuthUser.properties

    _WL_BASIS_DIR=      C:/WebLogic
    _WL_HOME=           C:/WebLogic/wlserver_12
    _WL_START_TEMPL=    C:/WebLogic/wlserver_12/common/templates/domains/wls.jar
    _WL_ADMIN_USER=     weblogic
    _WL_ADMIN_PASSWORD= weblogic0
    _WL_DOMAIN_NAME=    MeineDomain
    _DB_DS_NAME=        MeinMySqlDataSourceName
    _DB_DS_JNDI=        jdbc/MeinDatasourceJndiName
    _DB_DRV=            com.mysql.jdbc.Driver
    _DB_URL=            jdbc:mysql://localhost:3306/MeineDb
    _DB_USR=            root
    _DB_PWD=            mysqlpwd
    _DB_SQL=            SQL SELECT 1
    _DB_GLOB_TX_PROT=   None
    _USER1_NAME=        MeinName1
    _USER1_PWD=         MeinPasswort1
    _USER1_GROUP=       Managers
    _USER2_NAME=        MeinName2
    _USER2_PWD=         MeinPasswort2
    _USER2_GROUP=       Managers
    

    WLST12-Domain-DataSource.py

    #=====================================================================================
    # WLST-Skript zur Konfiguration einer Domain und DataSource im WebLogic.
    # Parameter werden in Properties-Datei gesetzt:
    #   WebLogic12-DomainDbAuthUser.properties
    # Aufruf:
    #   call C:\WebLogic\wlserver_12\server\bin\setWLSEnv.cmd
    #   "%JAVA_HOME%\bin\java" %JVM_ARGS% weblogic.WLST WLST12-Domain-DataSource.py
    #=====================================================================================
    
    def _createDatasource( _db_ds_name, _db_ds_jndi, _db_drv, _db_url, _db_usr, _db_pwd, _db_sql, _db_glob_tx_prot ):
      _datasource_cd_cmo = "/JDBCSystemResource/" + _db_ds_name + "/JdbcResource/" + _db_ds_name
      cd( "/" )
      create( _db_ds_name, "JDBCSystemResource" )
      cd( _datasource_cd_cmo )
      create( "myJdbcDriverParams", "JDBCDriverParams" )
      cd( "JDBCDriverParams/NO_NAME_0" )
      set( "DriverName", _db_drv )
      set( "URL", _db_url )
      set( "PasswordEncrypted", _db_pwd )
      create( "myProps", "Properties" )
      cd( "Properties/NO_NAME_0" )
      create( "user", "Property" )
      cd( "Property/user" )
      cmo.setValue( _db_usr )
      cd( _datasource_cd_cmo )
      create( "myJdbcDataSourceParams", "JDBCDataSourceParams" )
      cd( "JDBCDataSourceParams/NO_NAME_0" )
      set( "JNDIName", java.lang.String( _db_ds_jndi ) )
      set( "GlobalTransactionsProtocol", _db_glob_tx_prot )
      cd( _datasource_cd_cmo )
      create( "myJdbcConnectionPoolParams", "JDBCConnectionPoolParams" )
      cd( "JDBCConnectionPoolParams/NO_NAME_0" )
      set( "TestTableName", _db_sql )
      set( "LoginDelaySeconds", 1 )
      cd( "/" )
      assign( "JDBCSystemResource", _db_ds_name, "Target", "AdminServer" )
      print "---- Datasource '" + _db_ds_name + "' mit JNDI-Namen '" + _db_ds_jndi + "' erstellt."
    
    loadProperties( "WebLogic12-DomainDbAuthUser.properties" )
    readTemplate( _WL_START_TEMPL )
    
    cd( "Servers/AdminServer" )
    set( "ListenAddress", "" )
    set( "ListenPort", 7001 )
    create( "AdminServer", "SSL" )
    cd( "SSL/AdminServer" )
    set( "Enabled", "True" )
    set( "ListenPort", 7002 )
    cd( "/" )
    cd( "Security/base_domain/User/" + _WL_ADMIN_USER )
    cmo.setPassword( _WL_ADMIN_PASSWORD )
    print "---- AdminServer mit Port 7001, SSL-Port 7002 und Admin-User '" + _WL_ADMIN_USER + "' angelegt."
    
    _createDatasource( _DB_DS_NAME, _DB_DS_JNDI, _DB_DRV, _DB_URL, _DB_USR, _DB_PWD, _DB_SQL, _DB_GLOB_TX_PROT )
    
    cd( "/" )
    setOption( "OverwriteDomain", "true" )
    _domain_dir = _WL_BASIS_DIR + "/user_projects/domains/" + _WL_DOMAIN_NAME
    writeDomain( _domain_dir )
    print "---- Fertig: Domain '" + _WL_DOMAIN_NAME + "' im Verzeichnis '" + _domain_dir + "' angelegt."
    
    closeTemplate()
    exit()
    

    WebLogic12-Basis-install-silent-32bit.bat

    @title WebLogic12-Basis-install-silent-32bit.bat
    @echo Achtung: Kann auf langsamen PCs laenger als 10 Minuten dauern.
    wls1211_win32.exe -mode=silent -silent_xml=WebLogic12-Basis-install-silent.xml -log=logs/WebLogic12-Basis-install-silent.log
    

    WLST12-Domain-DataSource.bat

    @setlocal
    call C:\WebLogic\wlserver_12\server\bin\setWLSEnv.cmd
    "%JAVA_HOME%\bin\java" %JVM_ARGS% weblogic.WLST WLST12-Domain-DataSource.py
    @endlocal
    
  4. Falls es noch ein C:\WebLogic-Verzeichnis mit einer alten WebLogic-Installation gibt: Löschen Sie es.

  5. Führen Sie die beiden Batchdateien aus (Achtung: die erste kann auf langsamen PCs über 10 Minuten dauern):

    cd /D C:\WebLogic-silent-WLST

    WebLogic12-Basis-install-silent-32bit.bat

    WLST12-Domain-DataSource.bat

    Die Ausführung benötigt Admin-Rechte. Damit Sie unter Windows nicht erst später während der Ausführung nach Ihrer Zustimmung gefragt werden, können Sie die Batchdatei direkt mit Admin-Rechten starten, entweder indem Sie mit der rechten Maustaste auf die Batchdatei klicken und "Als Administrator ausführen" wählen, oder indem Sie folgendermaßen ein Kommandozeilenfenster mit Admin-Rechten öffnen:
    Start | Alle Programme | Zubehör | mit rechter Maustaste auf "Eingabeaufforderung" | Klick auf "Als Administrator ausführen".

  6. Sehen Sie sich das neu entstandene Verzeichnis C:\WebLogic\user_projects\domains\MeineDomain und darunter insbesondere die Konfigurationsdateien config\config.xml und config\jdbc\MeinMySqlDataSourceName-5723-jdbc.xml an.

  7. Starten und stoppen Sie WebLogic über folgende Kommandozeilenbefehle:

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

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

    Zu den Startoptionen gilt dasselbe wie bereits weiter oben beschrieben.

  8. Falls Sie eine (z.B. per WebLogic-Console erstellte) lauffähige WebLogic-Konfiguration haben, brauchen Sie das dieser Konfiguration entsprechende WLST-Skript nicht von Hand zu erstellen, sondern können es per configToScript()-WLST-Kommando generieren lassen.

Sehen Sie sich zu WLST die Beispiele im Verzeichnis C:\WebLogic\wlserver_12\common\templates\scripts\wlst und die Doku unter http://docs.oracle.com/cd/E12840_01/wls/docs103/config_scripting/index.html, http://docs.oracle.com/cd/E13222_01/wls/docs103/config_scripting/reference.html, http://docs.oracle.com/cd/E12839_01/apirefs.1111/e13945/, http://docs.oracle.com/cd/E12840_01/wls/docs103/pdf/config_scripting.pdf, http://weblogic.sys-con.com/node/48932 und http://wiki.python.org/jython/UserGuide an.



SQLAuthenticator per WLST im WebLogic konfigurieren

WebLogic speichert Benutzer- und Gruppen-Informationen zur Authentifizierung normalerweise über den "DefaultAuthenticator" in einem internen dateibasierten "Embedded LDAP Server".

Falls auch andere Programme (z.B. eingene Java-Anwendungen) auf die Benutzer- und Gruppen-Informationen zugreifen sollen, kann es günstiger sein, diese stattdessen in der Datenbank vorzuhalten. Dies bietet der "SQLAuthenticator"

Voraussetzung: Angelegte DB-Tabellen 'USERS', 'GROUPS' und 'GROUPMEMBERS'

Für den WebLogic-SQLAuthenticator müssen folgendermaßen Tabellen in der Datenbank angelegt werden (vorausgesetzt, Sie verwenden die Default-Tabellen- und -Spaltennamen):

CREATE TABLE USERS  ( U_NAME VARCHAR(200) NOT NULL, U_PASSWORD VARCHAR(50) NOT NULL, U_DESCRIPTION VARCHAR(1000) );
CREATE TABLE GROUPS ( G_NAME VARCHAR(200) NOT NULL, G_DESCRIPTION VARCHAR(1000) NULL );
CREATE TABLE GROUPMEMBERS ( G_NAME VARCHAR(200) NOT NULL, G_MEMBER VARCHAR(200) NOT NULL );
ALTER TABLE USERS  ADD CONSTRAINT PK_USERS  PRIMARY KEY ( U_NAME );
ALTER TABLE GROUPS ADD CONSTRAINT PK_GROUPS PRIMARY KEY ( G_NAME );
ALTER TABLE GROUPMEMBERS ADD CONSTRAINT PK_GROUPMEMS PRIMARY KEY ( G_NAME, G_MEMBER );
ALTER TABLE GROUPMEMBERS ADD CONSTRAINT FK1_GROUPMEMBERS FOREIGN KEY ( G_NAME ) REFERENCES GROUPS ( G_NAME ) ON DELETE CASCADE;

Manuelle Konfiguration eines SQLAuthenticators im WebLogic

  1. WebLogic-Konsole starten: http://localhost:7001/console (weblogic/weblogic0).
  2. Links im Fenster "Domainstruktur" auf "Sicherheits-Realms" klicken.
  3. Rechts in der "Realms"-Tabelle auf "myrealm" klicken.
  4. Im Fenster "Einstellungen für myrealm" oben auf den Tabulatorreiter "Provider" klicken.
  5. In der Tabelle "Authentifizierungsprovider" auf "DefaultAuthenticator" klicken.
  6. Im Fenster "Einstellungen für DefaultAuthenticator" das "Steuerungskennzeichen:" auf "SUFFICIENT" setzen. Speichern.
  7. Links im Fenster "Domainstruktur" wieder auf "Sicherheits-Realms" klicken.
  8. Rechts in der "Realms"-Tabelle auf "myrealm" klicken.
  9. Im Fenster "Einstellungen für myrealm" oben auf den Tabulatorreiter "Provider" klicken.
  10. In der Tabelle "Authentifizierungsprovider" auf den Button "Neu" klicken.
  11. In dem Fenster "Neuen Authentifizierungsprovider erstellen" bei "Name" "MeinSQLAuthenticator" und bei "Typ" "SQLAuthenticator" einstellen. OK.
  12. In der Tabelle "Authentifizierungsprovider" auf "SQLAuthenticator" klicken.
  13. Im Fenster "Einstellungen für SQLAuthenticator" oben auf den Tabulatorreiter "Providerspezifisch" klicken und bei "Datenquellname:" eingeben: "MeinMySqlDataSourceName". "Nur-Text-Kennwörter aktiviert" können Sie in Entwicklungssystemen aktivieren, in Produktion sollte es immer deaktiviert sein. Speichern.
  14. WebLogic beenden und neu starten.
  15. Folgendermaßen können Sie Users und Groups manuell anlegen (falls "Nur-Text-Kennwörter aktiviert" ausgeschaltet ist ("PlaintextPasswordsEnabled=false"), müssen Sie das Passwörter verschlüsselt einsetzen):

    INSERT INTO USERS  VALUES ( 'MeinName', 'MeinPasswort0', 'MeinName' );
    INSERT INTO GROUPS VALUES ( 'Managers', 'Managers' );
    INSERT INTO GROUPMEMBERS VALUES ( 'Managers', 'MeinName' );
    

Automatische Konfiguration eines SQLAuthenticators per WLST im WebLogic

Alternativ zur manuelle Konfiguration eines SQLAuthenticators können Sie folgendermaßen das obige Beispiel Silent-Installation und Konfiguration mit WLST um eine automatische Konfiguration eines SQLAuthenticators per WLST im WebLogic erweitern:

  1. Es wird davon ausgegangen, dass Sie die für das obige Beispiel benötigten Dateien im Verzeichnis C:\WebLogic-silent-WLST angelegt haben.
  2. Legen Sie im selben Verzeichnis C:\WebLogic-silent-WLST folgende weiteren Dateien an:

    WLST12-SQLAuthenticator.py

    #=====================================================================================
    # WLST-Skript zur Konfiguration eines SQLAuthenticators im WebLogic.
    # Parameter werden in Properties-Datei gesetzt:
    #   WebLogic12-DomainDbAuthUser.properties
    # Aufruf:
    #   call C:\WebLogic\wlserver_12\server\bin\setWLSEnv.cmd
    #   "%JAVA_HOME%\bin\java" %JVM_ARGS% weblogic.WLST WLST12-SQLAuthenticator.py
    #=====================================================================================
    
    print "---- Beginn ----"
    loadProperties( "WebLogic12-DomainDbAuthUser.properties" )
    if connected == "false":
       connect( _WL_ADMIN_USER, _WL_ADMIN_PASSWORD )
    edit()
    startEdit()
    
    _DomainName   = cmo.getName()
    _RealmName    = cmo.getSecurityConfiguration().getDefaultRealm().getName()
    _DfltAuth     = cmo.getSecurityConfiguration().getDefaultRealm().lookupAuthenticationProvider( "DefaultAuthenticator" )
    _SqlAuth      = cmo.getSecurityConfiguration().getDefaultRealm().lookupAuthenticationProvider( "MeinSQLAuthenticator" )
    _Realm_cd_cmo = "/SecurityConfiguration/" + _DomainName + "/Realms/" + _RealmName
    print
    print "---- DomainName =", _DomainName
    print "---- RealmName  =", _RealmName
    
    if _DfltAuth != None:
      cd( _Realm_cd_cmo + "/AuthenticationProviders/DefaultAuthenticator" )
      set( "ControlFlag", "SUFFICIENT" )
      print "---- DefaultAuthenticator konfiguriert (ControlFlag = SUFFICIENT)."
    
    if _SqlAuth == None:
      cd( _Realm_cd_cmo )
      cmo.createAuthenticationProvider( "MeinSQLAuthenticator", "weblogic.security.providers.authentication.SQLAuthenticator" )
      cd( _Realm_cd_cmo + "/AuthenticationProviders/MeinSQLAuthenticator" )
      set( "ControlFlag", "OPTIONAL" )
      set( "DataSourceName", _DB_DS_NAME )
      set( "PlaintextPasswordsEnabled", "false" )
      set( "GroupMembershipSearching", "limited" )
      set( "MaxGroupMembershipSearchLevel", "5" )
      print "---- MeinSQLAuthenticator konfiguriert (ControlFlag = OPTIONAL, DataSourceName = " + _DB_DS_NAME + ")."
    
    print "---- Fertig ----"
    print
    save()
    activate(block="true")
    disconnect()
    exit()
    

    WLST12-UsersGroupsMembers.py

    #=====================================================================================
    # WLST-Skript zur Konfiguration von Benutzern und Benutzergruppen im WebLogic.
    # Parameter werden in Properties-Datei gesetzt:
    #   WebLogic12-DomainDbAuthUser.properties
    # Aufruf:
    #   call C:\WebLogic\wlserver_12\server\bin\setWLSEnv.cmd
    #   "%JAVA_HOME%\bin\java" %JVM_ARGS% weblogic.WLST WLST12-UsersGroupsMembers.py
    #=====================================================================================
    
    def _createUserGroupMember( _usr, _pwd, _grp ):
      if _SqlAuth.userExists( _usr ) != 1:
         _SqlAuth.createUser( _usr, _pwd, _usr )
      if _SqlAuth.groupExists( _grp ) != 1:
         _SqlAuth.createGroup( _grp, _grp )
      _SqlAuth.addMemberToGroup( _grp, _usr )
      print "---- User '" + _usr + "' in Group '" + _grp + "' eingetragen."
    
    print "---- Beginn ----"
    loadProperties( "WebLogic12-DomainDbAuthUser.properties" )
    if connected == "false":
       connect( _WL_ADMIN_USER, _WL_ADMIN_PASSWORD )
    _SqlAuth = cmo.getSecurityConfiguration().getDefaultRealm().lookupAuthenticationProvider( "MeinSQLAuthenticator" )
    if _SqlAuth == None:
      print "---- Fehler: MeinSQLAuthenticator muss zuerst angelegt werden. ----"
    else:
      _createUserGroupMember( _USER1_NAME, _USER1_PWD, _USER1_GROUP )
      _createUserGroupMember( _USER2_NAME, _USER2_PWD, _USER2_GROUP )
    
    print "---- Fertig ----"
    print
    disconnect()
    exit()
    

    WebLogic12-DomainDbAuthUser.bat

    @title WebLogic12-DomainDbAuthUser.bat
    
    set _WL_BASIS_DIR=C:\WebLogic
    set _WL_DOMAIN_NAME=MeineDomain
    
    @setlocal
    call %_WL_BASIS_DIR%\wlserver_12\server\bin\setWLSEnv.cmd
    @echo on
    "%JAVA_HOME%\bin\java" %JVM_ARGS% weblogic.WLST WLST12-Domain-DataSource.py
    @endlocal
    
    start cmd /C %_WL_BASIS_DIR%\user_projects\domains\%_WL_DOMAIN_NAME%\bin\startWebLogic.cmd
    :Warte_1_auf_WebLogic
    @echo Warten auf WebLogic ...
    @ping -n 5 127.0.0.1 >nul
    @netstat -an | find "TCP    127.0.0.1:7001" | find "ABH"
    @if errorlevel 1 goto Warte_1_auf_WebLogic
    
    @setlocal
    call %_WL_BASIS_DIR%\wlserver_12\server\bin\setWLSEnv.cmd
    @echo on
    "%JAVA_HOME%\bin\java" %JVM_ARGS% weblogic.WLST WLST12-SQLAuthenticator.py
    @endlocal
    
    pushd .
    call %_WL_BASIS_DIR%\user_projects\domains\%_WL_DOMAIN_NAME%\bin\stopWebLogic.cmd
    start cmd /C %_WL_BASIS_DIR%\user_projects\domains\%_WL_DOMAIN_NAME%\bin\startWebLogic.cmd
    popd
    :Warte_2_auf_WebLogic
    @echo Warten auf WebLogic ...
    @ping -n 5 127.0.0.1 >nul
    @netstat -an | find "TCP    127.0.0.1:7001" | find "ABH"
    @if errorlevel 1 goto Warte_2_auf_WebLogic
    
    @setlocal
    call %_WL_BASIS_DIR%\wlserver_12\server\bin\setWLSEnv.cmd
    @echo on
    "%JAVA_HOME%\bin\java" %JVM_ARGS% weblogic.WLST WLST12-UsersGroupsMembers.py
    @endlocal
    
    pushd .
    call %_WL_BASIS_DIR%\user_projects\domains\%_WL_DOMAIN_NAME%\bin\stopWebLogic.cmd
    popd
    
    pause
    
  3. Ihr Verzeichnis C:\WebLogic-silent-WLST enthält jetzt folgende Dateien:

    [C:\WebLogic-silent-WLST]
     |- WebLogic12-Basis-install-silent-32bit.bat
     |- WebLogic12-Basis-install-silent.xml
     |- WebLogic12-DomainDbAuthUser.bat
     |- WebLogic12-DomainDbAuthUser.properties
     |- wls1211_win32.exe
     |- WLST12-Domain-DataSource.bat
     |- WLST12-Domain-DataSource.py
     |- WLST12-SQLAuthenticator.py
     '- WLST12-UsersGroupsMembers.py
    
  4. Starten Sie die Datenbank und legen Sie die oben beschriebenen Tabellen an.

  5. Falls es noch ein C:\WebLogic-Verzeichnis mit einer alten WebLogic-Installation gibt: Löschen Sie es.

  6. Führen Sie folgende zwei Batchdateien aus (Achtung: die erste kann auf langsamen PCs über 10 Minuten dauern) (WLST12-Domain-DataSource.bat brauchen Sie nicht auszuführen, da dies in WebLogic12-DomainDbAuthUser.bat enthalten ist):

    cd /D C:\WebLogic-silent-WLST

    WebLogic12-Basis-install-silent-32bit.bat

    WebLogic12-DomainDbAuthUser.bat

  7. Sehen Sie sich das neu entstandene Verzeichnis C:\WebLogic\user_projects\domains\MeineDomain und darunter insbesondere die Konfigurationsdateien config\config.xml und config\jdbc\MeinMySqlDataSourceName-5723-jdbc.xml an.

  8. Sehen Sie sich folgende MBean-API-Dokus an: http://docs.oracle.com/cd/E12839_01/apirefs.1111/e13945/index.html?weblogic/security/providers/authentication/DefaultAuthenticatorMBean.html, http://docs.oracle.com/cd/E12839_01/apirefs.1111/e13945/index.html?weblogic/security/providers/authentication/SQLAuthenticatorMBean.html

Nutzung des SQLAuthenticators in einer Webanwendung

Um den SQLAuthenticator in einer Webanwendung zu nutzen, müssen Sie die web.xml erweitern und eine weblogic.xml hinzufügen.

  1. Erweitern Sie die WEB-INF/web.xml um folgenden Block (z.B. vor dem </web-app>-Endtag):

      <security-constraint>
        <web-resource-collection>
          <web-resource-name>Meine WebApp</web-resource-name>
          <url-pattern>/*</url-pattern>
        </web-resource-collection>
        <auth-constraint>
          <role-name>Manager</role-name>
        </auth-constraint>
      </security-constraint>
      <login-config>
        <auth-method>BASIC</auth-method>
        <realm-name>Meine WebApp</realm-name>
      </login-config>
      <security-role>
        <role-name>Manager</role-name>
      </security-role>
    

    (Vergleichen Sie die ähnlichen web.xml-Einträge beim Authentifizierung-Beispiel für REST mit Tomcat.)

  2. Fügen Sie eine WEB-INF/weblogic.xml mit folgendem Inhalt hinzu:

    <?xml version="1.0" encoding="UTF-8"?>
    <weblogic-web-app xmlns="http://xmlns.oracle.com/weblogic/weblogic-web-app"
                      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                      xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd
                                          http://xmlns.oracle.com/weblogic/weblogic-web-app http://xmlns.oracle.com/weblogic/weblogic-web-app/1.1/weblogic-web-app.xsd">
      <security-role-assignment>
        <role-name>Manager</role-name>
        <principal-name>Managers</principal-name>
      </security-role-assignment>
    </weblogic-web-app>
    

    Bitte beachten Sie den kleinen Unterschied im Rollennamen Manager und im Gruppennamen Managers.
    Sehen Sie sich zur weblogic.xml-Struktur an: http://docs.oracle.com/cd/E23943_01/web.1111/e13712/weblogic_xml.htm.

Sie können dies zum Beispiel mit der unten gezeigten Webanwendung mit Servlet, JSP, JavaBean, EJB-Zugriff und DB-Zugriff testen.



Silent-Installation für WebLogic 64 Bit

Falls Sie ein 64-bit-Betriebssystem installiert haben, sollten Sie auch WebLogic in der 64-bit-Version installieren. Dies erfolgt unter 64-bit-Windows folgendermaßen (statt dem im Folgenden vorgeschlagenen JRockit-64-bit-JDK können Sie natürlich auch das Sun-64-bit-JDK verwenden):

  1. Downloaden Sie Oracle JRockit in der Version "Windows-x86-64" (z.B. jrockit-jdk1.6.0_45-R28.2.7-4.1.0-windows-x64.exe) von http://www.oracle.com/technetwork/middleware/jrockit/downloads/index.html und installieren Sie es (z.B. nach C:\Program Files\Java\jrockit-jdk1.6.0_45-R28.2.7-4.1.0).

  2. Downloaden Sie Oracle WebLogic Server 12c (12.1.1) (wls1211_generic.jar) von http://www.oracle.com/technetwork/middleware/weblogic/downloads/index.html in der 64-bit-Version unter "Generic Installer (997MB) - for use with 64-bit JVMs" in ein temporäres Installationsverzeichnis (z.B. C:\WebLogic-silent-WLST).

  3. Erzeugen Sie im selben Verzeichnis folgende Installationskonfigurationsdatei (passen Sie darin die Pfade an):
    WebLogic12-Basis-install-silent.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <bea-installer>
      <input-fields>
        <data-value name="BEAHOME"         value="C:\WebLogic" />
        <data-value name="WLS_INSTALL_DIR" value="C:\WebLogic\wlserver_12" />
        <data-value name="COMPONENT_PATHS" value="WebLogic Server/Core Application Server|WebLogic Server/Administration Console|WebLogic Server/Configuration Wizard and Upgrade Framework|WebLogic Server/Web 2.0 HTTP Pub-Sub Server|WebLogic Server/WebLogic JDBC Drivers|WebLogic Server/Third Party JDBC Drivers|WebLogic Server/WebLogic Server Clients|WebLogic Server/Xquery Support" />
      </input-fields>
    </bea-installer>
    
  4. Erzeugen Sie im selben Verzeichnis folgende Batchdatei (passen Sie darin die Pfade an) und führen Sie sie mit Admin-Rechten aus (rechte Maustaste, "Als Administrator ausführen"):
    WebLogic12-Basis-install-silent-64bit.bat

    @title WebLogic12-Basis-install-silent-64bit.bat
    @echo Achtung: Kann auf langsamen PCs laenger als 10 Minuten dauern.
    set JAVA_HOME=C:\Program Files\Java\jrockit-jdk1.6.0_45-R28.2.7-4.1.0
    set PATH=%JAVA_HOME%\bin
    "%JAVA_HOME%\bin\java" -Xmx1024m -jar wls1211_generic.jar -mode=silent -silent_xml=WebLogic12-Basis-install-silent.xml -log=logs/WebLogic12-Basis-install-silent.log
    

    Wahrscheinlich wollen Sie Ihre "normale" JAVA_HOME-Umgebungsvariable auf ein Sun-JDK-7 eingestellt lassen. Deshalb wird JAVA_HOME nur innerhalb der Batchdatei auf das JRockit-JDK-Verzeichnis gesetzt.

    Dies müssen Sie dann in allen WebLogic-Batchdateien hinzufügen, insbesondere in:
    C:\WebLogic\user_projects\domains\MeineDomain\bin\startWebLogic.cmd.

  5. Falls Sie folgende Fehlermeldung erhalten:

    Die lokale BEA-Produktregistrierung ist beschädigt. Wählen Sie ein anderes Middleware-Standardverzeichnis, oder wenden Sie sich an den Oracle Support.

    Dann überprüfen Sie genau den Inhalt der WebLogic12-Basis-install-silent.xml.

  6. Falls Sie auch die anderen in den obigen Kapiteln gezeigten Batch- und Skriptdateien in dem Verzeichnis gespeichert haben, können Sie diese nach leichten Anpassungen (z.B. wegen C:\WebLogic\wlserver_12) auch weiter verwenden (z.B. WLST-Domain-DataSource.bat, WebLogic-DomainDbAuthUser.bat und die .py-WLST-Skripte).



Installation als Windows-Service

  1. Sehen Sie sich hierzu die Beschreibung an unter: http://docs.oracle.com/cd/E24329_01/web.1211/e21048/winservice.htm.

  2. Passen Sie in der Datei C:\WebLogic\wlserver_12\common\bin\commEnv.cmd an zwei Stellen die Zeilen
    set MEM_ARGS=-Xms128m -Xmx256m
    an Ihre Bedürfnisse an, setzen Sie beispielsweise:
    set MEM_ARGS=-Xms500m -Xmx1500m

  3. Erstellen Sie eine Batchdatei "installWebLogicAsWinService.bat" ähnlich zu (den CLASSPATH-Eintrag benötigen Sie nur, falls Sie zusätzliche Libs einbinden wollen):

    echo off
    SETLOCAL
    set CLASSPATH=config\jdbc\MeinJdbcTreiber.jar
    set WLS_USER=weblogic
    set WLS_PW=weblogic0
    set _WL_BASIS_DIR=C:\WebLogic
    set _WL_SERVER_DIR=%_WL_BASIS_DIR%\wlserver_12
    set SERVER_NAME=AdminServer
    set DOMAIN_NAME=MeineDomain
    set USERDOMAIN_HOME=%_WL_BASIS_DIR%\user_projects\domains\%DOMAIN_NAME%
    set PRODUCTION_MODE=false
    set JAVA_OPTIONS=-Dweblogic.Stdout="%_WL_BASIS_DIR%\user_projects\domains\%DOMAIN_NAME%\logs\stdout.log" -Dweblogic.Stderr="%_WL_BASIS_DIR%\user_projects\domains\%DOMAIN_NAME%\logs\stderr.log"
    call "%_WL_SERVER_DIR%\server\bin\installSvc.cmd"
    @echo.
    @echo Es muss die Meldung "beasvc %DOMAIN_NAME%_%SERVER_NAME% installed" erscheinen
    @ENDLOCAL
    

    Passen Sie die Einträge an Ihre Installation an und beachten Sie die Erläuterungen.

  4. Am besten legen Sie auch gleich eine Batchdatei "deinstallWebLogicAsWinService.bat" zum Löschen des Windows-Dienstes an:

    echo off
    SETLOCAL
    set DOMAIN_NAME=MeineDomain
    set SERVER_NAME=AdminServer
    set _WL_BASIS_DIR=C:\WebLogic
    set _WL_SERVER_DIR=%_WL_BASIS_DIR%\wlserver_12
    call "%_WL_SERVER_DIR%\server\bin\uninstallSvc.cmd"
    @echo.
    @echo Es muss die Meldung "beasvc %DOMAIN_NAME%_%SERVER_NAME% removed" erscheinen
    @ENDLOCAL
    
  5. Führen Sie die Batchdatei "installWebLogicAsWinService.bat" mit Admin-Rechten aus (rechte Maustaste, "Als Administrator ausführen").

  6. Der dabei installierte Windows-Service erhält den Namen "beasvc %DOMAIN_NAME%_%SERVER_NAME%", also z.B. "beasvc MeineDomain_AdminServer".

  7. Falls die Datenbank auf demselben PC läuft, muss der WebLogic verzögert gestartet werden, damit die Datenbank fertig hochgefahren ist:
    "Start | Systemsteuerung | [System und Sicherheit] | Verwaltung | Dienste"
    "beasvc MeineDomain_AdminServer"
    Starttyp: "Automatisch (Verzögerter Start)"

  8. Nach dem nächsten PC-Neustart wird der WebLogic als Dienst gestartet. Sie können ihn auch ohne PC-Neustart starten, indem Sie betätigen:
    "Start | Systemsteuerung | [System und Sicherheit] | Verwaltung | Dienste"
    "beasvc MeineDomain_AdminServer"
    "Starten"

  9. Überprüfen Sie wichtige WebLogic-Konfigurationsparameter wie beispielsweise die "Maximale Heap-Größe" in der WebLogic-Console unter "MeineDomain | Umgebung | Server | AdminServer | Überwachung | Performance".

  10. Sie können sich die Vorgabewerte für die WebLogic-Konfigurationsparameter in der Windows-Registry ansehen unter: "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\beasvc MeineDomain_AdminServer\Parameters".

  11. Falls sich der WebLogic nicht per Windows-Service starten lässt, sehen Sie sich die "Windows-Ereignisanzeige" an.



WLST, configToScript, Templates, Pack/Unpack

Batchdatei zur Ausführung von WLST-Skripten

  1. WLST-Skripte können Sie im Allgemeinen ausführen über folgende Batchdatei:

    @setlocal
    call C:\WebLogic\wlserver_12\server\bin\setWLSEnv.cmd
    "%JAVA_HOME%\bin\java" %JVM_ARGS% weblogic.WLST WLST-Skript.py
    @endlocal
    

configToScript()

  1. Falls Sie eine (z.B. per WebLogic-Console erstellte) lauffähige WebLogic-Konfiguration haben, brauchen Sie das dieser Konfiguration entsprechende WLST-Skript nicht von Hand zu erstellen, sondern können es per configToScript()-WLST-Kommando generieren lassen, siehe folgendes Skript:

    WLST-configToScript.py

    loadProperties( "_WLST-configToScript.properties" )
    configToScript( _WL_DOMAIN_DIR )
    
  2. Die folgende Batchdatei ruft das gezeigte Skript auf und demonstriert eine Möglichkeit, wie Parameter aus der Batchdatei an das WLST-Skript weitergegeben werden können.

    WLST-configToScript.bat

    @title WLST-configToScript.bat
    
    rem Pfad mit Schraegstrich statt Backslash:
    set _WL_BASIS_DIR=C:/WebLogic
    set _WL_DOMAIN_NAME=MeineDomain
    
    @echo _WL_DOMAIN_DIR=%_WL_BASIS_DIR%/user_projects/domains/%_WL_DOMAIN_NAME%> _WLST-configToScript.properties
    
    @setlocal
    call %_WL_BASIS_DIR%\wlserver_12\server\bin\setWLSEnv.cmd
    @echo on
    "%JAVA_HOME%\bin\java" %JVM_ARGS% weblogic.WLST WLST-configToScript.py
    @endlocal
    
    del _WLST-configToScript.properties
    @echo.
    @echo Ergebnis in:  %_WL_BASIS_DIR%\user_projects\domains\%_WL_DOMAIN_NAME%\config
    pause
    

Templates

  1. Mit folgendem WLST-Skript können Sie die Konfiguration der Domain "MeineDomain" in eine Template-jar-Datei speichern:

    readDomain( "C:/WebLogic/user_projects/domains/MeineDomain" )
    writeTemplate( "./templates/WebLogic-Template-MeineDomain.jar" )
    
  2. Umgekehrt können Sie in neuen WebLogic-Basisinstallationen mit der Template-jar-Datei die vorkonfigurierte Domain installieren:

    readTemplate( "./templates/WebLogic-Template-MeineDomain.jar" )
    writeDomain( "C:/WebLogic/user_projects/domains/MeineDomain" )
    
  3. Sehen Sie sich die Doku zu readDomain(), writeTemplate(), readTemplate() und writeDomain() an.

Pack und Unpack

  1. Wenn Sie nicht die Flexibilität von WLST benötigen, sondern tatsächlich lediglich eine Template-jar-Datei erzeugen bzw. einspielen wollen, benötigen Sie nicht WLST, sondern können auch einfacher die pack- und unpack-Kommandos verwenden (passen Sie den Verzeichnispfade an):

    C:\WebLogic\wlserver_12\common\bin\pack -domain=C:\WebLogic\user_projects\domains\MeineDomain -template=templates\WebLogic-Template-MeineDomain.jar -template_name="MeineDomain"

  2. Und umgekehrt:

    C:\WebLogic\wlserver_12\common\bin\unpack -template=templates\WebLogic-Template-MeineDomain.jar -domain=C:\WebLogic\user_projects\domains\MeineDomain

  3. Weiteres hierzu finden Sie unter http://docs.oracle.com/cd/E12840_01/common/docs103/pack/commands.html.



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
Falls Sie wie oben beschrieben eine Datasource eingerichtet haben, wird diese angezeigt (z.B. als jdbc: ... jdbc/MeinDatasourceJndiName)..



EJB erstellen und deployen

Um EJBs zu erstellen und zu deployen führen Sie zuerst die unter
jee-ejb2.htm#GemeinsameDateien-fuer-Beispiele und dann die unter
jee-ejb2.htm#Beispiel-StatefulSessionBean und
jee-ejb2.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 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]
    

    Sie können diese Verzeichnisstruktur und die meisten der im Folgenden vorgestellten Dateien auch downloaden (außer den Libs).

  3. Kopieren Sie die '*servlet*.jar'-Lib (z.B. servlet.jar, servlet-api.jar oder javax.servlet_1.0.0.0_2-5.jar) in das '<Projektverzeichnis>\lib'-Verzeichnis.
    Je nach Java EE Application Server finden Sie diese Lib in Verzeichnissen ähnlich zu:
    Oracle WebLogic: C:\WebLogic\modules
    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-ejb2.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 Oracle WebLogic und 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 ) {/*ok*/}
        try { if( null != st ) st.close(); } catch( Exception ex ) {/*ok*/}
        try { if( null != cn ) cn.close(); } catch( Exception ex ) {/*ok*/}
      }
    %>
    </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 Oracle WebLogic zum Beispiel so:

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

    Für 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 (überprüfen Sie es mit "tree /F", 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. 'C:\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 Oracle WebLogic über 'http://localhost:7001/console'.

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

    Oracle WebLogic: http://localhost:7001/MeineWebApp
    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 Oracle WebLogic zum Beispiel folgendermaßen erfolgen (bitte Pfade anpassen):

    cd \MeinWorkspace\MeineWebApp

    set JAVA_HOME=C:\Program Files\Java\jrockit-jdk1.6.0_45-R28.2.7-4.1.0

    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-ejb2.htm#StatefulSessionBean-HomeInterface. Allerdings benötigen Sie dann auch zusätzlich eine entsprechende .jar-lib.

  21. Außer dem beschriebenen Auto-Deployment und dem Deployment über die Administrationskonsole bietet WebLogic noch weitere Möglichkeiten zum Deployment, zum Beispiel per WLST oder per weblogic.Deployer, siehe hierzu: http://docs.oracle.com/cd/E11035_01/wls100/deployment/deploy.html und http://docs.oracle.com/cd/E13222_01/wls/docs103/deployment/wldeployer.html.

    Für dieses Beispiel können Sie folgendermaßen mit weblogic.Deployer deployen:

    @setlocal

    call C:\WebLogic\wlserver_12\server\bin\setWLSEnv.cmd

    "%JAVA_HOME%\bin\java" weblogic.Deployer -username weblogic -password weblogic0 -name MeineWebApp -deploy dist\MeineWebApp.war

    "%JAVA_HOME%\bin\java" weblogic.Deployer -username weblogic -password weblogic0 -listapps

    @endlocal

    Für ein Undeployment ersetzen Sie -deploy durch -undeploy.



Kompatibilitätsprobleme

Classloader-Reihenfolge

Die Classloader-Reihenfolge ist bei den verschiedenen WebLogic-Versionen mehrmals geändert worden. Erläuterungen zum WebLogic-Classloading finden Sie unter http://docs.oracle.com/cd/E21764_01/web.1111/e13706/classloading.htm. Falls Sie auf Probleme mit unterschiedlichen Versionen eigener und bereits im WebLogic (z.B. in 'weblogic.jar') vorhandenen Bibliotheken stoßen (z.B. mit "org.apache.*" oder "javax.jws.*"), dann versuchen Sie je nach WebLogic-Version und je nach Anwendung bzw. Deployment (WAR oder EAR) einen der folgenden Vorschläge, damit bestimmte Klassen aus dem ApplicationContext und nicht aus dem ServerContext geladen werden. Bitte beachten Sie: Die im Folgenden eingesetzten Package-Namen sind nur willkürliche Beispiele, die Sie für Ihre Anwendung ersetzen müssen.

Damit Sie die richtigen Einträge für <prefer-application-packages> finden, kann das Classloader Analysis Tool (CAT) eine gute Hilfe sein, siehe: http://docs.oracle.com/cd/E21764_01/web.1111/e13706/classloading.htm#BABHJGJJ.

Externer Client

Falls Sie Probleme beim Zugriff auf einen WebLogic-Server von einem externen Client aus haben (z.B. mit unterschiedlichen Java-Versionen), sehen Sie sich folgende auf Clientseite anwendbaren Kommandozeilenparameter an:

-Dweblogic.jndi.enableDefaultUser=true (Erläuterung siehe hier und hier)

-Dsun.lang.ClassLoader.allowArraySyntax=true (Erläuterung siehe hier, hier und hier)

Letzterer insbesondere, wenn Sie folgende Fehlermeldung erhalten:

javax.naming.CommunicationException [Root exception is java.rmi.UnmarshalException:
failed to unmarshal class weblogic.security.acl.internal.AuthenticatedUser; nested exception is:
java.io.StreamCorruptedException: invalid type code: 31]

"Certificate parsing exception PKIX"

Falls Sie WebLogic mit JRockit verwenden und beim WebLogic-Start die Exception
"Ignoring the trusted CA certificate "...". The loading of the trusted certificate list raised a certificate parsing exception PKIX: Unsupported OID in the AlgorithmIdentifier object: ..." erhalten, können Sie folgendermaßen diese Exceptions vermeiden.

Finden Sie mit folgenden Kommandos den zu Ihrer Meldung passenden Alias-Namen (passen Sie den JAVA_HOME-Pfad an):

set JAVA_HOME=C:\Program Files\Java\jrockit-jdk1.6.0_45-R28.2.7-4.1.0

cd /D "%JAVA_HOME%\jre\lib\security"

keytool -keystore cacerts -storepass changeit -list -v

Entfernen Sie folgendermaßen die entsprechenden Einträge im Keystore (bitte Alias-Namen anpassen):

cd /D "%JAVA_HOME%\jre\lib\security"

keytool -keystore cacerts -storepass changeit -delete -alias entrustrootcag2

keytool -keystore cacerts -storepass changeit -delete -alias geotrustprimarycag3

keytool -keystore cacerts -storepass changeit -delete -alias globalsignr3ca

keytool -keystore cacerts -storepass changeit -delete -alias keynectisrootca

keytool -keystore cacerts -storepass changeit -delete -alias secomscrootca2

keytool -keystore cacerts -storepass changeit -delete -alias thawteprimaryrootcag3

keytool -keystore cacerts -storepass changeit -delete -alias ttelesecglobalrootclass2ca

keytool -keystore cacerts -storepass changeit -delete -alias ttelesecglobalrootclass3ca

keytool -keystore cacerts -storepass changeit -delete -alias verisignuniversalrootca



Monitoring-Tools für WebLogic

Mit den Monitoring-Tools für WebLogic können der Speicherverbrauch, GC-Aktivitäten, Threads, MBeans, die VM u.a. des 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.

WebLogic-Administrationskonsole

Thread-Stacktrace-Dump mit "Strg + Pause"

JRockit Mission Control

  1. Laut Oracle ist JRockit Mission Control nicht nur in Entwicklungsumgebungen, sondern auch in Produktionsumgebungen verwendbar, da die Performance bei abgeschalteter Konsole gar nicht und bei aktiver Konsole nur zu etwa 2 % beeinträchtigt wird.
  2. Falls der Zugriff remote über JMX erfolgen soll, muss der WebLogic 10 (mit JRockit-JDK) mit korrekten Parametern gestartet werden, siehe hierzu: Startparameter.

  3. JRockit Mission Control kann mit folgendem Kommando gestartet werden:

    "%JAVA_HOME%\bin\jrmc.exe"

  4. Im linken "JRockit Browser"-View-Fenster mit der rechten Maustaste auf den zu untersuchenden WebLogic-Server klicken und im Kontextmenü 'Start Console' wählen.
    Falls der WebLogic mit dem "-Xmanagement:...autodiscovery=true"-Parameter gestartet wurde (z.B. WebLogic des Entwicklers), wird er unter 'Discovered' | 'JDP' aufgeführt (JDP = JRockit Discovery Protocol).
    Andernfalls (z.B. WebLogic aus Produktion): Im "JRockit Browser"-View-Fenster mit der rechten Maustaste auf 'Connectors' klicken, 'New Connection' wählen und 'Host' und 'Port' eintragen.
  5. Die Informationen der "Console" sind verteilt auf die Tabulatorreiter 'Overview', 'MBean Browser', 'Memory', 'Threads', 'Runtime', 'Triggers', 'Exception Count' und 'Methods Profiler' am unteren Rand.
  6. Im laufenden Betrieb können unter dem Tabulatorreiter 'Threads' durch Klick auf einen der im 'Live Threads'-Fenster angezeigten Threads Thread-Stacktrace-Snapshots erzeugt werden.
    Der das eigentliche Nutzprogramm ausführende Thread könnte zum Beispiel heißen (die Nummer '0' kann variieren):
    [ACTIVE] Execute Thread: '0' for queue: 'weblogic.kernel.Default'
  7. Eine Aufzeichnung wird gestartet, indem im linken "JRockit Browser"-View-Fenster mit der rechten Maustaste auf den zu untersuchenden WebLogic-Server geklickt und im Kontextmenü 'Start JRA Recording' gewählt wird (JRA = JRockit Runtime Analyzer).
    Nach Ablauf der Aufzeichnung befinden sich die Informationen unter den Tabulatorreitern 'General', 'Methods', 'GC General', 'GCs', 'Heap', 'Objects', 'Optimizations' und 'Locks' am unteren Rand. Interessant ist zum Beispiel, wie viel Prozent der Zeit für die Garbage Collection verwendet wurde ('Total pause time' unter 'GC General'), welche Objekte am meisten Speicherverbrauch verursachten (unter 'Objects') und welche Methoden die meiste Zeit verbrauchten (unter 'Methods').
  8. Weitere Informationen gibt es unter: http://edocs.bea.com/jrockit/tools und http://www.oracle.com/technology/products/jrockit/pdf/missioncontrol_whitepaper_june08.pdf.

Monitoring & Management Console (JConsole)

  1. Falls der Zugriff remote über JMX erfolgen soll, muss der WebLogic 10 (mit JRockit-JDK) mit korrekten Parametern gestartet werden, siehe hierzu: Startparameter.

  2. Die Monitoring & Management Console kann mit folgendem Kommando gestartet werden:

    "%JAVA_HOME%\bin\jconsole.exe"

  3. Unter 'Connection' | 'New Connection ...' wird der WebLogic-Server gewählt.
  4. Die Informationen sind verteilt auf die Tabulatorreiter 'Memory', 'Threads', 'Classes', 'MBeans' und 'VM'.
  5. Im laufenden Betrieb können unter dem Tabulatorreiter 'Threads' durch Klick auf einen der im 'Live Threads'-Fenster angezeigten Threads Thread-Dump-Snapshots erzeugt werden.
    Der das eigentliche Nutzprogramm ausführende Thread könnte zum Beispiel heißen:
    [ACTIVE] Execute Thread: '0' for queue: 'weblogic.kernel.Default'
  6. Weitere Informationen gibt es unter: http://edocs.bea.com/jrockit/tools.

Andere Tools für Profiling, Diagnose und Monitoring



Profiling mit YourKit 7.5.6 auf WebLogic

  1. YourKit muss installiert sein.

  2. Um eine lokale Java-SE-Anwendung profilen zu können, muss der Pfad zur yjpagent.dll-Library zur PATH-Environmentvariable hinzugefügt werden und muss dem Java-Aufruf ein Kommandozeilenparameter hinzugefügt werden, zum Beispiel so:

    set PATH_OLD=%PATH%
    set PATH=C:\Programme\YourKit Java Profiler 7.5.6\bin\win32;%PATH%
    set JAVA_OPTIONS=-agentlib:yjpagent=sessionname=MeineJavaAnwendung,port=11042
    java %JAVA_OPTIONS% MeineJavaAnwendung
    set PATH=%PATH_OLD%
    
  3. Um im Java EE Application Server (z.B. WebLogic) profilen zu können, muss er mit speziellen Optionen gestartet werden. Eine entsprechende Batchdatei kann von YourKit automatisch erzeugt werden, für WebLogic zum Beispiel über 'Tools' | 'Integrate with J2EE Server...' | '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" %*
    
  4. Die Verbindung von YourKit zur lokalen Anwendung oder zum lokalen Java EE Application Server (z.B. WebLogic) wird hergestellt über: 'File' | 'Open Profiling Session...' | 'Connect to locally running profiled application...'.

    Die Verbindung von YourKit zu einem entfernten Java EE Application Server wird hergestellt über: 'File' | 'Open Profiling Session...' | 'Connect to remote application...'.

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

  6. In Produktionsumgebungen sollten einige Optionen eher nicht verwendet werden, da sie zu Timeouts bis hin zum mehrere Minuten langen Stillstand und zu "stuck Threads" führen (z.B. "CPU Profiling" mit "Tracing" und "Capture Memory Snapshot"). Siehe hierzu: Profiling overhead (selbst nur das Aktivieren des serverseitigen YourKit-Agenten kann die Performance um durchaus deutlich mehr als die auf der Webseite genannten 5 % beeinträchtigen, auch wenn kein Client aktiv ist).

  7. "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.

    Es ist wichtig, den Unterschied zwischen "CPU Time" und "Wall Time" zu verstehen: CPU Time ist die in der Methode selbst verbrauchte Zeit (z.B. ohne Wartezeit für andere Threads) und Wall Time ist die absolute Zeit von Methodenaufruf bis -ende. Am besten führen Sie zwei Messungen durch und vergleichen die Ergebnisse: Die eine Messung in Default-Einstellung und für die andere Messung fügen Sie unter "Settings" | "Wall Time Methods..." die Zeile "* * *" zu unterst hinzu (ohne Anführungszeichen).

    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.

  8. "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.

  9. "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-2011 Torsten Horn, Aachen