mbeans-descriptor.xml

Gainwar

Erfahrenes Mitglied
Guten Tag,
ich beschreib euch direkt mal mein Problem.

Ich arbeite mit dem Tomcat 5 Application Server der standartmäßig seine Userdatabase für die Authentifizierung benutzt. Ich habe nun bereits alles umgestellt damit er meine eigen definierte ( per <Realm> Tag ) Userdatabase benutzt. Meine Klasse ist von der "JDBCRealm" Klasse abgeleitet und fügt nur einige Tabellen und Column names hinzu welche ich für die Container Authentifizierung benötige.

Hier mal ein Beispiel wie es mit der "JDBCRealm" Klasse ungefähr aussehen würde:

Code:
      <Realm className="de.cadenas.auth.CadenasJDBCRealm"
        connectionName="PARTcms"
        connectionPassword="PARTcms"
        connectionURL="jdbc:jtds:sqlserver://cprog028.cadenas:1433/PARTemployees"
        driverName="net.sourceforge.jtds.jdbc.Driver"
        userTable="dbTable"
        userNameCol="user_name"/>

Für meine Zwecke ist dies nicht genug, da ich über mehrere Tabellen und Spalten sehen muss. Bisher sind diese fest im Code eingebettet, was nicht gerade schön ist.
Daher hab ich eine "mbeans-descriptor.xml" mit in mein package gelegt welche er ja eigentlich automatisch nehmen sollte. Wenn ich nun allerdings meine Realm Klasse mit den erweiterten Attributen eintrage kennt ihr diesen nicht und benutzt die "mbeans-descriptor.xml" der JDBCRealm Klasse, von der ich ableite.

Abgelegt hab ich meine .jar Datei im Verzeichnis - ${TOMCAT_ROOT}/server/lib/

Hier noch meine geschriebene "mbeans-descriptor.xml"

Code:
<?xml version="1.0"?>
<mbeans-descriptors>

  <mbean         name="CadenasJDBCRealm"
  			className="org.apache.catalina.mbeans.ClassNameMBean"
          description="Custom JDBCRealm"
               domain="Catalina"
                group="Realm"
                 type="de.cadenas.auth.CadenasJDBCRealm">
				
    <attribute   name="className"
          description="Fully qualified class name of the managed object"
                 type="java.lang.String"
            writeable="false"/>

    <attribute   name="connectionName"
          description="The connection username to use when trying to connect to
                       the database"
                 type="java.lang.String"/>

    <attribute   name="connectionPassword"
          description="The connection URL to use when trying to connect to the
                       database"
                 type="java.lang.String"/>

    <attribute   name="connectionURL"
          description="The connection URL to use when trying to connect to the
                       database"
                 type="java.lang.String"/>

    <attribute   name="digest"
          description="Digest algorithm used in storing passwords in a
                       non-plaintext format"
                 type="java.lang.String"/>

    <attribute   name="driverName"
          description="The JDBC driver to use"
                 type="java.lang.String"/>

	<attribute   name="userTable"
          description="desc"
                 type="java.lang.String"/>
                 
	<attribute   name="userUserIdCol"
          description="desc"
                 type="java.lang.String"/>
                 
	<attribute   name="userCredCol"
          description="desc"
                 type="java.lang.String"/>

	<attribute   name="roleTable"
          description="desc"
                 type="java.lang.String"/>
                 
	<attribute   name="roleUserIdCol"
          description="desc"
                 type="java.lang.String"/>
                 
	<attribute   name="roleNameCol"
          description="desc"
                 type="java.lang.String"/>
                 
	<attribute   name="usernameTable"
          description="desc"
                 type="java.lang.String"/>

	<attribute   name="usernameUserIdCol"
          description="desc"
                 type="java.lang.String"/>

	<attribute   name="usernameNameCol"
          description="desc"
                 type="java.lang.String"/>


    <operation name="start" description="Start" impact="ACTION" returnType="void" />
    <operation name="stop" description="Stop" impact="ACTION" returnType="void" />
    <operation name="init" description="Init" impact="ACTION" returnType="void" />
    <operation name="destroy" description="Destroy" impact="ACTION" returnType="void" />
  </mbean>

</mbeans-descriptors>

Vielen Dank
Gruß Manuel
 
Hallo!

Daher hab ich eine "mbeans-descriptor.xml" mit in mein package gelegt welche er ja eigentlich automatisch nehmen sollte.
Kannst du mir vielleicht sagen, wo das in der Doku beschrieben ist? Kann dieses Verhalten auf die schnelle nicht finden...

