diff --git a/src/main/java/org/olat/core/commons/services/doceditor/onlyoffice/OnlyOfficeModule.java b/src/main/java/org/olat/core/commons/services/doceditor/onlyoffice/OnlyOfficeModule.java index 3bad8795a747cd12a3daa7ff747dfd557bb4e432..01d51b6b4ae6c98a5656ca7aa76285d2379ed884 100644 --- a/src/main/java/org/olat/core/commons/services/doceditor/onlyoffice/OnlyOfficeModule.java +++ b/src/main/java/org/olat/core/commons/services/doceditor/onlyoffice/OnlyOfficeModule.java @@ -25,6 +25,8 @@ import java.util.Collections; import java.util.Set; import java.util.stream.Collectors; +import org.apache.http.client.config.RequestConfig; +import org.apache.http.impl.client.HttpClientBuilder; import org.apache.logging.log4j.Logger; import org.olat.core.commons.services.doceditor.DocEditor.Mode; import org.olat.core.configuration.AbstractSpringModule; @@ -94,6 +96,13 @@ public class OnlyOfficeModule extends AbstractSpringModule implements ConfigOnOf @Value("${onlyoffice.thumbnails.enabled:false}") private boolean thumbnailsEnabled; + @Value("${onlyoffice.http.connect.timeout:30000}") + private int httpConnectTimeout; + @Value("${onlyoffice.http.connect.request.timeout:30000}") + private int httpConnectRequestTimeout; + @Value("${onlyoffice.http.connect.socket.timeout:30000}") + private int httpSocketTimeout; + @Autowired private OnlyOfficeModule(CoordinatorManager coordinateManager) { super(coordinateManager); @@ -320,5 +329,26 @@ public class OnlyOfficeModule extends AbstractSpringModule implements ConfigOnOf this.thumbnailsEnabled = thumbnailsEnabled; setStringProperty(ONLYOFFICE_THUMBNAILS_ENABLED, Boolean.toString(thumbnailsEnabled), true); } + + public int getHttpConnectTimeout() { + return httpConnectTimeout; + } + + public int getHttpConnectRequestTimeout() { + return httpConnectRequestTimeout; + } + + public int getHttpSocketTimeout() { + return httpSocketTimeout; + } + + public HttpClientBuilder httpClientBuilder() { + RequestConfig requestConfig = RequestConfig.copy(RequestConfig.DEFAULT) + .setConnectTimeout(getHttpConnectTimeout()) + .setConnectionRequestTimeout(getHttpConnectRequestTimeout()) + .setSocketTimeout(getHttpSocketTimeout()) + .build(); + return HttpClientBuilder.create().setDefaultRequestConfig(requestConfig); + } } diff --git a/src/main/java/org/olat/core/commons/services/doceditor/onlyoffice/manager/OnlyOfficeConversionServiceImpl.java b/src/main/java/org/olat/core/commons/services/doceditor/onlyoffice/manager/OnlyOfficeConversionServiceImpl.java index f87e6c1272729c64bdb27887247a3bae3e05c39a..d6c62307af3e7016ebb9323a03a7b15b65d157ca 100644 --- a/src/main/java/org/olat/core/commons/services/doceditor/onlyoffice/manager/OnlyOfficeConversionServiceImpl.java +++ b/src/main/java/org/olat/core/commons/services/doceditor/onlyoffice/manager/OnlyOfficeConversionServiceImpl.java @@ -32,8 +32,6 @@ import org.apache.http.client.methods.HttpPost; import org.apache.http.entity.ContentType; import org.apache.http.entity.StringEntity; import org.apache.http.impl.client.CloseableHttpClient; -import org.apache.http.impl.client.HttpClientBuilder; -import org.apache.http.impl.client.HttpClients; import org.apache.http.util.EntityUtils; import org.apache.logging.log4j.Logger; import org.olat.core.commons.services.doceditor.onlyoffice.OnlyOfficeConversionService; @@ -78,6 +76,8 @@ public class OnlyOfficeConversionServiceImpl implements OnlyOfficeConversionServ @Autowired private OnlyOfficeSecurityService onlyOfficeSecurityService; @Autowired + private OnlyOfficeHttpClientCreator httpClientCreator; + @Autowired private MapperService mapperService; @Override @@ -172,7 +172,7 @@ public class OnlyOfficeConversionServiceImpl implements OnlyOfficeConversionServ request.setEntity(requestEntity); ConversionResult conversionResult = null; - try (CloseableHttpClient client = HttpClientBuilder.create().build(); + try (CloseableHttpClient client = httpClientCreator.create(); CloseableHttpResponse response = client.execute(request)) { int statusCode = response.getStatusLine().getStatusCode(); log.debug("Status code of create thumbnail request: {}", statusCode); @@ -199,7 +199,7 @@ public class OnlyOfficeConversionServiceImpl implements OnlyOfficeConversionServ boolean thumbnailCreated = false; HttpGet downLoadRequest = new HttpGet(fileUrl); - try (CloseableHttpClient httpClient = HttpClients.createDefault(); + try (CloseableHttpClient httpClient = httpClientCreator.create(); CloseableHttpResponse httpResponse = httpClient.execute(downLoadRequest);) { if (httpResponse.getStatusLine().getStatusCode() == 200) { InputStream content = httpResponse.getEntity().getContent(); diff --git a/src/main/java/org/olat/core/commons/services/doceditor/onlyoffice/manager/OnlyOfficeHttpClientCreator.java b/src/main/java/org/olat/core/commons/services/doceditor/onlyoffice/manager/OnlyOfficeHttpClientCreator.java new file mode 100644 index 0000000000000000000000000000000000000000..16aaad46011a3e6ce15cccb3f70523b92ef4cdb3 --- /dev/null +++ b/src/main/java/org/olat/core/commons/services/doceditor/onlyoffice/manager/OnlyOfficeHttpClientCreator.java @@ -0,0 +1,47 @@ +/** + * <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.core.commons.services.doceditor.onlyoffice.manager; + +import org.apache.http.impl.client.CloseableHttpClient; +import org.olat.core.commons.persistence.DB; +import org.olat.core.commons.services.doceditor.onlyoffice.OnlyOfficeModule; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +/** + * + * Initial date: 23 Feb 2021<br> + * @author uhensler, urs.hensler@frentix.com, http://www.frentix.com + * + */ +@Service +public class OnlyOfficeHttpClientCreator { + + @Autowired + private DB dbInstance; + @Autowired + private OnlyOfficeModule onlyOfficeModule; + + public CloseableHttpClient create() { + dbInstance.commit();// free connection + return onlyOfficeModule.httpClientBuilder().build(); + } + +} diff --git a/src/main/java/org/olat/core/commons/services/doceditor/onlyoffice/manager/OnlyOfficeServiceImpl.java b/src/main/java/org/olat/core/commons/services/doceditor/onlyoffice/manager/OnlyOfficeServiceImpl.java index ac72c676ce8d3859f2e324e5b071a7c4f239fad1..525ea354c39371da41801b4bfc54aaa0ec0ec1f6 100644 --- a/src/main/java/org/olat/core/commons/services/doceditor/onlyoffice/manager/OnlyOfficeServiceImpl.java +++ b/src/main/java/org/olat/core/commons/services/doceditor/onlyoffice/manager/OnlyOfficeServiceImpl.java @@ -29,7 +29,6 @@ import java.text.SimpleDateFormat; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.CloseableHttpClient; -import org.apache.http.impl.client.HttpClients; import org.apache.logging.log4j.Logger; import org.olat.core.commons.services.doceditor.DocEditor.Mode; import org.olat.core.commons.services.doceditor.DocEditorIdentityService; @@ -87,6 +86,8 @@ public class OnlyOfficeServiceImpl implements OnlyOfficeService { @Autowired private OnlyOfficeSecurityService onlyOfficeSecurityService; @Autowired + private OnlyOfficeHttpClientCreator httpClientCreator; + @Autowired private DocEditorService documentEditorServie; @Autowired private DocEditorIdentityService identityService; @@ -253,7 +254,7 @@ public class OnlyOfficeServiceImpl implements OnlyOfficeService { String autorization = "Bearer " + token; HttpGet request = new HttpGet(url); request.addHeader("Authorization", autorization); - try (CloseableHttpClient httpClient = HttpClients.createDefault(); + try (CloseableHttpClient httpClient = httpClientCreator.create(); CloseableHttpResponse httpResponse = httpClient.execute(request);) { if (httpResponse.getStatusLine().getStatusCode() == 200) { InputStream content = httpResponse.getEntity().getContent(); diff --git a/src/main/resources/serviceconfig/olat.properties b/src/main/resources/serviceconfig/olat.properties index 9c249c34dfe70a6a0779459f5725cfbddeeb6a85..eda2a62badd42d7d67d332e83daacbbdbce86625 100644 --- a/src/main/resources/serviceconfig/olat.properties +++ b/src/main/resources/serviceconfig/olat.properties @@ -1738,6 +1738,11 @@ onlyoffice.usage.restricted.managers=false ## Thumbnails onlyoffice.thumbnails.enabled=true +## HTTP connection settings +onlyoffice.http.connect.timeout=30000 +onlyoffice.http.connect.request.timeout=30000 +onlyoffice.http.connect.socket.timeout=30000 + ######################################## # Options for monitoring