diff --git a/common/src/main/java/com/alibaba/nacos/common/http/client/NacosAsyncRestTemplate.java b/common/src/main/java/com/alibaba/nacos/common/http/client/NacosAsyncRestTemplate.java index cce2d8948..ad9ff06cb 100644 --- a/common/src/main/java/com/alibaba/nacos/common/http/client/NacosAsyncRestTemplate.java +++ b/common/src/main/java/com/alibaba/nacos/common/http/client/NacosAsyncRestTemplate.java @@ -352,29 +352,15 @@ public class NacosAsyncRestTemplate extends AbstractNacosRestTemplate { responseType, callback); } - /** - * async general http request. - * - *

{@code responseType} can be an RestResult or RestResult data {@code T} type. - * - *

{@code callback} Result callback execution, - * if you need response headers, you can convert the received RestResult to HttpRestResult. - * - * @param url url - * @param httpMethod http header param - * @param requestEntity http body param - * @param responseType return type - * @param callback callback {@link Callback#onReceive(com.alibaba.nacos.common.model.RestResult)} - */ @SuppressWarnings("unchecked") - public void execute(String url, String httpMethod, RequestHttpEntity requestEntity, Type responseType, + private void execute(String url, String httpMethod, RequestHttpEntity requestEntity, Type type, Callback callback) { try { URI uri = HttpUtils.buildUri(url, requestEntity.getQuery()); if (logger.isDebugEnabled()) { logger.debug("HTTP method: {}, url: {}, body: {}", httpMethod, uri, requestEntity.getBody()); } - ResponseHandler responseHandler = super.selectResponseHandler(responseType); + ResponseHandler responseHandler = super.selectResponseHandler(type); clientRequest.execute(uri, httpMethod, requestEntity, responseHandler, callback); } catch (Exception e) { // When an exception occurs, use Callback to pass it instead of throw it directly. diff --git a/core/src/main/java/com/alibaba/nacos/core/distributed/distro/DistroConfig.java b/core/src/main/java/com/alibaba/nacos/core/distributed/distro/DistroConfig.java index ee038f949..09b4145d9 100644 --- a/core/src/main/java/com/alibaba/nacos/core/distributed/distro/DistroConfig.java +++ b/core/src/main/java/com/alibaba/nacos/core/distributed/distro/DistroConfig.java @@ -44,8 +44,6 @@ public class DistroConfig extends AbstractDynamicConfig { private long loadDataTimeoutMillis = DistroConstants.DEFAULT_DATA_LOAD_TIMEOUT_MILLISECONDS; - private boolean asyncDistroForward = DistroConstants.DEFAULT_ASYNC_DISTRO_FORWARD_VALUE; - private DistroConfig() { super(DISTRO); resetConfig(); @@ -67,9 +65,6 @@ public class DistroConfig extends AbstractDynamicConfig { DistroConstants.DEFAULT_DATA_LOAD_RETRY_DELAY_MILLISECONDS); loadDataTimeoutMillis = EnvUtil.getProperty(DistroConstants.DATA_LOAD_TIMEOUT_MILLISECONDS, Long.class, DistroConstants.DEFAULT_DATA_LOAD_TIMEOUT_MILLISECONDS); - asyncDistroForward = EnvUtil.getProperty(DistroConstants.NACOS_ASYNC_DISTRO_FORWARD_NAME, Boolean.class, - DistroConstants.DEFAULT_ASYNC_DISTRO_FORWARD_VALUE); - } public static DistroConfig getInstance() { @@ -132,14 +127,6 @@ public class DistroConfig extends AbstractDynamicConfig { this.loadDataTimeoutMillis = loadDataTimeoutMillis; } - public boolean isAsyncDistroForward() { - return asyncDistroForward; - } - - public void setAsyncDistroForward(boolean asyncDistroForward) { - this.asyncDistroForward = asyncDistroForward; - } - @Override protected String printConfig() { return "DistroConfig{" + "syncDelayMillis=" + syncDelayMillis + ", syncTimeoutMillis=" + syncTimeoutMillis diff --git a/core/src/main/java/com/alibaba/nacos/core/distributed/distro/DistroConstants.java b/core/src/main/java/com/alibaba/nacos/core/distributed/distro/DistroConstants.java index 026ab9286..1a0b3e1bd 100644 --- a/core/src/main/java/com/alibaba/nacos/core/distributed/distro/DistroConstants.java +++ b/core/src/main/java/com/alibaba/nacos/core/distributed/distro/DistroConstants.java @@ -51,8 +51,4 @@ public class DistroConstants { public static final long DEFAULT_DATA_LOAD_TIMEOUT_MILLISECONDS = 30000L; - public static final String NACOS_ASYNC_DISTRO_FORWARD_NAME = "nacos.async.distro.forward"; - - public static final boolean DEFAULT_ASYNC_DISTRO_FORWARD_VALUE = false; - } diff --git a/naming/pom.xml b/naming/pom.xml index 1047a96ff..ba5f6fe3c 100644 --- a/naming/pom.xml +++ b/naming/pom.xml @@ -138,14 +138,6 @@ org.springframework.boot spring-boot-starter-actuator - - org.mock-server - mockserver-netty - - - org.mock-server - mockserver-client-java - diff --git a/naming/src/main/java/com/alibaba/nacos/naming/constants/Constants.java b/naming/src/main/java/com/alibaba/nacos/naming/constants/Constants.java index 285c594e6..5100c0bb9 100644 --- a/naming/src/main/java/com/alibaba/nacos/naming/constants/Constants.java +++ b/naming/src/main/java/com/alibaba/nacos/naming/constants/Constants.java @@ -109,4 +109,5 @@ public final class Constants { * Min value of instance weight. */ public static final double MIN_WEIGHT_VALUE = 0.00D; + } diff --git a/naming/src/main/java/com/alibaba/nacos/naming/misc/HttpClient.java b/naming/src/main/java/com/alibaba/nacos/naming/misc/HttpClient.java index 93f7e584a..4c1336c6b 100644 --- a/naming/src/main/java/com/alibaba/nacos/naming/misc/HttpClient.java +++ b/naming/src/main/java/com/alibaba/nacos/naming/misc/HttpClient.java @@ -25,7 +25,6 @@ import com.alibaba.nacos.common.http.client.NacosRestTemplate; import com.alibaba.nacos.common.http.param.Header; import com.alibaba.nacos.common.http.param.MediaType; import com.alibaba.nacos.common.http.param.Query; -import com.alibaba.nacos.common.model.RequestHttpEntity; import com.alibaba.nacos.common.model.RestResult; import com.alibaba.nacos.common.utils.HttpMethod; import com.alibaba.nacos.common.utils.VersionUtils; @@ -103,7 +102,11 @@ public class HttpClient { if (CollectionUtils.isNotEmpty(headers)) { header.addAll(headers); } - configDefaultHeaders(header, encoding); + header.setContentType(MediaType.APPLICATION_FORM_URLENCODED); + header.addParam(HttpHeaderConsts.CLIENT_VERSION_HEADER, VersionUtils.version); + header.addParam(HttpHeaderConsts.USER_AGENT_HEADER, UtilsAndCommons.SERVER_VERSION); + header.addParam(HttpHeaderConsts.REQUEST_SOURCE_HEADER, EnvUtil.getLocalAddress()); + header.addParam(HttpHeaderConsts.ACCEPT_CHARSET, encoding); AuthHeaderUtil.addIdentityToHeader(header); HttpClientConfig httpClientConfig = HttpClientConfig.builder().setConTimeOutMillis(connectTimeout) @@ -119,14 +122,6 @@ public class HttpClient { return RestResult.builder().withCode(500).withMsg(e.toString()).build(); } } - - private static void configDefaultHeaders(Header header, String encoding) { - header.setContentType(MediaType.APPLICATION_FORM_URLENCODED); - header.addParam(HttpHeaderConsts.CLIENT_VERSION_HEADER, VersionUtils.version); - header.addParam(HttpHeaderConsts.USER_AGENT_HEADER, UtilsAndCommons.SERVER_VERSION); - header.addParam(HttpHeaderConsts.REQUEST_SOURCE_HEADER, EnvUtil.getLocalAddress()); - header.addParam(HttpHeaderConsts.ACCEPT_CHARSET, encoding); - } /** * Request http get method by async. @@ -207,33 +202,6 @@ public class HttpClient { } } - /** - * Do http request by async with request body. - * - * @param url request url - * @param headers request headers - * @param paramValues request params - * @param body request body - * @param callback async callback func - * @param method http method - * @throws Exception exception when request - */ - public static void asyncHttpRequest(String url, List headers, Map paramValues, String body, - Callback callback, String method) throws Exception { - - Query query = Query.newInstance().initParams(paramValues); - query.addParam(FieldsConstants.ENCODING, ENCODING); - query.addParam(FieldsConstants.NOFIX, NOFIX); - - Header header = Header.newInstance(); - if (CollectionUtils.isNotEmpty(headers)) { - header.addAll(headers); - } - configDefaultHeaders(header, "UTF-8"); - AuthHeaderUtil.addIdentityToHeader(header); - ASYNC_REST_TEMPLATE.execute(url, method, new RequestHttpEntity(header, query, body), String.class, callback); - } - /** * Request http post method by async with large body. * diff --git a/naming/src/main/java/com/alibaba/nacos/naming/web/DistroFilter.java b/naming/src/main/java/com/alibaba/nacos/naming/web/DistroFilter.java index 7181d1026..9c544819b 100644 --- a/naming/src/main/java/com/alibaba/nacos/naming/web/DistroFilter.java +++ b/naming/src/main/java/com/alibaba/nacos/naming/web/DistroFilter.java @@ -17,12 +17,10 @@ package com.alibaba.nacos.naming.web; import com.alibaba.nacos.common.constant.HttpHeaderConsts; -import com.alibaba.nacos.common.http.Callback; import com.alibaba.nacos.common.model.RestResult; import com.alibaba.nacos.common.utils.ExceptionUtil; import com.alibaba.nacos.common.utils.IoUtils; import com.alibaba.nacos.core.code.ControllerMethodsCache; -import com.alibaba.nacos.core.distributed.distro.DistroConfig; import com.alibaba.nacos.core.utils.ReuseHttpServletRequest; import com.alibaba.nacos.core.utils.WebUtils; import com.alibaba.nacos.naming.core.DistroMapper; @@ -32,7 +30,6 @@ import com.alibaba.nacos.naming.misc.UtilsAndCommons; import com.alibaba.nacos.common.utils.StringUtils; import org.springframework.beans.factory.annotation.Autowired; -import javax.servlet.AsyncContext; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; @@ -120,6 +117,7 @@ public class DistroFilter implements Filter { } final String targetServer = distroMapper.mapSrv(distroTag); + List headerList = new ArrayList<>(16); Enumeration headers = req.getHeaderNames(); while (headers.hasMoreElements()) { @@ -131,10 +129,14 @@ public class DistroFilter implements Filter { final String body = IoUtils.toString(req.getInputStream(), StandardCharsets.UTF_8.name()); final Map paramsValue = HttpClient.translateParameterMap(req.getParameterMap()); - if (!DistroConfig.getInstance().isAsyncDistroForward()) { - syncForward(req, resp, urlString, targetServer, headerList, paramsValue, body); - } else { - asyncForward(req, resp, urlString, targetServer, headerList, paramsValue, body); + RestResult result = HttpClient + .request(HTTP_PREFIX + targetServer + req.getRequestURI(), headerList, paramsValue, body, + PROXY_CONNECT_TIMEOUT, PROXY_READ_TIMEOUT, StandardCharsets.UTF_8.name(), req.getMethod()); + String data = result.ok() ? result.getData() : result.getMessage(); + try { + WebUtils.response(resp, data, result.getCode()); + } catch (Exception ignore) { + Loggers.SRV_LOG.warn("[DISTRO-FILTER] request failed: " + distroMapper.mapSrv(distroTag) + urlString); } } catch (AccessControlException e) { resp.sendError(HttpServletResponse.SC_FORBIDDEN, "access denied: " + ExceptionUtil.getAllExceptionMsg(e)); @@ -142,60 +144,11 @@ public class DistroFilter implements Filter { resp.sendError(HttpServletResponse.SC_NOT_IMPLEMENTED, "no such api:" + req.getMethod() + ":" + req.getRequestURI()); } catch (Exception e) { - onError(resp, e); - } - } - - private void syncForward(ReuseHttpServletRequest req, HttpServletResponse resp, String urlString, - String targetServer, List headerList, Map paramsValue, String body) { - RestResult result = HttpClient.request(HTTP_PREFIX + targetServer + req.getRequestURI(), headerList, - paramsValue, body, PROXY_CONNECT_TIMEOUT, PROXY_READ_TIMEOUT, StandardCharsets.UTF_8.name(), - req.getMethod()); - String data = result.ok() ? result.getData() : result.getMessage(); - try { - WebUtils.response(resp, data, result.getCode()); - } catch (Exception ignore) { - Loggers.SRV_LOG.warn("[DISTRO-FILTER] request failed: " + targetServer + urlString); - } - } - - private void asyncForward(HttpServletRequest req, HttpServletResponse resp, String urlString, String targetServer, - List headerList, Map paramsValue, String body) throws Exception { - final AsyncContext asyncContext = req.startAsync(); - asyncContext.setTimeout(PROXY_READ_TIMEOUT); - HttpClient.asyncHttpRequest(HTTP_PREFIX + targetServer + req.getRequestURI(), headerList, paramsValue, body, - new Callback() { - @Override - public void onReceive(RestResult result) { - String data = result.ok() ? result.getData() : result.getMessage(); - try { - WebUtils.response(resp, data, result.getCode()); - } catch (Exception ignore) { - Loggers.SRV_LOG.warn("[DISTRO-FILTER] request failed: " + targetServer + urlString); - } - asyncContext.complete(); - } - - @Override - public void onError(Throwable e) { - DistroFilter.this.onError(resp, e); - asyncContext.complete(); - } - - @Override - public void onCancel() { - - } - }, req.getMethod()); - } - - private void onError(HttpServletResponse response, Throwable e) { - try { Loggers.SRV_LOG.warn("[DISTRO-FILTER] Server failed: ", e); - response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, + resp.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "Server failed, " + ExceptionUtil.getAllExceptionMsg(e)); - } catch (Exception ignore) { } + } @Override diff --git a/naming/src/main/java/com/alibaba/nacos/naming/web/NamingConfig.java b/naming/src/main/java/com/alibaba/nacos/naming/web/NamingConfig.java index 4560ccf99..0e5a7d936 100644 --- a/naming/src/main/java/com/alibaba/nacos/naming/web/NamingConfig.java +++ b/naming/src/main/java/com/alibaba/nacos/naming/web/NamingConfig.java @@ -44,7 +44,6 @@ public class NamingConfig { registration.setFilter(distroFilter()); registration.addUrlPatterns(UTL_PATTERNS); registration.setName(DISTRO_FILTER); - registration.setAsyncSupported(true); registration.setOrder(7); return registration; } diff --git a/naming/src/test/java/com/alibaba/nacos/naming/web/DistroFilterTest.java b/naming/src/test/java/com/alibaba/nacos/naming/web/DistroFilterTest.java deleted file mode 100644 index f38dc5329..000000000 --- a/naming/src/test/java/com/alibaba/nacos/naming/web/DistroFilterTest.java +++ /dev/null @@ -1,203 +0,0 @@ -/* - * Copyright 1999-2018 Alibaba Group Holding Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * 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 com.alibaba.nacos.naming.web; - -import com.alibaba.nacos.auth.config.AuthConfigs; -import com.alibaba.nacos.core.code.ControllerMethodsCache; -import com.alibaba.nacos.core.distributed.distro.DistroConfig; -import com.alibaba.nacos.naming.controllers.InstanceController; -import com.alibaba.nacos.naming.core.DistroMapper; -import com.alibaba.nacos.sys.env.EnvUtil; -import com.alibaba.nacos.sys.utils.ApplicationUtils; -import org.junit.AfterClass; -import org.junit.Assert; -import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.Test; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.MockitoAnnotations; -import org.mockserver.client.server.MockServerClient; -import org.mockserver.integration.ClientAndServer; -import org.springframework.context.ConfigurableApplicationContext; -import org.springframework.mock.env.MockEnvironment; -import org.springframework.mock.web.MockFilterChain; -import org.springframework.mock.web.MockHttpServletRequest; -import org.springframework.mock.web.MockHttpServletResponse; -import org.springframework.util.ReflectionUtils; - -import javax.servlet.AsyncContext; -import javax.servlet.AsyncEvent; -import javax.servlet.AsyncListener; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServletRequest; -import java.io.IOException; -import java.lang.reflect.Method; -import java.util.concurrent.CountDownLatch; -import java.util.concurrent.Executor; -import java.util.concurrent.RejectedExecutionException; -import java.util.concurrent.SynchronousQueue; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; - -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.anyString; -import static org.mockito.Mockito.when; -import static org.mockserver.model.HttpRequest.request; -import static org.mockserver.model.HttpResponse.response; - -public class DistroFilterTest { - - @Mock - private DistroMapper distroMapper; - - @Mock - private ControllerMethodsCache controllerMethodsCache; - - @Mock - private DistroTagGenerator distroTagGenerator; - - @Mock - private ConfigurableApplicationContext context; - - @Mock - private AuthConfigs authConfigs; - - @InjectMocks - private DistroFilter distroFilter; - - private static ClientAndServer mockServer; - - @BeforeClass - public static void beforeClass() { - MockEnvironment environment = new MockEnvironment(); - EnvUtil.setEnvironment(environment); - EnvUtil.setContextPath("/nacos"); - - mockServer = ClientAndServer.startClientAndServer(8080); - - //mock nacos naming server, and delay 1 seconds - new MockServerClient("127.0.0.1", 8080).when(request().withMethod("POST").withPath("/nacos/v1/ns/instance")) - .respond(response().withStatusCode(200).withBody("ok").withDelay(TimeUnit.SECONDS, 1)); - } - - @Before - public void setUp() { - MockitoAnnotations.openMocks(this); - - ApplicationUtils.injectContext(context); - when(context.getBean(AuthConfigs.class)).thenReturn(authConfigs); - - final Method register = ReflectionUtils.findMethod(InstanceController.class, "register", - HttpServletRequest.class); - when(controllerMethodsCache.getMethod(any())).thenReturn(register); - when(distroTagGenerator.getResponsibleTag(any())).thenReturn("tag"); - when(distroMapper.responsible(anyString())).thenReturn(false); - when(distroMapper.mapSrv(anyString())).thenReturn("127.0.0.1:8080"); - } - - @Test - public void givenAsyncCanForwardRequestToTarget() throws ServletException, IOException, InterruptedException { - MockHttpServletRequest request = new MockHttpServletRequest(); - request.setMethod("POST"); - request.setRequestURI("/nacos/v1/ns/instance"); - request.setAsyncSupported(true); - MockHttpServletResponse response = new MockHttpServletResponse(); - final MockFilterChain filterChain = new MockFilterChain(); - - DistroConfig.getInstance().setAsyncDistroForward(true); - distroFilter.doFilter(request, response, filterChain); - final AsyncContext asyncContext = request.getAsyncContext(); - Assert.assertNotNull(asyncContext); - CountDownLatch latch = new CountDownLatch(1); - asyncContext.addListener(new AsyncListener() { - @Override - public void onComplete(AsyncEvent event) throws IOException { - latch.countDown(); - } - - @Override - public void onTimeout(AsyncEvent event) throws IOException { - latch.countDown(); - } - - @Override - public void onError(AsyncEvent event) throws IOException { - latch.countDown(); - } - - @Override - public void onStartAsync(AsyncEvent event) throws IOException { - - } - }); - latch.await(); - Assert.assertEquals("ok", response.getContentAsString()); - } - - @Test - public void asyncForwardRequestNotBlockTomcatThread() throws InterruptedException { - DistroConfig.getInstance().setAsyncDistroForward(true); - Executor mockTomcatThread = new ThreadPoolExecutor(1, 1, 1, TimeUnit.MINUTES, new SynchronousQueue<>()); - for (int i = 0; i < 3; ++i) { - //nacos naming server will block 1 second and then return response - //if use sync forward request, the mockTomcatThread will throw RejectedExecutionException - mockTomcatThread.execute(() -> { - try { - asyncForwardRequest(); - } catch (Exception e) { - Assert.assertNull(e); - } - }); - Thread.sleep(500); - } - } - - private void asyncForwardRequest() throws ServletException, IOException { - MockHttpServletRequest request = new MockHttpServletRequest(); - request.setMethod("POST"); - request.setRequestURI("/nacos/v1/ns/instance"); - request.setAsyncSupported(true); - MockHttpServletResponse response = new MockHttpServletResponse(); - final MockFilterChain filterChain = new MockFilterChain(); - - distroFilter.doFilter(request, response, filterChain); - } - - @Test(expected = RejectedExecutionException.class) - public void syncForwardRequestWillBlockTomcatThread() throws InterruptedException { - DistroConfig.getInstance().setAsyncDistroForward(false); - Executor mockTomcatThread = new ThreadPoolExecutor(1, 1, 1, TimeUnit.MINUTES, new SynchronousQueue<>()); - for (int i = 0; i < 3; ++i) { - //nacos naming server will block 1 second and then return response - //if use sync forward request, the mockTomcatThread will throw RejectedExecutionException - mockTomcatThread.execute(() -> { - try { - asyncForwardRequest(); - } catch (Exception e) { - Assert.assertNull(e); - } - }); - Thread.sleep(500); - } - } - - @AfterClass - public static void afterClass() { - mockServer.stop(); - } -} \ No newline at end of file diff --git a/pom.xml b/pom.xml index 1b52c958c..28275b51d 100644 --- a/pom.xml +++ b/pom.xml @@ -155,7 +155,6 @@ 1.3.12 ${jraft-core.version} 2.0 - 3.10.8 @@ -1004,18 +1003,6 @@ snakeyaml ${SnakeYaml.version} - - org.mock-server - mockserver-netty - ${mock-server.version} - test - - - org.mock-server - mockserver-client-java - ${mock-server.version} - test - diff --git a/sys/src/main/java/com/alibaba/nacos/sys/env/EnvUtil.java b/sys/src/main/java/com/alibaba/nacos/sys/env/EnvUtil.java index 1b2d345bc..baefcf969 100644 --- a/sys/src/main/java/com/alibaba/nacos/sys/env/EnvUtil.java +++ b/sys/src/main/java/com/alibaba/nacos/sys/env/EnvUtil.java @@ -103,11 +103,11 @@ public class EnvUtil { private static final String NACOS_TEMP_DIR_1 = "data"; private static final String NACOS_TEMP_DIR_2 = "tmp"; - + private static final String NACOS_CUSTOM_ENVIRONMENT_ENABLED = "nacos.custom.environment.enabled"; - + private static final String NACOS_CUSTOM_CONFIG_NAME = "customFirstNacosConfig"; - + @JustForTest private static String confPath = ""; @@ -115,7 +115,7 @@ public class EnvUtil { private static String nacosHomePath = null; private static ConfigurableEnvironment environment; - + /** * customEnvironment. */ @@ -127,13 +127,12 @@ public class EnvUtil { for (String key : propertyKeys) { sourcePropertyMap.put(key, getProperty(key, Object.class)); } - Map targetMap = CustomEnvironmentPluginManager.getInstance() - .getCustomValues(sourcePropertyMap); + Map targetMap = CustomEnvironmentPluginManager.getInstance().getCustomValues(sourcePropertyMap); MutablePropertySources propertySources = environment.getPropertySources(); propertySources.addFirst(new MapPropertySource(NACOS_CUSTOM_CONFIG_NAME, targetMap)); } } - + public static ConfigurableEnvironment getEnvironment() { return environment; } @@ -303,8 +302,8 @@ public class EnvUtil { } public static float getMem() { - return (float) (1 - - OperatingSystemBeanManager.getFreePhysicalMem() / OperatingSystemBeanManager.getTotalPhysicalMem()); + return (float) (1 - OperatingSystemBeanManager.getFreePhysicalMem() / OperatingSystemBeanManager + .getTotalPhysicalMem()); } public static String getConfPath() {