Hast du denn auch in der Server.xml einen entsprechenden Eintrag dafuer gemacht?
Code:
  <Listener className="org.apache.catalina.mbeans.ServerLifecycleListener"
  		  debug="0"
  		  descriptors="/com/myfirm/mypackage/mbean-descriptor.xml"/>
... siehe %TOMCAT_HOME%\webapps\tomcat-docs\mbeans-descriptor-howto.html

Gruss Tom
 
Hallo,
ich greife das Thema mal wieder auf.
Es scheint so, als würde die Server.xml nicht verändert werden müssen, Beim Tomcat 6. Sehe ich das richtig, trügt da der Schein? Hat da jemand Erfahrungen mit?

Ich habe eine MBean, die ich vom Tomcat als .jar geladen werden soll. Dazu muss im Package doch eine mbeans-descriptor.xml liegen.

Leider bin ich auf dem Gebiet in völligem Neuland. Mit dem Beispiel aus den Tomcat-Docs komme ich irgendwie nicht vorran, da ich keine Ahnung von Realm habe und nicht weiß, wie der Eintrag für meine MBean auszusehen hat.

Für Hilfe bin ich sehr dankbar.

:offtopic:
P.S. Yehaa, mein erster Post :-) Das Forum ist super. Ich habe schon viele nützliche Dinge erfahren. Ich hoffe ich kann auch einmal jemandem weiterhelfen.

Matze
 
Hi, erstmal danke für die Links. Schau ich mal rein.
Das MBean soll beim Start des Tomcat geladen werden. Im Moment habe ich das auch ohne Descriptor hinbekommen.

Der Stand ist derzeit, dass die MBean mittels einer web.xml gestartet wird. diese liegt in einem Ordner in /webapps. Darin ist ein listener beschrieben, der eine ContextListener-Klasse verlinkt. Diese zieht dann wiederum eine Instanz der MBeanImplementierung, die sich dann selber beim MBeanServer anmeldet.
Funktioniert auch soweit.

Probleme machen mir wohl die unterschiedlichen ClassLoader. Der SystemClassloader lädt mir einen Agenten zur Bytecodeinstrumentierung. Diese sollte eigentlich mit der MBean gesteuert werden. Das funktioniert lokal prima, aber nicht auf dem Tomcat.

Ziel ist eigentlich die Instrumentierung einer Webapplication.
(hmm, ich hoffe das ist verständlich gewesen :-) )
 
Hallo,

Der Stand ist derzeit, dass die MBean mittels einer web.xml gestartet wird. diese liegt in einem Ordner in /webapps. Darin ist ein listener beschrieben, der eine ContextListener-Klasse verlinkt. Diese zieht dann wiederum eine Instanz der MBeanImplementierung, die sich dann selber beim MBeanServer anmeldet.
Funktioniert auch soweit.

Probleme machen mir wohl die unterschiedlichen ClassLoader. Der SystemClassloader lädt mir einen Agenten zur Bytecodeinstrumentierung. Diese sollte eigentlich mit der MBean gesteuert werden. Das funktioniert lokal prima, aber nicht auf dem Tomcat.

Schon klar, du machst das ganze also Programmatisch.

Was ist nun genau dein Problem?
Du möchtest im Tomcat via Instrumentationen bytecode von Klassen vor dem laden modifizieren. Diese Modifikationen möchtest du via MBean steuern können? Aber dein MBean "sieht" den Transformer nicht, oder wie?

Gruß Tom
 
ja, genau. ich möchte Klassen von Applikationen transformieren und diese Transformation via MBean steuern.
Das Problem liegt gerade darin, dass der Transformator die Applikationsklassen nicht sieht.
Liegt das wohl daran, dass diese von dem ApplicationClassLoader geladen werden und der Transformer vom SystemClassLoader, also dem Parentloader!?

Matze

Edit:
Ich habe mir die Instrumentierung jetzt in die MBean geholt. Diese sieht ja die Applikationsklassen. Entsprechend kann ohne ClassNotFoundException ein Transformator auf die Applikationsklasse angewendet werden.
Merkwürdig ist nur, dass diese trotzdem nicht verändert wird!? Bzw. ich es nicht sehen kann. Sie sollte eigentlich als veränderte Klasse eine Ausgabe xy geben.
 
Zuletzt bearbeitet:
Zurück