concurrentnodemodificationtest.java

来自「jsr170接口的java实现。是个apache的开源项目。」· Java 代码 · 共 141 行

JAVA
141
字号
/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements.  See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License.  You may obtain a copy of the License at * *      http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */package org.apache.jackrabbit.core;import org.apache.jackrabbit.test.AbstractJCRTest;import javax.jcr.Node;import javax.jcr.Session;import javax.jcr.Value;import java.util.Random;import java.util.ArrayList;import java.util.Iterator;/** * Performs a test with n sessions concurrently performing non-conflicting * modifications on the <i>same</i> node. * <p/> * See http://issues.apache.org/jira/browse/JCR-584. */public class ConcurrentNodeModificationTest extends AbstractJCRTest {    private static final int NUM_ITERATIONS = 1;    private static final int NUM_SESSIONS = 10;    private static final int NUM_NODES = 100;    final ArrayList exceptions = new ArrayList();    /**     * Runs the test.     */    public void testConcurrentNodeModificationSessions() throws Exception {        int n = NUM_ITERATIONS;        while (n-- > 0) {            Thread[] threads = new Thread[NUM_SESSIONS];            for (int i = 0; i < threads.length; i++) {                // create new session                Session session = helper.getSuperuserSession();                TestSession ts = new TestSession("s" + i, session);                Thread t = new Thread(ts);                t.setName((NUM_ITERATIONS - n) + "-s" + i);                t.start();                log.println("Thread#" + i + " started");                threads[i] = t;                Thread.sleep(100);            }            for (int i = 0; i < threads.length; i++) {                threads[i].join();            }        }        if (!exceptions.isEmpty()) {            Exception e = null;            for (Iterator it = exceptions.iterator(); it.hasNext();) {                e = (Exception) it.next();                e.printStackTrace(log);            }            throw e;            //fail();        }    }    //--------------------------------------------------------< inner classes >    class TestSession implements Runnable {        Session session;        String identity;        Random r;        TestSession(String identity, Session s) {            session = s;            this.identity = identity;            r = new Random();        }        private void randomSleep() {            long l = r.nextInt(900) + 200;            try {                Thread.sleep(l);            } catch (InterruptedException ie) {            }        }        public void run() {            log.println("started.");            String state = "";            try {                Node n = session.getRootNode().getNode(testPath);                String propName = "testprop" + Math.random();                state = "setting property " + propName;                n.setProperty(propName, "Hello World!");                session.save();                randomSleep();                state = "removing property " + propName;                n.setProperty(propName, (Value) null);                session.save();                randomSleep();                for (int i = 0; i < NUM_NODES; i++) {                    state = "adding subnode " + i;                    //Node n1 = n.addNode("x" + i, "nt:unstructured");                    Node n1 = n.addNode("x" + identity + i, "nt:unstructured");                    state = "adding property to subnode " + i;                    n1.setProperty("testprop", "xxx");                    if (i % 10 == 0) {                        state = "saving pending subnodes";                        session.save();                    }                    randomSleep();                }                session.save();            } catch (Exception e) {                log.println("Exception while " + state + ": " + e.getMessage());                //e.printStackTrace();                exceptions.add(e);            } finally {                session.logout();            }            log.println("ended.");        }    }}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?