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();
                        }
                }
        }
}

Reply via email to