Hi,
I'm a Jackrabbit newbie. I'm doing some tests with the tool and I'm having
problem with concurrent sessions.
I have joined my (simple) test class (JCRTest) and the exception I get from
running it.
Anyone had similar problems ?
Regards,
Nicolas
-->The exception report:
java.util.NoSuchElementException: cdeab285-fdbc-4af3-918a-bf4316a29276
at org.apache.jackrabbit.core.LazyItemIterator.next(LazyItemIterator.java:157)
at
org.apache.jackrabbit.core.LazyItemIterator.nextNode(LazyItemIterator.java:98)
at app.JCRTest$ThreadDeleter.run(JCRTest.java:107)
-->The class:
package app;
import java.util.Hashtable;
import javax.jcr.Node;
import javax.jcr.NodeIterator;
import javax.jcr.Repository;
import javax.jcr.RepositoryException;
import javax.jcr.Session;
import javax.jcr.SimpleCredentials;
import javax.jcr.observation.Event;
import javax.jcr.observation.EventIterator;
import javax.jcr.observation.EventListener;
import javax.naming.Context;
import javax.naming.InitialContext;
import org.apache.jackrabbit.core.jndi.RegistryHelper;
import org.apache.jackrabbit.core.value.StringValue;
public class JCRTest {
private Repository repository;
public JCRTest(Repository repository) {
this.repository = repository;
}
public void execute() throws Exception {
Session session = this.repository.login(new
SimpleCredentials("", "".toCharArray()), null);
Node rn = session.getRootNode();
new ThreadObserver().start();
Node n = rn.addNode("node" + System.currentTimeMillis(),
"nt:unstructured");
n.setProperty("testprop", new StringValue("Hello, World."));
new ThreadDeleter().start();
session.save();
session.logout();
}
public static void main(String[] args) {
try {
String configFile = "repository/repository.xml";
String repHomeDir = "repository";
Hashtable env = new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY,
"org.apache.jackrabbit.core.jndi.provider.DummyInitialContextFactory");
env.put(Context.PROVIDER_URL, "localhost");
InitialContext ctx = new InitialContext(env);
RegistryHelper.registerRepository(ctx, "repo",
configFile, repHomeDir, true);
Repository r = (Repository) ctx.lookup("repo");
for (int i = 0; i < 20; i++) {
JCRTest test = new JCRTest(r);
test.execute();
}
} catch (Exception e){
e.printStackTrace();
}
}
public class ThreadObserver extends Thread {
public void run() {
System.out.println("Observing thread started");
try {
Session session = repository.login(new
SimpleCredentials("", "".toCharArray()));
EventListener el = new EventListener() {
public void onEvent(EventIterator
events) {
while (events.hasNext()) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {}
Event e = events.nextEvent();
if (e.getType() ==
Event.NODE_ADDED) {
try {
System.out.println("Node
added : " + e.getPath());
} catch
(RepositoryException re) {
re.printStackTrace();
}
}
}
}
};
session.getWorkspace().getObservationManager().addEventListener(el,
Event.NODE_ADDED, "/", true, null, null, false);
session.save();
//Some time to listen
Thread.sleep(500);
session.logout();
} catch (Exception e) {
e.printStackTrace();
}
}
}
public class ThreadDeleter extends Thread {
public void run() {
System.out.println("Deleter thread started");
try {
Session session = repository.login(new
SimpleCredentials("", "".toCharArray()));
Node rn = session.getRootNode();
for (NodeIterator ni = rn.getNodes();
ni.hasNext(); ) {
Thread.sleep(100);
Node currentNode = ni.nextNode();
if
(currentNode.getName().startsWith("node")) {
currentNode.remove();
}
}
session.save();
session.logout();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}