From fee1643aa42c4635050ed05759196cabc9a1b1b9 Mon Sep 17 00:00:00 2001 From: srosse <none@none> Date: Thu, 18 Feb 2016 18:00:19 +0100 Subject: [PATCH] OO-1873: preload the last 100 courses on start to fill the cache, preload the course before entering an assessment mode --- .../java/org/olat/course/CourseFactory.java | 3 +- ...AssessmentModeCoordinationServiceImpl.java | 13 +++++ .../manager/LastCoursesPreWarm.java | 58 +++++++++++++++++++ .../java/org/olat/ims/qti/QTIPreWarm.java | 13 +++-- .../manager/RepositoryEntryDAO.java | 17 ++++++ 5 files changed, 98 insertions(+), 6 deletions(-) create mode 100644 src/main/java/org/olat/course/assessment/manager/LastCoursesPreWarm.java diff --git a/src/main/java/org/olat/course/CourseFactory.java b/src/main/java/org/olat/course/CourseFactory.java index 55fd8a63e20..131065ef0e4 100644 --- a/src/main/java/org/olat/course/CourseFactory.java +++ b/src/main/java/org/olat/course/CourseFactory.java @@ -70,7 +70,6 @@ import org.olat.core.logging.AssertException; import org.olat.core.logging.OLATRuntimeException; import org.olat.core.logging.OLog; import org.olat.core.logging.Tracing; -import org.olat.core.manager.BasicManager; import org.olat.core.util.CodeHelper; import org.olat.core.util.ExportUtil; import org.olat.core.util.FileUtils; @@ -147,7 +146,7 @@ import org.olat.util.logging.activity.LoggingResourceable; * @author Felix Jost * @author guido */ -public class CourseFactory extends BasicManager { +public class CourseFactory { private static CacheWrapper<Long,PersistingCourseImpl> loadedCourses; private static ConcurrentMap<Long, ModifyCourseEvent> modifyCourseEvents = new ConcurrentHashMap<Long, ModifyCourseEvent>(); diff --git a/src/main/java/org/olat/course/assessment/manager/AssessmentModeCoordinationServiceImpl.java b/src/main/java/org/olat/course/assessment/manager/AssessmentModeCoordinationServiceImpl.java index 14e20cdf7c9..271137a6e18 100644 --- a/src/main/java/org/olat/course/assessment/manager/AssessmentModeCoordinationServiceImpl.java +++ b/src/main/java/org/olat/course/assessment/manager/AssessmentModeCoordinationServiceImpl.java @@ -34,6 +34,7 @@ import org.olat.core.logging.OLog; import org.olat.core.logging.Tracing; import org.olat.core.util.coordinate.CoordinatorManager; import org.olat.core.util.event.GenericEventListener; +import org.olat.course.CourseFactory; import org.olat.course.assessment.AssessmentMode; import org.olat.course.assessment.AssessmentMode.Status; import org.olat.course.assessment.AssessmentModeCoordinationService; @@ -43,6 +44,8 @@ import org.olat.course.assessment.model.AssessmentModeImpl; import org.olat.course.assessment.model.CoordinatedAssessmentMode; import org.olat.course.assessment.model.TransientAssessmentMode; import org.olat.group.ui.edit.BusinessGroupModifiedEvent; +import org.olat.repository.RepositoryEntry; +import org.olat.repository.RepositoryService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -62,6 +65,8 @@ public class AssessmentModeCoordinationServiceImpl implements AssessmentModeCoor @Autowired private AssessmentModule assessmentModule; @Autowired + private RepositoryService repositoryService; + @Autowired private CoordinatorManager coordinatorManager; @Autowired private AssessmentModeManagerImpl assessmentModeManager; @@ -268,6 +273,9 @@ public class AssessmentModeCoordinationServiceImpl implements AssessmentModeCoor if(currentStatus == null || currentStatus != status) { mode.setStatus(status); mode = dbInstance.getCurrentEntityManager().merge(mode); + if(status == Status.leadtime || status == Status.assessment) { + warmUpAssessment(mode); + } dbInstance.commit(); } return mode; @@ -330,4 +338,9 @@ public class AssessmentModeCoordinationServiceImpl implements AssessmentModeCoor } return mode; } + + private void warmUpAssessment(AssessmentMode mode) { + RepositoryEntry entry = repositoryService.loadByKey(mode.getRepositoryEntry().getKey()); + CourseFactory.loadCourse(entry); + } } \ No newline at end of file diff --git a/src/main/java/org/olat/course/assessment/manager/LastCoursesPreWarm.java b/src/main/java/org/olat/course/assessment/manager/LastCoursesPreWarm.java new file mode 100644 index 00000000000..eda5f054d08 --- /dev/null +++ b/src/main/java/org/olat/course/assessment/manager/LastCoursesPreWarm.java @@ -0,0 +1,58 @@ +/** + * <a href="http://www.openolat.org"> + * OpenOLAT - Online Learning and Training</a><br> + * <p> + * Licensed under the Apache License, Version 2.0 (the "License"); <br> + * you may not use this file except in compliance with the License.<br> + * You may obtain a copy of the License at the + * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a> + * <p> + * Unless required by applicable law or agreed to in writing,<br> + * software distributed under the License is distributed on an "AS IS" BASIS, <br> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br> + * See the License for the specific language governing permissions and <br> + * limitations under the License. + * <p> + * Initial code contributed and copyrighted by<br> + * frentix GmbH, http://www.frentix.com + * <p> + */ +package org.olat.course.assessment.manager; + +import java.util.List; + +import org.olat.core.configuration.PreWarm; +import org.olat.core.logging.OLog; +import org.olat.core.logging.Tracing; +import org.olat.core.util.CodeHelper; +import org.olat.course.CourseFactory; +import org.olat.repository.RepositoryEntry; +import org.olat.repository.manager.RepositoryEntryDAO; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +/** + * + * Initial date: 18.02.2016<br> + * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com + * + */ +@Service +public class LastCoursesPreWarm implements PreWarm { + + private static final OLog log = Tracing.createLoggerFor(LastCoursesPreWarm.class); + + @Autowired + private RepositoryEntryDAO repositoryEntryDao; + + @Override + public void run() { + long start = System.nanoTime(); + List<RepositoryEntry> entries = repositoryEntryDao + .getLastUsedRepositoryEntries("CourseModule", 0, 100); + for(RepositoryEntry entry:entries) { + CourseFactory.loadCourse(entry); + } + log.info(entries.size() + " Courses preloaded in (ms): " + CodeHelper.nanoToMilliTime(start)); + } +} diff --git a/src/main/java/org/olat/ims/qti/QTIPreWarm.java b/src/main/java/org/olat/ims/qti/QTIPreWarm.java index c6fb853787e..64b0c50502c 100644 --- a/src/main/java/org/olat/ims/qti/QTIPreWarm.java +++ b/src/main/java/org/olat/ims/qti/QTIPreWarm.java @@ -22,8 +22,7 @@ package org.olat.ims.qti; import java.util.ArrayList; import java.util.List; -import org.olat.core.CoreSpringFactory; -import org.olat.core.commons.persistence.DBFactory; +import org.olat.core.commons.persistence.DB; import org.olat.core.configuration.PreWarm; import org.olat.core.logging.OLog; import org.olat.core.logging.Tracing; @@ -32,6 +31,7 @@ import org.olat.ims.qti.fileresource.SurveyFileResource; import org.olat.ims.qti.fileresource.TestFileResource; import org.olat.resource.OLATResource; import org.olat.resource.OLATResourceManager; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import de.bps.onyx.plugin.OnyxModule; @@ -48,6 +48,11 @@ import de.bps.onyx.plugin.OnyxModule; public class QTIPreWarm implements PreWarm { private static final OLog log = Tracing.createLoggerFor(QTIPreWarm.class); + + @Autowired + private DB dbInstance; + @Autowired + private OLATResourceManager olatResourceManager; @Override public void run() { @@ -57,8 +62,8 @@ public class QTIPreWarm implements PreWarm { List<String> types = new ArrayList<>(2); types.add(TestFileResource.TYPE_NAME); types.add(SurveyFileResource.TYPE_NAME); - List<OLATResource> qtiResources = CoreSpringFactory.getImpl(OLATResourceManager.class).findResourceByTypes(types); - DBFactory.getInstance().commitAndCloseSession(); + List<OLATResource> qtiResources = olatResourceManager.findResourceByTypes(types); + dbInstance.commitAndCloseSession(); for(OLATResource qtiResource:qtiResources) { OnyxModule.isOnyxTest(qtiResource); } diff --git a/src/main/java/org/olat/repository/manager/RepositoryEntryDAO.java b/src/main/java/org/olat/repository/manager/RepositoryEntryDAO.java index 628025bdbc9..2aa927ce1fe 100644 --- a/src/main/java/org/olat/repository/manager/RepositoryEntryDAO.java +++ b/src/main/java/org/olat/repository/manager/RepositoryEntryDAO.java @@ -155,4 +155,21 @@ public class RepositoryEntryDAO { } return entries.get(0); } + + public List<RepositoryEntry> getLastUsedRepositoryEntries(String resourceTypeName, int firstResult, int maxResults) { + StringBuilder sb = new StringBuilder(); + sb.append("select v from ").append(RepositoryEntry.class.getName()).append(" as v ") + .append(" inner join fetch v.olatResource as ores") + .append(" inner join fetch v.statistics as statistics") + .append(" left join fetch v.lifecycle as lifecycle") + .append(" where ores.resName=:resourceTypeName") + .append(" order by statistics.lastUsage desc"); + + return dbInstance.getCurrentEntityManager() + .createQuery(sb.toString(), RepositoryEntry.class) + .setFirstResult(firstResult) + .setMaxResults(maxResults) + .setParameter("resourceTypeName", resourceTypeName) + .getResultList(); + } } \ No newline at end of file -- GitLab