Skip to content
Snippets Groups Projects
Commit bbb433db authored by srosse's avatar srosse
Browse files

OO-1483: implement a prewarm infrastructure to warm-up openolat caches,...

OO-1483: implement a prewarm infrastructure to warm-up openolat caches, implement it for velocity templates, display names of users and QTI 2.1 resources
parent fa67c0ba
No related branches found
No related tags found
No related merge requests found
Showing
with 154 additions and 21 deletions
...@@ -10,7 +10,7 @@ ...@@ -10,7 +10,7 @@
$r.translate("fullindexer.label.running.indexer") : $searchstatus.fullIndexerStatus.NumberRunningFolderIndexer<br /> $r.translate("fullindexer.label.running.indexer") : $searchstatus.fullIndexerStatus.NumberRunningFolderIndexer<br />
$r.translate("fullindexer.label.available.indexer") : $searchstatus.fullIndexerStatus.NumberAvailableFolderIndexer<br /> $r.translate("fullindexer.label.available.indexer") : $searchstatus.fullIndexerStatus.NumberAvailableFolderIndexer<br />
<br /> <br />
$r.translate("fullindexer.label.finished") : #if($searchstatus.fullIndexerStatus.lastFullIndexTime > 1) $searchstatus.fullIndexerStatus.lastFullIndexDateString #else - #end<br /> $r.translate("fullindexer.label.finished") : #if($searchstatus && $searchstatus.fullIndexerStatus.lastFullIndexTime > 1) $searchstatus.fullIndexerStatus.lastFullIndexDateString #else - #end<br />
$r.translate("fullindexer.label.time") : $searchstatus.fullIndexerStatus.indexingTime ms<br /> $r.translate("fullindexer.label.time") : $searchstatus.fullIndexerStatus.indexingTime ms<br />
$r.translate("fullindexer.label.size") : $searchstatus.fullIndexerStatus.IndexSize $r.translate("fullindexer.label.size") : $searchstatus.fullIndexerStatus.IndexSize
</fieldset> </fieldset>
...@@ -32,7 +32,7 @@ ...@@ -32,7 +32,7 @@
<br /> <br />
$r.translate("search.label.query") : $searchstatus.queryCount<br /> $r.translate("search.label.query") : $searchstatus.queryCount<br />
<div class="o_button_group"> <div class="o_button_group">
#if (($searchstatus.fullIndexerStatus.status == "running") || ($searchstatus.fullIndexerStatus.status == "sleeping")) #if ($searchstatus && ($searchstatus.fullIndexerStatus.status == "running" || $searchstatus.fullIndexerStatus.status == "sleeping"))
$r.render("button.stopindexing") $r.render("button.stopindexing")
#else #else
$r.render("button.startindexing") $r.render("button.startindexing")
......
#if ($usercount > 0) #if ($usercount && $usercount > 0)
<h4>$r.translate("import.title.finish.create")</h4> <h4>$r.translate("import.title.finish.create")</h4>
$r.render("table") $r.render("table")
#end #end
...@@ -25,7 +25,7 @@ $r.render("table") ...@@ -25,7 +25,7 @@ $r.render("table")
#end #end
<div class="o_button_group"> <div class="o_button_group">
#if ($usercount > 0) #if ($usercount && $usercount > 0)
#if ($r.available("next")) #if ($r.available("next"))
$r.render("next") $r.render("next")
#else #else
......
...@@ -12,7 +12,7 @@ ...@@ -12,7 +12,7 @@
</div> </div>
#end #end
#if ($calendars.size() > 5) #if ($calendars && $calendars.size() > 5)
<div class="o_cal_config_scrollwrapper"> <div class="o_cal_config_scrollwrapper">
#end #end
...@@ -59,7 +59,7 @@ ...@@ -59,7 +59,7 @@
#end #end
#end #end
#if ($calendars.size() > 5) #if ($calendars && $calendars.size() > 5)
</div> </div>
#end #end
</fieldset> </fieldset>
......
#if ($importedCalendarWrappers.size() > 0) #if ($importedCalendarWrappers && $importedCalendarWrappers.size() > 0)
<div class="clearfix"> <div class="clearfix">
$r.render("importedCalendarConfig") $r.render("importedCalendarConfig")
</div> </div>
......
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
http://www.springframework.org/schema/context http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd"> http://www.springframework.org/schema/context/spring-context.xsd">
<context:component-scan base-package="org.olat.core.dispatcher.mapper,org.olat.core.commons.controllers.impressum" /> <context:component-scan base-package="org.olat.core.dispatcher.mapper,org.olat.core.commons.controllers.impressum,org.olat.core.gui.render.velocity" />
<bean id="coreSpringFactory" class="org.olat.core.CoreSpringFactory" /> <bean id="coreSpringFactory" class="org.olat.core.CoreSpringFactory" />
......
<div class="o_block"> <div class="o_block">
#if(($commentControllers.size() > 0) && $r.available("createCommentFormCtr")) #if($commentControllers && $commentControllers.size() > 0 && $r.available("createCommentFormCtr"))
<div class="o_block"> <div class="o_block">
<a id="o_comment_form_link" onclick="{o_scrollToElement('#o_comment_form'); return false;}" href="#o_comment_form"> <a id="o_comment_form_link" onclick="{o_scrollToElement('#o_comment_form'); return false;}" href="#o_comment_form">
$r.translate("comments.create.goto") <i class="o_icon o_icon_start"></i> $r.translate("comments.create.goto") <i class="o_icon o_icon_start"></i>
......
package org.olat.core.configuration;
public interface PreWarm extends Runnable {
}
package org.olat.core.gui.render.velocity;
import java.io.File;
import java.io.IOException;
import java.nio.file.FileVisitResult;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.SimpleFileVisitor;
import java.nio.file.attribute.BasicFileAttributes;
import java.util.concurrent.atomic.AtomicInteger;
import org.apache.velocity.VelocityContext;
import org.apache.velocity.exception.ParseErrorException;
import org.apache.velocity.exception.ResourceNotFoundException;
import org.olat.core.configuration.PreWarm;
import org.olat.core.gui.render.StringOutput;
import org.olat.core.logging.OLog;
import org.olat.core.logging.Tracing;
import org.olat.core.util.CodeHelper;
import org.olat.core.util.WebappHelper;
import org.springframework.stereotype.Service;
/**
*
* @author srosse
*
*/
@Service
public class VelocityTemplatesPreWarm implements PreWarm {
private static final OLog log = Tracing.createLoggerFor(VelocityTemplatesPreWarm.class);
@Override
public void run() {
long start = System.nanoTime();
log.info("Start filling the velocity template cache");
final VelocityContext context = new VelocityContext();
final AtomicInteger numOfTemplates = new AtomicInteger(0);
final File root = new File(WebappHelper.getContextRoot(), "WEB-INF/classes");
final Path fPath = root.toPath();
try {
Files.walkFileTree(fPath, new SimpleFileVisitor<Path>() {
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) {
try {
String path = fPath.relativize(file).toString();
if(path.endsWith(".html") && path.contains("/_content/")) {
StringOutput writer = new StringOutput();
VelocityHelper.getInstance().mergeContent(path, context, writer, null);
numOfTemplates.incrementAndGet();
}
} catch (ResourceNotFoundException e) {
e.printStackTrace();
} catch (ParseErrorException e) {
e.printStackTrace();
}
return FileVisitResult.CONTINUE;
}
});
} catch (IOException e) {
e.printStackTrace();
}
log.info("Velocity cache filled with " + numOfTemplates + " templates in (ms): " + CodeHelper.nanoToMilliTime(start));
}
}
...@@ -33,7 +33,9 @@ import javax.servlet.http.HttpServletResponse; ...@@ -33,7 +33,9 @@ import javax.servlet.http.HttpServletResponse;
import org.olat.admin.sysinfo.manager.SessionStatsManager; import org.olat.admin.sysinfo.manager.SessionStatsManager;
import org.olat.core.CoreSpringFactory; import org.olat.core.CoreSpringFactory;
import org.olat.core.commons.persistence.DBFactory; import org.olat.core.commons.persistence.DBFactory;
import org.olat.core.commons.services.taskexecutor.TaskExecutorManager;
import org.olat.core.commons.services.webdav.WebDAVDispatcher; import org.olat.core.commons.services.webdav.WebDAVDispatcher;
import org.olat.core.configuration.PreWarm;
import org.olat.core.dispatcher.Dispatcher; import org.olat.core.dispatcher.Dispatcher;
import org.olat.core.dispatcher.DispatcherModule; import org.olat.core.dispatcher.DispatcherModule;
import org.olat.core.dispatcher.mapper.GlobalMapperRegistry; import org.olat.core.dispatcher.mapper.GlobalMapperRegistry;
...@@ -120,6 +122,15 @@ public class OpenOLATServlet extends HttpServlet { ...@@ -120,6 +122,15 @@ public class OpenOLATServlet extends HttpServlet {
//preload extensions //preload extensions
ExtManager.getInstance().getExtensions(); ExtManager.getInstance().getExtensions();
preWarm();
}
private void preWarm() {
TaskExecutorManager executor = CoreSpringFactory.getImpl(TaskExecutorManager.class);
Map<String,PreWarm> preWarms = CoreSpringFactory.getBeansOfType(PreWarm.class);
for(PreWarm preWarm:preWarms.values()) {
executor.execute(preWarm);
}
} }
@Override @Override
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
## <h2>$r.translate("list.title")</h2> ## <h2>$r.translate("list.title")</h2>
<p>$r.translate("list.found.entries", ["$keysCount","$bundlesCount"])</p> <p>$r.translate("list.found.entries", ["$keysCount","$bundlesCount"])</p>
<p class="o_info">$r.translate("list.${customizingPrefix}intro")</p> <p class="o_info">$r.translate("list.${customizingPrefix}intro")</p>
#if ($i18nItems.size() > 0) #if ($i18nItems && $i18nItems.size() > 0)
<div class="o_button_group"> <div class="o_button_group">
$r.render("allTranslateButtonTop") $r.render("allTranslateButtonTop")
</div> </div>
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
<p> <p>
$r.translate("deletenode.hasreferences.explain",$nodeident) $r.translate("deletenode.hasreferences.explain",$nodeident)
</p> </p>
#if($entries.size()>0) #if($entries && $entries.size()>0)
<ol> <ol>
#foreach ($entry in $entries) #foreach ($entry in $entries)
<li>$entry</li> <li>$entry</li>
......
<div class="o_projectbroker_peekview clearfix"> <div class="o_projectbroker_peekview clearfix">
#if ( $myProjects.size() > 0 ) #if ($myProjects && $myProjects.size() > 0 )
<div class="o_projectbroker_peekview_title"> <div class="o_projectbroker_peekview_title">
$r.translate("peekview.selected.project.title") $r.translate("peekview.selected.project.title")
</div> </div>
...@@ -16,14 +16,14 @@ ...@@ -16,14 +16,14 @@
</div> </div>
#end #end
#else #else
#if ($myCoachedProjects.size() == 0) #if ($myCoachedProjects && $myCoachedProjects.size() == 0)
<div class="o_projectbroker_peekview_title"> <div class="o_projectbroker_peekview_title">
$r.translate("peekview.no.selected.projects") $r.translate("peekview.no.selected.projects")
</div> </div>
#end #end
#end #end
#if ($myCoachedProjects.size() > 0) #if ($myCoachedProjects && $myCoachedProjects.size() > 0)
<div class="o_projectbroker_peekview_title"> <div class="o_projectbroker_peekview_title">
$r.translate("peekview.coached.project.title") $r.translate("peekview.coached.project.title")
</div> </div>
......
...@@ -43,7 +43,7 @@ ...@@ -43,7 +43,7 @@
</div> </div>
#end #end
#if ($children.size() > 0) #if ($children && $children.size() > 0)
#set ($i = 0) #set ($i = 0)
<div class="o_toc #if ($layoutType == 1) o_one_column #else o_two_column #end"> <div class="o_toc #if ($layoutType == 1) o_one_column #else o_two_column #end">
<div class="row"> <div class="row">
......
#if($childNodes.size() > 0) #if($childNodes && $childNodes.size() > 0)
<div class="o_st_peekview"> <div class="o_st_peekview">
<ul class="list-unstyled"> <ul class="list-unstyled">
#foreach ($coursenode in $childNodes) #foreach ($coursenode in $childNodes)
......
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
http://www.springframework.org/schema/context http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd"> http://www.springframework.org/schema/context/spring-context.xsd">
<context:component-scan base-package="org.olat.ims.lti.manager,org.olat.ims.qti.qpool,org.olat.ims.qti.statistics" /> <context:component-scan base-package="org.olat.ims.lti.manager,org.olat.ims.qti" />
<import resource="classpath:/org/olat/ims/qti/_spring/qtiContext.xml"/> <import resource="classpath:/org/olat/ims/qti/_spring/qtiContext.xml"/>
......
package org.olat.ims.qti;
import java.util.ArrayList;
import java.util.List;
import org.olat.core.configuration.PreWarm;
import org.olat.core.id.Roles;
import org.olat.core.logging.OLog;
import org.olat.core.logging.Tracing;
import org.olat.core.util.CodeHelper;
import org.olat.ims.qti.fileresource.SurveyFileResource;
import org.olat.ims.qti.fileresource.TestFileResource;
import org.olat.repository.RepositoryEntry;
import org.olat.repository.RepositoryManager;
import org.springframework.stereotype.Service;
import de.bps.onyx.plugin.OnyxModule;
/**
*
*
*
* Initial date: 07.04.2015<br>
* @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
*
*/
@Service
public class QTIPreWarm implements PreWarm {
private static final OLog log = Tracing.createLoggerFor(QTIPreWarm.class);
@Override
public void run() {
long start = System.nanoTime();
log.info("Start scanning for QTI resources");
Roles adminRoles = new Roles(true, false, false, false, false, false, false);
List<String> types = new ArrayList<>(2);
types.add(TestFileResource.TYPE_NAME);
types.add(SurveyFileResource.TYPE_NAME);
List<RepositoryEntry> res = RepositoryManager.getInstance().queryByTypeLimitAccess(null, types, adminRoles);
for(RepositoryEntry re:res) {
OnyxModule.isOnyxTest(re.getOlatResource());
}
log.info("QTI Resources scanned in (ms): " + CodeHelper.nanoToMilliTime(start));
}
}
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
</legend> </legend>
<form action="$r.formURIbg("sfib")" id="ofo_tab_fibitem" $r.bgTarget() method="post"> <form action="$r.formURIbg("sfib")" id="ofo_tab_fibitem" $r.bgTarget() method="post">
#if ($question.getResponses().size() > 0) #if ($question && $question.getResponses().size() > 0)
<table class="table table-bordered"> <table class="table table-bordered">
<thead> <thead>
<tr> <tr>
......
...@@ -32,7 +32,7 @@ ...@@ -32,7 +32,7 @@
</legend> </legend>
<form action="$r.formURIbg("skprim")" id="ofo_tab_kprimitem" $r.bgTarget() method="post"> <form action="$r.formURIbg("skprim")" id="ofo_tab_kprimitem" $r.bgTarget() method="post">
#if ($question.getResponses().size() > 0) #if ($question && $question.getResponses().size() > 0)
<table class="table table-bordered" style="position:relative"> <table class="table table-bordered" style="position:relative">
<thead> <thead>
<tr> <tr>
......
...@@ -30,7 +30,7 @@ ...@@ -30,7 +30,7 @@
</legend> </legend>
<form action="$r.formURIbg("smc")" id="ofo_tab_mcitem" $r.bgTarget() method="post"> <form action="$r.formURIbg("smc")" id="ofo_tab_mcitem" $r.bgTarget() method="post">
#if ($question.getResponses().size() > 0) #if ($question && $question.getResponses().size() > 0)
<table class="table table-bordered" style="position:relative"> <table class="table table-bordered" style="position:relative">
<thead><tr> <thead><tr>
<th width="5">Pos</th> <th width="5">Pos</th>
......
...@@ -28,7 +28,7 @@ ...@@ -28,7 +28,7 @@
#end #end
</legend> </legend>
#if ($question.getResponses().size() > 0) #if ($question && $question.getResponses().size() > 0)
<form action="$r.formURIbg("ssc")" id="ofo_tab_scitem" $r.bgTarget() method="post"> <form action="$r.formURIbg("ssc")" id="ofo_tab_scitem" $r.bgTarget() method="post">
<table class="table table-bordered"> <table class="table table-bordered">
<thead><tr> <thead><tr>
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment