Jboss boundet das ejb nicht



  • hier läuft unter win98:
    j2sdk1.4.0-beta3 (ich weiß, ich muss mal updaten, hatte noch keine zeit)
    j2sdkee1.3 installiert (nur zum compileren.. ansonsten interessiert es nicht)

    server:
    jboss-3.0.0_tomcat-4.0.3

    was ich machen wollte: testbean schreiben und deployen .. und mit einem client ansprechen.

    bei den drei files für das testbean halte ich mich an eine im internet gefundene vorgabe. funzt auch prima. (schwer etwas über jboss zu finden, aber egal, das ist ein anderes thema 👎 )

    HelloWorld.java

    package ie.tcd.cs.ejb_example;
    
    /* This is the remote interface that the client calls to have the EJB do the work. */
    
    public interface HelloWorld extends javax.ejb.EJBObject
    {
    
    public String hello() throws java.rmi.RemoteException; 
    
    }
    

    HelloWorldHome.java

    package ie.tcd.cs.ejb_example;
    
    /* HelloWorldHome provides the container the means to create and destroy EJB's. */
    
    public interface HelloWorldHome extends javax.ejb.EJBHome 
    {
    
    HelloWorld create() throws java.rmi.RemoteException, javax.ejb.CreateException;
    
    }
    

    HelloWorldBean.java

    package ie.tcd.cs.ejb_example;
    import javax.ejb.SessionContext; 
    
    /* This class is the actual implementation of the business logic. This is the EJB for simplicity's sake. */
    
    public class HelloWorldBean implements javax.ejb.SessionBean 
    {
    
    private SessionContext ctx; 
    public void setSessionContext(SessionContext ctx) 
    { 
    this.ctx = ctx; 
    } 
    public void ejbRemove() 
    { 
    System.out.println( "ejbRemove()" );
    }
    public void ejbActivate() 
    { 
    System.out.println( "ejbActivate()" ); 
    } 
    public void ejbPassivate() 
    { 
    System.out.println( "ejbPassivate()" ) 
    } 
    /* The method called to display the string "Hello World!" on the client. */ 
    public String hello() 
    { 
    System.out.println( "hello()" ); 
    return "Hello World!"; 
    } 
    public void ejbCreate() 
    { 
    System.out.println( "ejbCreate()" ); 
    } 
    
    }
    

    die packe ich mit richtiger ordnung und einem manifest, in dem die folgende xml abgelegt ist, in ein jar.

    ejb-jar.xml

    <?xml version="1.0" encoding="UTF-8"?>
    
    <ejb-jar>
    
    <description>JBoss Hello World Application</description>
    <display-name>Hello World EJB</display-name>
    <enterprise-beans>
    
    <session>
    
    <ejb-name>HelloWorld</ejb-name>
    <home>ie.tcd.cs.ejb_example.HelloWorldHome</home>
    <remote>ie.tcd.cs.ejb_example.HelloWorld</remote>
    <ejb-class>ie.tcd.cs.ejb_example.HelloWorldBean
    </ejb-class>
    <session-type>Stateless</session-type>
    <transaction-type>Bean</transaction-type>
    
    </session>
    
    </enterprise-beans>
    
    </ejb-jar>
    

    alles klar.

    ordnerstruktur und so..

    jboss-tutorial\ie
    jboss-tutorial\ie\tcd\cs
    jboss-tutorial\ie\tcd\cs\ejb_example
    jboss-tutorial\ie\tcd\cs\ejb_example\HelloWorld.class
    jboss-tutorial\ie\tcd\cs\ejb_example\HelloWorldBean.class
    jboss-tutorial\ie\tcd\cs\ejb_example\HelloWorldHome.class
    jboss-tutorial\META-INF
    jboss-tutorial\META-INF\ejb-jar.xml

    und dieses jar wird von meinem server auch klar und deutlich angenommen:

    19:21:10,130 INFO [MainDeployer] Starting deployment of package: file:/E:/jboss
    -3.0.0_tomcat-4.0.3/server/default/deploy/HelloWorld.jar
    19:21:10,130 INFO [MainDeployer] Successfully completed deployment of package:
    file:/E:/jboss-3.0.0_tomcat-4.0.3/server/default/deploy/HelloWorld.jar

    jetzt noch der client.. der dann gestartet wird, und eigentlich den kontakt herstellen soll:

    HelloWorldClient.java

    package ie.tcd.cs.ejb_example;
    
    import javax.naming.Context;
    import javax.naming.InitialContext;
    import java.util.Hashtable;
    import java.util.*;
    
    public class HelloWorldClient  extends Thread
    
    {
    
    	public static void main( String [] args )
    	{
    	try { Thread.sleep(1000); } catch (InterruptedException e) {}
    		System.out.println("anfang");
    	try { Thread.sleep(10); } catch (InterruptedException e) {}
    
    		System.out.println("eins");
    	Hashtable env = new Hashtable();
    	try { Thread.sleep(1000); } catch (InterruptedException e) {}
    	System.out.println("zwei");
    	env.put(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory");
    	try { Thread.sleep(1000); } catch (InterruptedException e) {}
    	System.out.println("drei");
    	env.put(Context.PROVIDER_URL, "localhost:1099");
    	try { Thread.sleep(1000); } catch (InterruptedException e) {}
    	System.out.println("vier");
    	env.put("java.naming.factory.url.pkgs", "org.jboss.naming:org.jnp.interfaces");
    
    	try { Thread.sleep(1000); } catch (InterruptedException e) {}
    	System.out.println("fünf");
    
    		try
    		{
    
    			Context ctx = new InitialContext(env);
    			try { Thread.sleep(1000); } catch (InterruptedException e) {}
    				System.out.println("sechs");
    
    		    Object obj = ctx.lookup( "HelloWorld" );
    		    try { Thread.sleep(1000); } catch (InterruptedException e) {}
    				System.out.println("sieben");
    
    			HelloWorldHome home = (HelloWorldHome)javax.rmi.PortableRemoteObject.narrow( obj, HelloWorldHome.class );
    			HelloWorld helloWorld = home.create();
    			System.out.println( helloWorld.hello());
    			helloWorld.remove();
    
    			}
    
    			catch ( Exception e )
    			{
    
    			//e.printStackTrace();
    			System.out.println( "Exception: " + e.getMessage() );
    
    		}
    	}
    }
    

    die unattraktiven timeausgaben zeigen mir, daß er beim starten bis zur zeile sechs kommt.. sprich: er stellt den kontakt her (erkenne ich auch am zonealarm, der alarm schlägt 😉 ) und läuft wunderbar, bis er das HelloWorld finden soll.

    als classpath (uff, den musste ich irgendwie grausam ummodellieren, ohne eine ordentliche beschreibung wirklich grusel, jboss kanns nicht sein) habe ich folgendes:
    SET CLASSPATH=.;d:\j2sdk1.4.0-beta3;d:\j2sdk1.4.0-beta3\lib;E:\j2sdkee1.3\lib;E:\j2sdkee1.3\lib\j2ee.jar;E:\jboss-3.0.0_tomcat-4.0.3\server\default\conf\jndi.properties;E:\jboss-3.0.0_tomcat-4.0.3\client\log4.jar;E:\jboss-3.0.0_tomcat-4.0.3\client\jboss-common-client.jar;E:\jboss-3.0.0_tomcat-4.0.3\client\jboss-system-client.jar;E:\jboss-3.0.0_tomcat-4.0.3\client\jnp-client.jar;E:\jboss-3.0.0_tomcat-4.0.3\client\jboss-client.jar;E:\jboss-3.0.0_tomcat-4.0.3\client\jbosssx-client.jar;E:\projects\jboss-tutorial\HelloWorld.jar

    ihr seht ein sammelsurium aus vielen vielen beiträgen von unglücklichen menschen, die das selbe versuchten.

    ich weiß, jndi hat ein problem, nur: wie kriege ich es gelöst? vielleicht hat einer den entscheidenden tip.

    mich beruhigt, daß jboss alles richtig findet, und mein client auch kontaktiert.. es muss ein doofes problem sein..

    thx, wenns jemand weiß.



  • hi

    habe mir die anderen jars angeschaut und noch eine jboss.xml in die meta-inf mit reingelegt.

    deployen geht, aber findet immer noch nicht.

    worauf muss ich beim bekanntmachen achten?

    thx.



  • hi

    das problem das ich sehe ist das er es entweder nicht findet

    dagegen koenntest du einen JNDI namen extra vergeben
    das wuerde funktionieren über das jboss.xml dokument

    so wie:

    <jboss>
    <enterprise-beans>
    <session>
    <ejb-name>XML_RPC_Test</ejb-name>
    <jndi-name>XML_RPC_TestJNDI</jndi-name>
    </session>
    </enterprise-beans>
    </jboss>
    

    mit

    Object ref  = jndiContext.lookup("XML_RPC_TestJNDI");
    

    kannst du dann das objekt über den eindeutigen JNDI namen ansprechen

    sonst fällt mir nur folgendes ein:
    die im classpath des clients enthaltenen dateien sind:

    jbosssx-client.jar
    jboss-transaction-client.jar
    jboss-system-client.jar
    jboss-common-client.jar
    jnp-client.jar
    jboss-client.jar

    ich hoffe das hilft



  • thanks, aber leider nix

    habe gestern schon neben meiner ejb-jar.xml eine jboss.xml in das meta-inf verzeichnis gelegt, und einen extra jndi namen angelegt und versucht, darüber anzusprechen.

    in allen varianten, die es im netz gibt.

    deine jars liegen alle in meinem pfad, bis auf die transaction, die gibt es aber auch nicht in meiner serverversion.

    was mir bleibt, ist es auf einer anderen maschine nochmal zu versuchen, eventuell unter linux. vielleicht win98.

    ich habe zwei jboss versionen hier, eine mit tomcat, eine ohne.

    ich muss nochmal einen schritt zurück, und über diese jndi nachdenken. nach meinem verständnis müsste jboss alles regeln, wenn er mir die meldung gibt: das bean deployed. dann müsste er es über den namen kennen aus der ejb-jar.xml, und wenn ich zusätzlich eine jboss.xml anlege, dann gebe ich "sozusagen" noch ein alias.

    na ja.. kaffee ...



  • ich glaube das es an der transaction liegt
    den ich musste sie einbinden
    ohne sie funktionierte die verbindung nicht

    ich denk noch mal darüber nach
    aber erst muss ich ein ejb direkt als web service ansprechbar machen
    mal sehen wann ich damit fertig bin

    gomberl



  • habe mich durch die logs gewühlt, und gefunden, daß er mich einfach veräppelt hat..

    wenn jboss etwas nicht deployen kann, weil die jar nicht stimmt, dann sagt er, es wäre deployed.

    na ja, nun bin ich soweit, daß die jar stimmt, aber das helloworldbean seine classen nicht findet, obwohl ich alle bean klassen drin habe.

    danke fürs mitdenken, ich muss jetzt alle pfade nochmal überprüfen, warum findet er plötzlich javax nicht, da ist ejb drin, ebenso in der j2ee.

    es ist heillos, diese konfiguration ohne faq.



  • schick mir doch deine sources
    ich bin sowieso gerade dabei das in der arbeit zu machen da kann ich mir das gleich ansehen

    ich hab es zustande gebracht ein ejb direkt als web service ansprechbar zu machen
    wenn ich jetzt noch einen xml rpc darauf schaffe dann bin ich glücklich

    aber das wird sich schon noch ergeben

    lg

    gomberl



  • nachdem letzte woche das ganze unter debian nicht funzte, hier jetzt endlich ein HelloWorld.. uff.. und juchhee (komme mir vor wie gerade auf dem mond gelandet und der erste mensch da oben ... helloMond)

    zu doku zwecken, für leute, die eventuell ähnliche probleme haben... hier ein kurzer abriss (bei denen, wo die configuration schon steht, ja die habens gut... die können darüber lachen 😉 )

    also hier mal eine jboss-anfänger-runde
    erstmal habe ich es mir einfach gemacht, und alle tiefe weggenommen, also eine runde ohne unterordner..um jeglichen pfadproblemen von vornherein zu entgehen...

    HelloWorld.java

    public interface HelloWorld extends javax.ejb.EJBObject 
    {  
           public String hello() throws java.rmi.RemoteException;  
    }
    

    HelloWorldHome.java

    public interface HelloWorldHome extends javax.ejb.EJBHome  
    { 
          HelloWorld create() throws java.rmi.RemoteException, javax.ejb.CreateException; 
    }
    

    HelloWorldBean.java

    import javax.ejb.SessionContext;
    
    public class HelloWorldBean implements javax.ejb.SessionBean
    {
    
    	private SessionContext ctx;
    	public void setSessionContext(SessionContext ctx)
    	{
    	this.ctx = ctx;
    	}
    	public void ejbRemove()
    	{
    	System.out.println( "ejbRemove()" );
    	}
    	public void ejbActivate()
    	{
    	System.out.println( "ejbActivate()" );
    	}
    	public void ejbPassivate()
    	{
    	System.out.println( "ejbPassivate()" ) ;
    	}
    	public String hello()
    	{
    	System.out.println( "hello()" );
    	return "Hello World!";
    	}
    	public void ejbCreate()
    	{
    	System.out.println( "ejbCreate()" );
    	}
    }
    

    alle drei compilieren. ihr braucht ein ejb im javax (oder ähnlich irgendwo im pfad).
    die classfiles in einen ordner kopieren, dazu einen unterordner rein: META-INF

    mit der xml habe ich es mir einfach gemacht, es reicht eine ejb-jar.xml (die jboss kann, muss aber für dieses beispiel nicht)

    <?xml version="1.0" encoding="UTF-8"?>
    
    <ejb-jar>
    
    <description>JBoss Hello World Application</description>
    <display-name>Hello World EJB</display-name>
    <enterprise-beans>
    
    <session>
    
    <ejb-name>HelloWorld</ejb-name>
    
    	<home>HelloWorldHome</home>
    	<remote>HelloWorld</remote>
    	<ejb-class>HelloWorldBean
    
    </ejb-class>
    
    <session-type>Stateless</session-type>
    
    <transaction-type>Bean</transaction-type>
    
    </session>
    
    </enterprise-beans>
    
    </ejb-jar>
    

    wie man an dem xml file sieht, alles ohne unterordner. das war eins der probleme, das der später folgende client nicht nur wegen fehlerender jboss jars eine krise bekam, sondern hier schon streikte.. klar gehts anders, aber der einfachheit halber erstmal ohne.
    das xml file kommt in den META-INF ordner

    jetzt das jar file packen:

    jar cfv HelloWorld.jar .\ META-INF
    

    jboss starten (run.bat)
    dann jar file in den ordner : pfad...\jboss-3.0.4\server\default\deploy
    reinkopieren

    jboss sagt dann dazu:

    11:58:51,780 INFO  [jbossweb] successfully deployed file:/E:/jboss/jboss-3.0.4/s
    erver/default/deploy/http-invoker.sar/invoker.war/ to /invoker
    11:58:51,780 INFO  [HttpInvoker] Starting
    11:58:51,830 INFO  [HttpInvoker] Started
    11:58:51,830 INFO  [HttpInvokerHA] Starting
    11:58:51,830 INFO  [HttpInvokerHA] Started
    11:58:51,830 INFO  [MainDeployer] Deployed package: file:/E:/jboss/jboss-3.0.4/s
    erver/default/deploy/http-invoker.sar/
    

    danach den client kompilieren (mit testausgaben) :

    HelloWorldClient.java

    import javax.naming.Context;
    import javax.naming.InitialContext;
    import java.util.Hashtable;
    import java.util.*;
    import java.io.*;
    
    public class HelloWorldClient  extends Thread
    {
    	public static void main( String [] args )
    	{
    	try { Thread.sleep(1000); } catch (InterruptedException e) {}
    		System.out.println("anfang");
    	try { Thread.sleep(10); } catch (InterruptedException e) {}
    
    		System.out.println("eins");
    	Hashtable env = new Hashtable();
    	try { Thread.sleep(1000); } catch (InterruptedException e) {}
    	System.out.println("zwei");
    	env.put(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory");
    	try { Thread.sleep(1000); } catch (InterruptedException e) {}
    	System.out.println("drei");
    	env.put(Context.PROVIDER_URL, "localhost:1099");
    	try { Thread.sleep(1000); } catch (InterruptedException e) {}
    	System.out.println("vier");
    	env.put("java.naming.factory.url.pkgs", "org.jboss.naming:org.jnp.interfaces");
    
    	try { Thread.sleep(1000); } catch (InterruptedException e) {}
    	System.out.println("fünf");
    
    		try
    		{
    
    			Context ctx = new InitialContext(env);
    			try { Thread.sleep(1000); } catch (InterruptedException e) {}
    				System.out.println("sechs");
    
    		    Object obj = ctx.lookup( "HelloWorld" );
    
    		    try { Thread.sleep(1000); } catch (InterruptedException e) {}
    				System.out.println("sieben");
    
    			HelloWorldHome home = (HelloWorldHome)javax.rmi.PortableRemoteObject.narrow( obj, HelloWorldHome.class );
    			HelloWorld helloWorld = home.create();
    			System.out.println( helloWorld.hello());
    //			helloWorld.remove();
    
    			}
    
    			catch ( Exception e )
    			{
    
    			e.printStackTrace();
    			System.out.println( "Exception: " + e.getMessage() );
    
    		}
    	}
    }
    

    im classpath müssen folgende jars beim ausführen enthalten sein für dieses bean:

    client\jnp-client.jar
    client\log4.jar
    client\jbossall-client.jar
    client\jbosssx-client.jar
    client\jboss-system-client.jar
    client\jboss-client.jar
    

    das war das wichtigste.. ich hatte zuviele! jars zeitweise drin, die haben sich wohl gegenseitig genervt, eventuell wars auch die reihenfolge.. auf jeden war das der eigentliche grusel. ich habe eine nach der anderen gesucht und eingebunden, je nach fehlermeldung.. fragt mich, wo im jboss etwas versteckt ist, ich weiß es nun 😉

    dann starten, ausgegeben wird auf client seite: ein immens tolles, klares super "HelloWorld", das schönste seit langem 😉

    serverausgabe ist ebso da, er meldet einen funkspruch:

    12:34:21,130 INFO  [STDOUT] ejbCreate()
    12:34:21,130 INFO  [STDOUT] hello()
    

    so, nun werde ich mir entweder meine eclipse einrichten zum arbeiten (damit gehts denk ich am besten) und noch ein ant-file zum deployen herstellen.

    das ant-file poste ich noch.

    big thanks an gomberl für die unterstützung



  • sollte in die FAQ denke ich


Anmelden zum Antworten