Vi skal til at bygge en hovedopgave i JBoss og opgaven er således.
Et firma har en centralt server indeholdene MP3er og interviews osv. Så skal adskillige klienter med en application som vi skal bygge til dem logge sig på den centrale server og kunne afspille de forskellige filer.
J2EE (Java 2 Enterprise Edition) = JSP + servlet + EJB + JCA JSP (Java Server Pages) = HTML med embedded kode a la ASP og PHP servlet = ren Java kode som køres på server (svarer til ISAPI og NSAPI moduler) EJB (Enterprise Java Beans) = session beans + entity beans + message driven beans session beans = service med business logik entity bean = repræsentation af database record = CMP + BMP message driven bean = input fra message queue CMP (Container Managed Persistence) = entity bean hvor app-serveren skriver SQL koden BMP (Bean Managed Persistence) = entity bean hvor du skriver SQL koden JCA (Java Connector Architecture) = interface til eksterne systemer
Startede JBoss op og lagde filerne test-ejb.jar og testdb-service.xml i mappen jboss-3.2.3\jboss-3.2.3\server\default\deploy hvorefter jeg fik en masse fejl på DOS vinduet. Her er lidt af det:
Depends On Me: org.jboss.deployment.DeploymentException: Exception setting attr ibute javax.management.Attribute: name=ManagedConnectionFactoryName value=jboss. jca:service=LocalTxDS,name=TestDB on mbean jboss.jca:service=LocalTxCM,name=Test DB; - nested throwable: (javax.management.AttributeNotFoundException: Writable a ttribute 'ManagedConnectionFactoryName' not found), ObjectName: jboss.jca:servic e=LocalTxDS,name=TestDB state: FAILED I Depend On: Depends On Me: jboss.jca:service=LocalTxCM,name=TestDB org.jboss.deployment.DeploymentException: No Attribute found with name: JndiName , ObjectName: jboss.j2ee:jndiName=ejb/T1,service=EJB state: FAILED I Depend On: Depends On Me: org.jboss.deployment.DeploymentException: Error: can't find data source: java:/TestDB; - nested throwable: (javax.naming.NameNotFoundException: TestDB not bound)]
Alternativt kan du undlade den *-ds.xml og rette til at bruge DefaultDS som HSqlDb hedder. Men så skal du også ændre i test koden, fordi den læser kun eksisterende data.
Ok det lyder fint Arne jeg vil mødes med gruppen og forsøge at få dit eksempel op at køre så kan det være at vi får en lidt bedre forståelse for hvad J2EE går ud på.
Skal dog lige høre inden filerne test-ejb.jar og testdb-service.xml hvad bruges de til og hva sker der når man deployer dem?
javax.naming.NoInitialContextException: Cannot instantiate class: org.jnp.interfaces.NamingContextFactory [Root exception is java.lang.ClassNotFoundException: org.jnp.interfaces.NamingContextFactory] at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:652) at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:243) at javax.naming.InitialContext.init(InitialContext.java:219) at javax.naming.InitialContext.<init>(InitialContext.java:175) at TestT1.main(Unknown Source) Caused by: java.lang.ClassNotFoundException: org.jnp.interfaces.NamingContextFactory at java.net.URLClassLoader$1.run(URLClassLoader.java:199) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:187) at java.lang.ClassLoader.loadClass(ClassLoader.java:289) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:274) at java.lang.ClassLoader.loadClass(ClassLoader.java:235) at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:302) at java.lang.Class.forName0(Native Method) at java.lang.Class.forName(Class.java:219) at com.sun.naming.internal.VersionHelper12.loadClass(VersionHelper12.java:42) at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:649) ... 4 more
17:06:53,766 ERROR [LogInterceptor] RuntimeException: java.lang.IllegalStateException: createBeanClassInstanceCommand == null at org.jboss.ejb.plugins.cmp.jdbc.JDBCStoreManager.createBeanClassInstance(JDBCStoreManager.java:542) at org.jboss.ejb.plugins.CMPPersistenceManager.createBeanClassInstance(CMPPersistenceManager.java:119) at org.jboss.ejb.EntityContainer.createBeanClassInstance(EntityContainer.java:226) at org.jboss.ejb.plugins.AbstractInstancePool.get(AbstractInstancePool.java:168) OSV OSV OSV
Deploy af testdb-ds.xml gik fint. Men .jar filen gav nogle fejl. Fejlen var at den ikke kunne finde driveren til mysql.
Jeg lagde så driveren ind i lib/ext (og også server/default/lib) og genstartede jboss, men nu er den begyndt at komme med en masse exceptions under opstart (port 4444 is already in use)?!?
Er det hurtigste ikke bare at geninstallere jboss?
Jeg fik rettet port 4444 problemet (det viste sig selvfølgelig efter genstart og geninstallering at jeg har en server kørende på den port... hehe ;-)
Nu får jeg ikke driver fejlen men en connection refused?
18:22:28,929 WARN [JBossManagedConnectionPool] Throwable while attempting to get a new connection: org.jboss.resource.JBossResourceException: Could not create connection; - nested throwable: (java.sql.SQLException: Unable to connect to any hosts due to exception: java.net.ConnectException: Connection refused) at org.jboss.resource.adapter.jdbc.local.LocalManagedConnectionFactory.createManagedConnection(LocalManagedConnectionFactory.java:160) at org.jboss.resource.connectionmanager.InternalManagedConnectionPool.createConnectionEventListener(InternalManagedConnectionPool.java:477) at org.jboss.resource.connectionmanager.InternalManagedConnectionPool.getConnection(InternalManagedConnectionPool.java:213)
ja, men på min debian maskine er det admin og ikke root. Derudover har jeg også prøvet med en special bruger oprettet specifikt til j2ee databasen uden held.
Nå men for lige at skitsere mine problemer og løsninger:
EJB kunne ikke forbinde til databasen. Jeg prøvede så med en hurtig java klient og jdbc og fik samme fejl. Fandt ud af at på debian er der som standard slået skip_networking til som gør at man ikke kan forbinde via TCP/IP; hvilket man skal med JDBC :( Da den blev slået fra fungerede det og min EJB klient udskrev sørme det som stod i tabellen ;-)
Der er dog lige nogle ting der undrer mig:
Jeg oprettede selv min tabel i db, men da jeg deployede skrev den "21:55:33,470 INFO [T1] Table 'T1' already exists". Det virkede dog alligevel. Såtænkte jeg at jeg måske kunne have ladet være med at oprette tabellen og den så gjorde det for mig. Men så skrev den dette "Too big column length for column 'F2' (max = 255). Use BLOB instead" og oprettede ikke tabellen.
Jeg har aldrig brudt mig om at entity beans selv oprettede tabeller - jeg vil selv oprette dem, så jeg ved præcis hvordan de er oprettet. I praksis vil tabeller også ofte eksisterer fordi de er oprettet til en anden applikation.
Tak for hjælpen arne. Jeg tror faktisk at jeg har fået brudt isen til j2ee. Kan du her på falderebet af dette spørgsmål lige svare mig på dette:
Hvis jeg vil have denne klient (TestT1) til at køre på en anden maskine og forbinde til serveren, skal jeg så bruge hele client mappen fra JBoss eller er der noget jeg kan undvære?
P.S. aslan er ikke hjemme i aften, så der bliver først delt point ud i morgen.
Arne hvis man f.eks gerne i remotehome interfacet vil lave en metode der sletter fra db hvordan gør man så det? Den indholder allerede de 3 standard metoder(create,findByPrimaryKey,findAll), men findes der også en til at slette med?
Opretter lige et nyt spørgsmål så du kan få points har også andre småting jeg lige vil spørge om...
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.