[jboss-jira] [JBoss JIRA] Closed: (JBAS-6912) If current class loader is a URLClassLoader then spaces anywhere in the url list causes MalformedURLExceptions to be reported on JNDI lookup
Adrian Brock (JIRA)
jira-events at lists.jboss.org
Thu May 14 07:08:46 EDT 2009
[ https://jira.jboss.org/jira/browse/JBAS-6912?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Adrian Brock closed JBAS-6912.
------------------------------
Resolution: Incomplete Description
Assignee: (was: Scott M Stark)
I'm closing this as "incomplete description" since it is not clear how this relates to any JBoss code.
The specific failure is in the RMIClassLoader where it tries to determine the "annotation"
from the URLs of the classloader.
For any jboss classloader the annotations are always "null" because we use a different
mechanism to control remote classloading, so you couldn't possibly get the error shown.
This is partly because sending the urls across the wire on every RMI request leads to a lot
of bloat and inefficiency. See getURLs() here:
http://viewvc.jboss.org/cgi-bin/viewvc.cgi/jbossas/tags/JBoss_4_0_1/system/src/main/org/jboss/system/server/NoAnnotationURLClassLoader.java?revision=54874&view=markup
As for the File.toURL() bug in the JDK, this is a known issue mentioned in the javadoc
with a "workaround" so it isn't a JBoss issue (unless we have code that is not using the
correct mechanism).
http://java.sun.com/javase/6/docs/api/java/io/File.html#toURL()
The method is actually deprecated because of this problem.
> If current class loader is a URLClassLoader then spaces anywhere in the url list causes MalformedURLExceptions to be reported on JNDI lookup
> --------------------------------------------------------------------------------------------------------------------------------------------
>
> Key: JBAS-6912
> URL: https://jira.jboss.org/jira/browse/JBAS-6912
> Project: JBoss Application Server
> Issue Type: Bug
> Security Level: Public(Everyone can see)
> Components: Naming
> Affects Versions: JBossAS-4.2.1.GA
> Environment: Observed on Windows
> Reporter: David Crighton
>
> Our product (Websphere Message Broker) integrates with several JMS providers. We recently got a customer reporting excepetions on JBoss 4.2.1 which we tracked down to be during JNDI lookup of the JMS Destinations from JBoss. It turns out that if the threads classloader is a URLClassLoader and any of its URLs contain a space then the following exception is observed:
> javax.naming.CommunicationException [Root exception is java.rmi.ServerException: RemoteException occurred in server thread; nested exception is:
> java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is:
> java.net.MalformedURLException: no protocol: files/jboss/jboss-4.2.1.GA/client/blah.jar]
> com.ibm.mqst.broker.jmsService.BrokerJMSService::handleNamingException: Rethrowing for application level handling
> javax.naming.CommunicationException [Root exception is java.rmi.ServerException: RemoteException occurred in server thread; nested exception is:
> java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is:
> java.net.MalformedURLException: no protocol: files/jboss/jboss-4.2.1.GA/client/blah.jar]
> at org.jnp.interfaces.NamingContext.lookup(NamingContext.java:724)
> at org.jnp.interfaces.NamingContext.lookup(NamingContext.java:589)
> at javax.naming.InitialContext.lookup(InitialContext.java:363)
> at com.ibm.mqst.broker.jmsService.BrokerJMSService.<init>(BrokerJMSService.java:402)
> at com.ibm.mqst.broker.jmsService.JBossConnector.main(JBossConnector.java:52)
> Caused by: java.rmi.ServerException: RemoteException occurred in server thread; nested exception is:
> java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is:
> java.net.MalformedURLException: no protocol: files/jboss/jboss-4.2.1.GA/client/blah.jar
> at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:341)
> at sun.rmi.transport.Transport$1.run(Transport.java:171)
> at java.security.AccessController.doPrivileged(AccessController.java:284)
> at sun.rmi.transport.Transport.serviceCall(Transport.java:167)
> at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:547)
> at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:802)
> at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:661)
> at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:896)
> at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918)
> at java.lang.Thread.run(Thread.java:735)
> at sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(StreamRemoteCall.java:263)
> at sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:239)
> at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:141)
> at org.jnp.server.NamingServer_Stub.lookup(Unknown Source)
> at org.jnp.interfaces.NamingContext.lookup(NamingContext.java:627)
> ... 4 more
> Caused by: java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is:
> java.net.MalformedURLException: no protocol: files/jboss/jboss-4.2.1.GA/client/blah.jar
> at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:298)
> at sun.rmi.transport.Transport$1.run(Transport.java:171)
> at java.security.AccessController.doPrivileged(AccessController.java:284)
> at sun.rmi.transport.Transport.serviceCall(Transport.java:167)
> at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:547)
> at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:802)
> at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:661)
> at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:896)
> at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918)
> at java.lang.Thread.run(Thread.java:735)
> Caused by: java.net.MalformedURLException: no protocol: files/jboss/jboss-4.2.1.GA/client/blah.jar
> at java.lang.Throwable.<init>(Throwable.java:67)
> at java.net.URL.<init>(URL.java:489)
> at java.net.URL.<init>(URL.java:464)
> at java.net.URL.<init>(URL.java:413)
> at sun.rmi.server.LoaderHandler.pathToURLs(LoaderHandler.java:751)
> at sun.rmi.server.LoaderHandler.loadClass(LoaderHandler.java:147)
> at java.rmi.server.RMIClassLoader$2.loadClass(RMIClassLoader.java:631)
> at org.jboss.system.JBossRMIClassLoader.loadClass(JBossRMIClassLoader.java:91)
> at java.rmi.server.RMIClassLoader.loadClass(RMIClassLoader.java:258)
> at sun.rmi.server.MarshalInputStream.resolveClass(MarshalInputStream.java:209)
> at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1586)
> at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1507)
> at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1743)
> at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1340)
> at java.io.ObjectInputStream.readObject(ObjectInputStream.java:362)
> at javax.naming.CompoundName.readObject(CompoundName.java:796)
> at sun.reflect.GeneratedMethodAccessor70.invoke(Unknown Source)
> at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:37)
> at java.lang.reflect.Method.invoke(Method.java:599)
> at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:985)
> at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1860)
> at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1764)
> at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1340)
> at java.io.ObjectInputStream.readObject(ObjectInputStream.java:362)
> at sun.rmi.server.UnicastRef.unmarshalValue(UnicastRef.java:318)
> at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:295)
> ... 9 more
> The customer was able to recreate outside the broker using the following code:
> URL[] urls = new URL[4];
> try {
> File file1 = new File("c:\\program files\\jboss\\jboss-4.2.1.GA\\client\\blah.jar");
> File file2 = new File("c:\\temp\\jboss\\jboss-4.2.1.GA\\client\\jbossall-client.jar");
> File file3 = new File("c:\\program files\\jboss\\jboss-4.2.1.GA\\client\\blah.jar");
> File file4 = new File("c:\\program files\\jboss\\jboss-4.2.1.GA\\client\\blah.jar");
>
> System.out.println("example url: " + file1.toURL().toExternalForm() + "--" + file1.toURI().toURL().toExternalForm());
> urls[0] = file1.toURL();
> urls[1] = file2.toURL();
> urls[2] = file3.toURL();
> urls[3] = file4.toURL();
>
> } catch (MalformedURLException e1) {
> // TODO Auto-generated catch block
> System.println("Malformed URI for JRE");
> e1.printStackTrace();
> System.exit(-1);
> }
> URLClassLoader cl = new URLClassLoader(urls);
> Thread.currentThread().setContextClassLoader(cl);
>
>
> Hashtable environment = new Hashtable();
> environment.put(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory");
> environment.put(Context.PROVIDER_URL, "jnp://server_address:1099");
> environment.put(Context.REFERRAL, "throw");
> try{
> Context c = new InitialDirContext(environment);
> ConnectionFactory connectionFactory = (ConnectionFactory) c.lookup("ConnectionFactory");
> }
> catch(Exception e){
> //this is where we catch the NamingException
> e.printStackTrace();
> }
> Escaping the spaces resolves problem ie/
> urls[0] = file1.toURI().toURL();
> We will be using this workaround in our product so impact can be considered small.
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: https://jira.jboss.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira
More information about the jboss-jira
mailing list