diff --git a/src/main/java/org/olat/admin/sysinfo/SysinfoController.java b/src/main/java/org/olat/admin/sysinfo/SysinfoController.java index 8b62d6c6a4504a9cbb54e53da92a14f8c570a8bb..9f15f0b6dda6e9404558c34a2fd052292338c63e 100644 --- a/src/main/java/org/olat/admin/sysinfo/SysinfoController.java +++ b/src/main/java/org/olat/admin/sysinfo/SysinfoController.java @@ -35,7 +35,6 @@ import java.util.TimeZone; import org.olat.admin.sysinfo.manager.SessionStatsManager; import org.olat.admin.sysinfo.model.SessionsStats; import org.olat.basesecurity.BaseSecurity; -import org.olat.core.CoreSpringFactory; import org.olat.core.gui.UserRequest; import org.olat.core.gui.components.form.flexible.FormItemContainer; import org.olat.core.gui.components.form.flexible.elements.MultipleSelectionElement; @@ -48,6 +47,7 @@ import org.olat.core.helpers.Settings; import org.olat.core.util.Formatter; import org.olat.core.util.StringHelper; import org.olat.core.util.WebappHelper; +import org.springframework.beans.factory.annotation.Autowired; /** @@ -58,8 +58,10 @@ import org.olat.core.util.WebappHelper; */ public class SysinfoController extends FormBasicController { - private final BaseSecurity securityManager; - private final SessionStatsManager sessionStatsManager; + @Autowired + private BaseSecurity securityManager; + @Autowired + private SessionStatsManager sessionStatsManager; /** * @param ureq @@ -67,10 +69,6 @@ public class SysinfoController extends FormBasicController { */ public SysinfoController(UserRequest ureq, WindowControl wControl) { super(ureq, wControl, "sysinfo"); - - securityManager = CoreSpringFactory.getImpl(BaseSecurity.class); - sessionStatsManager = CoreSpringFactory.getImpl(SessionStatsManager.class); - initForm(ureq); } @@ -97,7 +95,16 @@ public class SysinfoController extends FormBasicController { int controllerCnt = DefaultController.getControllerCount(); uifactory.addStaticTextElement("controllercount", "runtime.controllercount", Integer.toString(controllerCnt), runtimeCont); int numOfDispatchingThreads = sessionStatsManager.getConcurrentCounter(); - uifactory.addStaticTextElement("dispatchingthreads", "runtime.dispatchingthreads", Integer.toString(numOfDispatchingThreads), runtimeCont); + int numOfDispatchingStreams = sessionStatsManager.getConcurrentStreamCounter(); + String threadsInfos; + if(numOfDispatchingStreams == 0) { + threadsInfos = Integer.toString(numOfDispatchingThreads); + } else { + threadsInfos = translate("runtime.dispatchingthreads.infos", new String[] { + Integer.toString(numOfDispatchingThreads - numOfDispatchingStreams), Integer.toString(numOfDispatchingStreams) + }); + } + uifactory.addStaticTextElement("dispatchingthreads", "runtime.dispatchingthreads", threadsInfos, runtimeCont); //sessions and clicks String sessionAndClicksPage = velocity_root + "/session_clicks.html"; diff --git a/src/main/java/org/olat/admin/sysinfo/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/admin/sysinfo/_i18n/LocalStrings_de.properties index 6ac442ee5fa532102fc61aa00a929a2e73dc9c3a..484b258a1cb00c06738665f4015d93f723cfdcec 100644 --- a/src/main/java/org/olat/admin/sysinfo/_i18n/LocalStrings_de.properties +++ b/src/main/java/org/olat/admin/sysinfo/_i18n/LocalStrings_de.properties @@ -173,6 +173,7 @@ run.gc=Java Garbage Collection jetzt starten runtime=Runtime Informationen runtime.controllercount=Controllers (Aktiv und nicht aufger\u00E4umt) runtime.dispatchingthreads=Gleichzeitige arbeitende Threads +runtime.dispatchingthreads.infos={0} und {1} Video Streams runtime.memory=Speicher runtime.memory.permGen=Speicher (Permanent Generation) runtime.memory.tooltip={0} MB von {1} MB belegt diff --git a/src/main/java/org/olat/admin/sysinfo/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/admin/sysinfo/_i18n/LocalStrings_en.properties index 7f56a08659eb791358c72bb829d3d317e10a9b67..b0cf3b9a00398c56bc06e3b3a665af7473dabe6a 100644 --- a/src/main/java/org/olat/admin/sysinfo/_i18n/LocalStrings_en.properties +++ b/src/main/java/org/olat/admin/sysinfo/_i18n/LocalStrings_en.properties @@ -173,6 +173,7 @@ run.gc=Run garbage collection runtime=Runtime infos runtime.controllercount=Controllers (active and not disposed) runtime.dispatchingthreads=Concurrent dispatching threads +runtime.dispatchingthreads.infos={0} and {1} videos streams runtime.memory=Memory runtime.memory.permGen=Memory (Permanent Generation) runtime.memory.tooltip={0} MB of {1} MB available diff --git a/src/main/java/org/olat/admin/sysinfo/manager/SessionStatsManager.java b/src/main/java/org/olat/admin/sysinfo/manager/SessionStatsManager.java index 3e036d3b1322b2ce0d9f745f45f196952aa9d886..fa0440b9d176a423e31800bf0e6bab86bba1ca9a 100644 --- a/src/main/java/org/olat/admin/sysinfo/manager/SessionStatsManager.java +++ b/src/main/java/org/olat/admin/sysinfo/manager/SessionStatsManager.java @@ -47,7 +47,8 @@ public class SessionStatsManager implements Sampler { private UserSessionManager sessionManager; private SessionStatsSample currentSample; - private AtomicInteger concurrentCounter = new AtomicInteger(0); + private final AtomicInteger concurrentCounter = new AtomicInteger(0); + private final AtomicInteger concurrentStreamCounter = new AtomicInteger(0); private List<SessionStatsSample> sessionStatsSamples = new ArrayList<>(); public List<SessionStatsSample> getSessionViews() { @@ -89,7 +90,19 @@ public class SessionStatsManager implements Sampler { public void decrementConcurrentCounter() { concurrentCounter.decrementAndGet(); } + + public int getConcurrentStreamCounter() { + return concurrentStreamCounter.intValue(); + } + + public void incrementConcurrentStreamCounter() { + concurrentStreamCounter.incrementAndGet(); + } + public void decrementConcurrentStreamCounter() { + concurrentStreamCounter.decrementAndGet(); + } + public synchronized long getNumOfSessions() { if(currentSample != null) { return currentSample.getNumOfSessions(); diff --git a/src/main/java/org/olat/core/gui/media/ServletUtil.java b/src/main/java/org/olat/core/gui/media/ServletUtil.java index f7bc631ee1b12c44ecf3a4c3b12bd507edeb266b..d47bee277b1b54b9a0a8f4a7b8c35776aeeec532 100644 --- a/src/main/java/org/olat/core/gui/media/ServletUtil.java +++ b/src/main/java/org/olat/core/gui/media/ServletUtil.java @@ -45,13 +45,14 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.io.IOUtils; +import org.apache.logging.log4j.Logger; +import org.olat.admin.sysinfo.manager.SessionStatsManager; import org.olat.core.CoreSpringFactory; import org.olat.core.gui.Windows; import org.olat.core.gui.render.StringOutput; import org.olat.core.gui.util.bandwidth.SlowBandWidthSimulator; import org.olat.core.helpers.Settings; import org.olat.core.logging.AssertException; -import org.apache.logging.log4j.Logger; import org.olat.core.logging.Tracing; import org.olat.core.util.FileUtils; import org.olat.core.util.StringHelper; @@ -252,13 +253,21 @@ public class ServletUtil { protected static void copy(OutputStream ostream, InputStream resourceInputStream, Range range, int bufferSize) throws IOException { IOException exception = null; - - InputStream istream = (resourceInputStream instanceof BufferedInputStream) - ? resourceInputStream : new BufferedInputStream(resourceInputStream, bufferSize); - exception = copyRange(istream, ostream, range.start, range.end, bufferSize); - - // Clean up the input stream - istream.close(); + + SessionStatsManager stats = CoreSpringFactory.getImpl(SessionStatsManager.class); + + try(InputStream istream = (resourceInputStream instanceof BufferedInputStream) + ? resourceInputStream : new BufferedInputStream(resourceInputStream, bufferSize)) { + stats.incrementConcurrentStreamCounter(); + Thread.sleep(5000); + exception = copyRange(istream, ostream, range.start, range.end, bufferSize); + } catch(IOException e) { + handleIOException("Deliver range of data", e); + } catch(Exception e) { + log.error("", e); + } finally { + stats.decrementConcurrentStreamCounter(); + } // Rethrow any exception that has occurred if (exception != null) throw exception;