From d467d1a208160fb5c5b03412bd0bac78375f2998 Mon Sep 17 00:00:00 2001 From: Andrew Hind Date: Mon, 24 Apr 2006 16:22:49 +0000 Subject: [PATCH] IOC for scheduling git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@2696 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- config/alfresco/scheduled-jobs-context.xml | 72 +++--- .../node/ConcurrentNodeServiceSearchTest.java | 241 ++++++++++++++++++ .../repo/search/impl/lucene/LuceneTest.java | 3 +- .../lucene/fts/FullTextSearchIndexerImpl.java | 6 +- 4 files changed, 279 insertions(+), 43 deletions(-) create mode 100644 source/java/org/alfresco/repo/node/ConcurrentNodeServiceSearchTest.java diff --git a/config/alfresco/scheduled-jobs-context.xml b/config/alfresco/scheduled-jobs-context.xml index 7e5c0462fc..2e9db77be8 100644 --- a/config/alfresco/scheduled-jobs-context.xml +++ b/config/alfresco/scheduled-jobs-context.xml @@ -6,7 +6,7 @@ - + @@ -21,15 +21,19 @@ + 60000 60000 + + + - - + + @@ -50,9 +54,12 @@ 3600000 + + + - + @@ -67,19 +74,17 @@ - - - 04 + + - - 00 - - - 86400000 + + + 0 0 4 * * ? - + + @@ -100,9 +105,12 @@ 0 + + + - + @@ -117,20 +125,17 @@ - - - 03 + + - - 00 - - - 86400000 + + + 0 0 3 * * ? - + @@ -147,29 +152,18 @@ + + - - - - - - - - - - - true classpath:alfresco/domain/quartz.properties + + DefaultScheduler + \ No newline at end of file diff --git a/source/java/org/alfresco/repo/node/ConcurrentNodeServiceSearchTest.java b/source/java/org/alfresco/repo/node/ConcurrentNodeServiceSearchTest.java new file mode 100644 index 0000000000..14a32afe4f --- /dev/null +++ b/source/java/org/alfresco/repo/node/ConcurrentNodeServiceSearchTest.java @@ -0,0 +1,241 @@ +/* + * Copyright (C) 2005 Alfresco, Inc. + * + * Licensed under the Mozilla Public License version 1.1 + * with a permitted attribution clause. You may obtain a + * copy of the License at + * + * http://www.alfresco.org/legal/license.txt + * + * 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.alfresco.repo.node; + +import java.io.InputStream; +import java.util.Map; + +import javax.transaction.UserTransaction; + +import junit.framework.TestCase; + +import org.alfresco.repo.dictionary.DictionaryDAO; +import org.alfresco.repo.dictionary.M2Model; +import org.alfresco.repo.search.impl.lucene.fts.FullTextSearchIndexer; +import org.alfresco.repo.security.authentication.AuthenticationComponent; +import org.alfresco.service.ServiceRegistry; +import org.alfresco.service.cmr.repository.ChildAssociationRef; +import org.alfresco.service.cmr.repository.NodeRef; +import org.alfresco.service.cmr.repository.NodeService; +import org.alfresco.service.cmr.repository.StoreRef; +import org.alfresco.service.cmr.search.ResultSet; +import org.alfresco.service.cmr.search.SearchService; +import org.alfresco.service.namespace.DynamicNamespacePrefixResolver; +import org.alfresco.service.namespace.NamespacePrefixResolver; +import org.alfresco.service.namespace.NamespaceService; +import org.alfresco.service.namespace.QName; +import org.alfresco.service.transaction.TransactionService; +import org.alfresco.util.ApplicationContextHelper; +import org.apache.lucene.index.IndexWriter; +import org.springframework.context.ApplicationContext; + +public class ConcurrentNodeServiceSearchTest extends TestCase +{ + + public static final String NAMESPACE = "http://www.alfresco.org/test/BaseNodeServiceTest"; + + public static final String TEST_PREFIX = "test"; + + public static final QName TYPE_QNAME_TEST_CONTENT = QName.createQName(NAMESPACE, "content"); + + public static final QName ASPECT_QNAME_TEST_TITLED = QName.createQName(NAMESPACE, "titled"); + + public static final QName PROP_QNAME_TEST_TITLE = QName.createQName(NAMESPACE, "title"); + + public static final QName PROP_QNAME_TEST_MIMETYPE = QName.createQName(NAMESPACE, "mimetype"); + + static ApplicationContext ctx = ApplicationContextHelper.getApplicationContext(); + + private NodeService nodeService; + + private TransactionService transactionService; + + private NodeRef rootNodeRef; + + private FullTextSearchIndexer luceneFTS; + + private AuthenticationComponent authenticationComponent; + + public ConcurrentNodeServiceSearchTest() + { + super(); + } + + protected void setUp() throws Exception + { + DictionaryDAO dictionaryDao = (DictionaryDAO) ctx.getBean("dictionaryDAO"); + // load the system model + ClassLoader cl = BaseNodeServiceTest.class.getClassLoader(); + InputStream modelStream = cl.getResourceAsStream("alfresco/model/systemModel.xml"); + assertNotNull(modelStream); + M2Model model = M2Model.createModel(modelStream); + dictionaryDao.putModel(model); + // load the test model + modelStream = cl.getResourceAsStream("org/alfresco/repo/node/BaseNodeServiceTest_model.xml"); + assertNotNull(modelStream); + model = M2Model.createModel(modelStream); + dictionaryDao.putModel(model); + + nodeService = (NodeService) ctx.getBean("dbNodeService"); + transactionService = (TransactionService) ctx.getBean("transactionComponent"); + luceneFTS = (FullTextSearchIndexer) ctx.getBean("LuceneFullTextSearchIndexer"); + this.authenticationComponent = (AuthenticationComponent) ctx.getBean("authenticationComponent"); + + this.authenticationComponent.setSystemUserAsCurrentUser(); + + // create a first store directly + UserTransaction tx = transactionService.getUserTransaction(); + tx.begin(); + StoreRef storeRef = nodeService.createStore(StoreRef.PROTOCOL_WORKSPACE, "Test_" + System.currentTimeMillis()); + rootNodeRef = nodeService.getRootNode(storeRef); + tx.commit(); + } + + @Override + protected void tearDown() throws Exception + { + authenticationComponent.clearCurrentSecurityContext(); + super.tearDown(); + } + + protected Map buildNodeGraph() throws Exception + { + return BaseNodeServiceTest.buildNodeGraph(nodeService, rootNodeRef); + } + + protected Map commitNodeGraph() throws Exception + { + UserTransaction tx = transactionService.getUserTransaction(); + tx.begin(); + Map answer = buildNodeGraph(); + tx.commit(); + + return null;// answer; + } + + public void testConcurrent() throws Exception + { + luceneFTS.pause(); + IndexWriter.COMMIT_LOCK_TIMEOUT = 100000; + int count = 10; + int repeats = 10; + + SearchService searcher = (SearchService) ctx.getBean(ServiceRegistry.SEARCH_SERVICE.getLocalName()); + + Map assocRefs = commitNodeGraph(); + Thread runner = null; + + for (int i = 0; i < count; i++) + { + runner = new Nester("Concurrent-" + i, runner, repeats, searcher); + } + if (runner != null) + { + runner.start(); + + try + { + runner.join(); + } + catch (InterruptedException e) + { + e.printStackTrace(); + } + } + + assertEquals(2, searcher.selectNodes(rootNodeRef, "/*", null, + getNamespacePrefixReolsver(""), false).size()); + ResultSet results = searcher.query(rootNodeRef.getStoreRef(), "lucene", "PATH:\"/*\""); + // n6 has root aspect - there are three things at the root level in the + // index + assertEquals(3, results.length()); + results.close(); + } + + /** + * Daemon thread + */ + class Nester extends Thread + { + Thread waiter; + + int repeats; + + SearchService searcher; + + Nester(String name, Thread waiter, int repeats, SearchService searcher) + { + super(name); + this.setDaemon(true); + this.waiter = waiter; + this.repeats = repeats; + this.searcher = searcher; + } + + public void run() + { + authenticationComponent.setSystemUserAsCurrentUser(); + + if (waiter != null) + { + waiter.start(); + } + try + { + System.out.println("Start " + this.getName()); + for (int i = 0; i < repeats; i++) + { + // Map assocRefs = commitNodeGraph(); + if (i % 50 == 0) + { + System.out.println(" " + this.getName() + " " + i); + } + ResultSet results = searcher.query(rootNodeRef.getStoreRef(), "lucene", "PATH:\"/*\""); + results.close(); + } + System.out.println("End " + this.getName()); + } + catch (Exception e) + { + e.printStackTrace(); + System.exit(12); + } + if (waiter != null) + { + try + { + waiter.join(); + } + catch (InterruptedException e) + { + } + } + } + + } + + private NamespacePrefixResolver getNamespacePrefixReolsver(String defaultURI) + { + DynamicNamespacePrefixResolver nspr = new DynamicNamespacePrefixResolver(null); + nspr.registerNamespace(NamespaceService.SYSTEM_MODEL_PREFIX, NamespaceService.SYSTEM_MODEL_1_0_URI); + nspr.registerNamespace(NamespaceService.CONTENT_MODEL_PREFIX, NamespaceService.CONTENT_MODEL_1_0_URI); + nspr.registerNamespace(NamespaceService.APP_MODEL_PREFIX, NamespaceService.APP_MODEL_1_0_URI); + nspr.registerNamespace("namespace", "namespace"); + nspr.registerNamespace(NamespaceService.DEFAULT_PREFIX, defaultURI); + return nspr; + } +} diff --git a/source/java/org/alfresco/repo/search/impl/lucene/LuceneTest.java b/source/java/org/alfresco/repo/search/impl/lucene/LuceneTest.java index ade64f1d44..25af3ad3a9 100644 --- a/source/java/org/alfresco/repo/search/impl/lucene/LuceneTest.java +++ b/source/java/org/alfresco/repo/search/impl/lucene/LuceneTest.java @@ -522,6 +522,7 @@ public class LuceneTest extends TestCase { try { + authenticationComponent.setSystemUserAsCurrentUser(); UserTransaction tx = transactionService.getUserTransaction(); tx = transactionService.getUserTransaction(); tx.begin(); @@ -559,7 +560,7 @@ public class LuceneTest extends TestCase tx.rollback(); } - catch (Exception e) + catch (Throwable e) { throw new RuntimeException(e); } diff --git a/source/java/org/alfresco/repo/search/impl/lucene/fts/FullTextSearchIndexerImpl.java b/source/java/org/alfresco/repo/search/impl/lucene/fts/FullTextSearchIndexerImpl.java index 2763f517d9..83eccdb198 100644 --- a/source/java/org/alfresco/repo/search/impl/lucene/fts/FullTextSearchIndexerImpl.java +++ b/source/java/org/alfresco/repo/search/impl/lucene/fts/FullTextSearchIndexerImpl.java @@ -160,14 +160,14 @@ public class FullTextSearchIndexerImpl implements FTSIndexerAware, FullTextSearc StoreRef toIndex = getNextRef(); if (toIndex != null) { - //System.out.println("Indexing "+toIndex+" id is "+this); + //System.out.println("Indexing "+toIndex+" at "+(new java.util.Date())); LuceneIndexer indexer = luceneIndexerAndSearcherFactory.getIndexer(toIndex); indexer.registerCallBack(this); indexer.updateFullTextSearch(1000); } else - { - //System.out.println("Nothing to index"+" id is "+this); + { + //System.out.println("Nothing to Indexing at "+(new java.util.Date())); } }