Ik ben een applicatie aan het migreren naar een recente versie van JBoss. Er doet zich een probleem voor bij het starten van een UserTransaction vanuit de client. Onderstaande code werkt op JBoss 3.2.7, maar niet in JBoss 4.0.3SP1. Ik staar me blind op waar het aan ligt.
De output van bovenstaande code is als volgt:
De inhoud van jndi.properties is als volgt:
Relevante uitvoer van de JNDI-view service in de JMX-console voor de global namespace:
De volgende dingen heb ik ondernomen om het probleem te verhelpen:
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
| package re.client; import java.net.URL; import javax.naming.Context; import javax.naming.InitialContext; import javax.rmi.PortableRemoteObject; import javax.transaction.UserTransaction; import org.apache.log4j.BasicConfigurator; import org.apache.log4j.Logger; public class Test { private static Logger logger = Logger.getLogger(Test.class); public static void main(String[] args) { BasicConfigurator.configure(); // initialiseer log4j Test test = new Test(); URL url = test.getClass().getResource("/jndi.properties"); logger.debug("JNDI props = " + url.toString()); try { Context context = new InitialContext(); Object o = context.lookup("UserTransaction"); logger.debug("Object is UserTransaction = " + String.valueOf(o instanceof UserTransaction)); UserTransaction transaction = (UserTransaction) PortableRemoteObject.narrow(o, UserTransaction.class); transaction.begin(); // doe iets met remote EJBs transaction.commit(); } catch (Exception e) { logger.fatal(e); } } } |
De output van bovenstaande code is als volgt:
0 [main] DEBUG re.client.Test - JNDI props = file:/C:/Projects/client/src/conf/jndi.properties 984 [main] DEBUG re.client.Test - Object is UserTransaction = true 1062 [main] FATAL re.client.Test - javax.transaction.SystemException: java.lang.RuntimeException: UT factory lookup failed
De inhoud van jndi.properties is als volgt:
java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory java.naming.provider.url=jnp://localhost:1099 java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces
Relevante uitvoer van de JNDI-view service in de JMX-console voor de global namespace:
+- UserTransactionSessionFactory (proxy: $Proxy12 implements interface org.jboss.tm.usertx.interfaces.UserTransactionSessionFactory) +- UserTransaction (class: org.jboss.tm.usertx.client.ClientUserTransaction)
De volgende dingen heb ik ondernomen om het probleem te verhelpen:
- Geverifieerd dat jndi.properties in het classpath staat (zie broncode).
- Geverifieerd dat JBoss een UserTransaction object retourneerd (zie broncode).
- Bij de overgang naar JBoss 4.0.3SP1 heb ik natuurlijk alle afhankelijkheden in de client verniewd: jboss-j2ee.jar, jnp-client.jar, jboss-client.jar, jboss-jaas.jar, jbosssx-client.jar, jboss-transaction-client.jar en jboss-common-client.jar zijn vervangen door versies die meegeleverd worden met JBoss 4.0.3SP1.
- In de debugger is geconstateerd dat transaction.begin() verantwoordelijk is voor de exceptie.
- De exceptie meldt "UT factory lookup failed". Waarschijnlijk is dit een exceptie die optreedt in JBoss? De serverlog van JBoss toont geen excepties.
- Google leverde niets op.
[ Voor 4% gewijzigd door ari3 op 30-10-2005 15:56 ]
"Kill one man, and you are a murderer. Kill millions of men, and you are a conqueror. Kill them all, and you are a god." -- Jean Rostand