unable to call getKeys using JNDI
kkalmbach Jan 26, 2005 3:36 PMI an unable to call getKeys on a TreeCache. I get the Cache by doing a JNDI lookup. Once I get it I can do a put and get with no problem. When I call getKeys I get an NotSerializableException on java.util.HashMap$KeySet.
Here is my JUnit test and results..
package com.cexp.common.enterprise; import java.util.Set; import java.util.Collection; import java.util.Iterator; import junit.framework.TestCase; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.jboss.cache.TreeCacheMBean; import javax.naming.NameNotFoundException; import javax.naming.InitialContext; import javax.naming.NameParser; import javax.naming.NamingException; import javax.naming.Context; import javax.naming.Name; /** Simple tests for the ContextFramework. * @author kkalmbac * */ public class TestCache extends TestCase { /** the logger. */ private static Log log = LogFactory.getLog(TestCache.class); private InitialContext context; private TreeCacheMBean theCache; public static Object lookup(Context context, Name name) throws NamingException { // Try the lookup twice because, if the naming server has gone down, // the jndi connection in the context is stale and doesn't seem to // get recreated until after the first lookup attempt. The second // lookup attempt will then succeed. int lookupCount = 0; int lookupAttempts = 2; while (lookupCount++ < lookupAttempts) { try { if(log.isDebugEnabled()){ log.debug("lookup() name=" + name); } return context.lookup(name); } catch (NamingException e) { if(log.isDebugEnabled()){ log.debug("lookup() NamingException", e); } if (lookupCount == lookupAttempts) throw e; } } return null; } public static Object lookup(Context context, String name) throws NamingException { NameParser parser = context.getNameParser(context.getNameInNamespace()); return lookup(context, parser.parse(name)); } protected InitialContext getContext() { if (context == null) { try { context = new InitialContext(); } catch (Exception e) { log.error("could not get initial context", e); } } return context; } private TreeCacheMBean getCache() { if (log.isDebugEnabled()) { log.debug("getCache()"); } if (theCache == null) { try { theCache = (TreeCacheMBean)lookup(getContext(), "MyTreeCache"); if (log.isDebugEnabled()) { log.debug("cache found " + theCache); } } catch (NameNotFoundException e) { } catch (Exception e) { } } return theCache; } /** Constructor. * @param s the test name */ public TestCache(String s) { super(s); System.setProperty( "java.naming.factory.initial", "org.jnp.interfaces.NamingContextFactory"); System.setProperty( "java.naming.factory.url.pkgs", "org.jboss.naming:org.jnp.interfaces"); System.setProperty( "jnp.socketFactory", "org.jnp.interfaces.TimedSocketFactory"); System.setProperty("java.naming.provider.url", "jnp://localhost:1099"); System.setProperty("jnp.timeout", "0"); System.setProperty("jnp.sotimeout", "0"); } /** Simple tests for the UserContext. */ public void testGetKeys() { TreeCacheMBean cache = getCache(); try { cache.put("/","Test","value"); Object o = cache.get("/", "Test"); System.out.println("We got " + o); Set s = cache.getKeys("/"); } catch (Exception e) { e.printStackTrace(); } } }
Here is the results..
We got value java.lang.reflect.UndeclaredThrowableException at $Proxy0.getKeys(Unknown Source) at com.cexp.common.enterprise.TestCache.testGetKeys(TestCache.java:135) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:324) at junit.framework.TestCase.runTest(TestCase.java:154) at junit.framework.TestCase.runBare(TestCase.java:127) at junit.framework.TestResult$1.protect(TestResult.java:106) at junit.framework.TestResult.runProtected(TestResult.java:124) at junit.framework.TestResult.run(TestResult.java:109) at junit.framework.TestCase.run(TestCase.java:118) at junit.framework.TestSuite.runTest(TestSuite.java:208) at junit.framework.TestSuite.run(TestSuite.java:203) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:392) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:276) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:167) Caused by: java.io.NotSerializableException: java.util.HashMap$KeySet at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1054) at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1332) at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1304) at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1247) at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1052) at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:278) at org.jboss.remoting.RemoteMethodInvocationResult.<init>(RemoteMethodInvocationResult.java:47) at org.jboss.remoting.ServerInvoker.invoke(ServerInvoker.java:284) at org.jboss.remoting.transport.socket.SocketServerInvoker$Client.run(SocketServerInvoker.java:208)
Any help at all would be appreciated.
Thanks
-Kevin