This is an automated email from the ASF dual-hosted git repository. lizhanhui pushed a commit to branch develop in repository https://gitbox.apache.org/repos/asf/rocketmq.git
The following commit(s) were added to refs/heads/develop by this push: new 1116de4f9 [ISSUE #5294]fix ClassLoad path optimization (#5295) 1116de4f9 is described below commit 1116de4f93f965d68463b0477fede8df7dda011b Author: RapperCL <44110731+rappe...@users.noreply.github.com> AuthorDate: Mon Nov 14 11:51:12 2022 +0800 [ISSUE #5294]fix ClassLoad path optimization (#5295) * loadClass optimization * loadClass optimization * code optimization * code optimization * Restore the original method, add method, reduce the impact Co-authored-by: dinglei <libya_...@163.com> --- .../apache/rocketmq/broker/BrokerController.java | 26 ++++++++------ .../rocketmq/broker/util/ServiceProviderTest.java | 11 +++--- .../rocketmq/common/utils/ServiceProvider.java | 42 +++++++++++----------- .../rocketmq/proxy/grpc/GrpcServerBuilder.java | 2 +- .../apache/rocketmq/store/DefaultMessageStore.java | 2 +- 5 files changed, 44 insertions(+), 39 deletions(-) diff --git a/broker/src/main/java/org/apache/rocketmq/broker/BrokerController.java b/broker/src/main/java/org/apache/rocketmq/broker/BrokerController.java index c0c9eaa70..472b9196a 100644 --- a/broker/src/main/java/org/apache/rocketmq/broker/BrokerController.java +++ b/broker/src/main/java/org/apache/rocketmq/broker/BrokerController.java @@ -906,15 +906,19 @@ public class BrokerController { } private void initialTransaction() { - this.transactionalMessageService = ServiceProvider.loadClass(ServiceProvider.TRANSACTION_SERVICE_ID, TransactionalMessageService.class); + this.transactionalMessageService = ServiceProvider.loadClass(TransactionalMessageService.class); if (null == this.transactionalMessageService) { - this.transactionalMessageService = new TransactionalMessageServiceImpl(new TransactionalMessageBridge(this, this.getMessageStore())); - LOG.warn("Load default transaction message hook service: {}", TransactionalMessageServiceImpl.class.getSimpleName()); + this.transactionalMessageService = new TransactionalMessageServiceImpl( + new TransactionalMessageBridge(this, this.getMessageStore())); + LOG.warn("Load default transaction message hook service: {}", + TransactionalMessageServiceImpl.class.getSimpleName()); } - this.transactionalMessageCheckListener = ServiceProvider.loadClass(ServiceProvider.TRANSACTION_LISTENER_ID, AbstractTransactionalMessageCheckListener.class); + this.transactionalMessageCheckListener = ServiceProvider.loadClass( + AbstractTransactionalMessageCheckListener.class); if (null == this.transactionalMessageCheckListener) { this.transactionalMessageCheckListener = new DefaultTransactionalMessageCheckListener(); - LOG.warn("Load default discard message hook service: {}", DefaultTransactionalMessageCheckListener.class.getSimpleName()); + LOG.warn("Load default discard message hook service: {}", + DefaultTransactionalMessageCheckListener.class.getSimpleName()); } this.transactionalMessageCheckListener.setBrokerController(this); this.transactionalMessageCheckService = new TransactionalMessageCheckService(this); @@ -925,18 +929,18 @@ public class BrokerController { LOG.info("The broker dose not enable acl"); return; } - - List<AccessValidator> accessValidators = ServiceProvider.load(ServiceProvider.ACL_VALIDATOR_ID, AccessValidator.class); + + List<AccessValidator> accessValidators = ServiceProvider.load(AccessValidator.class); if (accessValidators.isEmpty()) { LOG.info("ServiceProvider loaded no AccessValidator, using default org.apache.rocketmq.acl.plain.PlainAccessValidator"); accessValidators.add(new PlainAccessValidator()); } - + for (AccessValidator accessValidator : accessValidators) { final AccessValidator validator = accessValidator; accessValidatorMap.put(validator.getClass(), validator); this.registerServerRPCHook(new RPCHook() { - + @Override public void doBeforeRequest(String remoteAddr, RemotingCommand request) { //Do not catch the exception @@ -952,8 +956,8 @@ public class BrokerController { } private void initialRpcHooks() { - - List<RPCHook> rpcHooks = ServiceProvider.load(ServiceProvider.RPC_HOOK_ID, RPCHook.class); + + List<RPCHook> rpcHooks = ServiceProvider.load(RPCHook.class); if (rpcHooks == null || rpcHooks.isEmpty()) { return; } diff --git a/broker/src/test/java/org/apache/rocketmq/broker/util/ServiceProviderTest.java b/broker/src/test/java/org/apache/rocketmq/broker/util/ServiceProviderTest.java index 416c9846f..53fba00fa 100644 --- a/broker/src/test/java/org/apache/rocketmq/broker/util/ServiceProviderTest.java +++ b/broker/src/test/java/org/apache/rocketmq/broker/util/ServiceProviderTest.java @@ -31,21 +31,20 @@ public class ServiceProviderTest { @Test public void loadTransactionMsgServiceTest() { - TransactionalMessageService transactionService = ServiceProvider.loadClass(ServiceProvider.TRANSACTION_SERVICE_ID, - TransactionalMessageService.class); + TransactionalMessageService transactionService = ServiceProvider.loadClass(TransactionalMessageService.class); assertThat(transactionService).isNotNull(); } @Test public void loadAbstractTransactionListenerTest() { - AbstractTransactionalMessageCheckListener listener = ServiceProvider.loadClass(ServiceProvider.TRANSACTION_LISTENER_ID, - AbstractTransactionalMessageCheckListener.class); + AbstractTransactionalMessageCheckListener listener = ServiceProvider.loadClass( + AbstractTransactionalMessageCheckListener.class); assertThat(listener).isNotNull(); } - + @Test public void loadAccessValidatorTest() { - List<AccessValidator> accessValidators = ServiceProvider.load(ServiceProvider.ACL_VALIDATOR_ID, AccessValidator.class); + List<AccessValidator> accessValidators = ServiceProvider.load(AccessValidator.class); assertThat(accessValidators).isNotNull(); } } diff --git a/common/src/main/java/org/apache/rocketmq/common/utils/ServiceProvider.java b/common/src/main/java/org/apache/rocketmq/common/utils/ServiceProvider.java index 0f7255b3d..00c8bffba 100644 --- a/common/src/main/java/org/apache/rocketmq/common/utils/ServiceProvider.java +++ b/common/src/main/java/org/apache/rocketmq/common/utils/ServiceProvider.java @@ -30,31 +30,24 @@ import java.util.ArrayList; import java.util.List; public class ServiceProvider { - + private static final InternalLogger LOG = InternalLoggerFactory.getLogger(LoggerName.COMMON_LOGGER_NAME); + /** * A reference to the classloader that loaded this class. It's more efficient to compute it once and cache it here. */ private static ClassLoader thisClassLoader; - + /** * JDK1.3+ <a href= "http://java.sun.com/j2se/1.3/docs/guide/jar/jar.html#Service%20Provider" > 'Service Provider' * specification</a>. */ - public static final String TRANSACTION_SERVICE_ID = "META-INF/service/org.apache.rocketmq.broker.transaction.TransactionalMessageService"; - - public static final String TRANSACTION_LISTENER_ID = "META-INF/service/org.apache.rocketmq.broker.transaction.AbstractTransactionalMessageCheckListener"; - - public static final String HA_SERVICE_ID = "META-INF/service/org.apache.rocketmq.store.ha.HAService"; - - public static final String RPC_HOOK_ID = "META-INF/service/org.apache.rocketmq.remoting.RPCHook"; - - public static final String ACL_VALIDATOR_ID = "META-INF/service/org.apache.rocketmq.acl.AccessValidator"; - + public static final String PREFIX = "META-INF/service/"; + static { thisClassLoader = getClassLoader(ServiceProvider.class); } - + /** * Returns a string that uniquely identifies the specified object, including its class. * <p> @@ -71,7 +64,7 @@ public class ServiceProvider { return o.getClass().getName() + "@" + System.identityHashCode(o); } } - + protected static ClassLoader getClassLoader(Class<?> clazz) { try { return clazz.getClassLoader(); @@ -81,7 +74,7 @@ public class ServiceProvider { throw e; } } - + protected static ClassLoader getContextClassLoader() { ClassLoader classLoader = null; try { @@ -95,7 +88,7 @@ public class ServiceProvider { } return classLoader; } - + protected static InputStream getResourceAsStream(ClassLoader loader, String name) { if (loader != null) { return loader.getResourceAsStream(name); @@ -103,7 +96,12 @@ public class ServiceProvider { return ClassLoader.getSystemResourceAsStream(name); } } - + + public static <T> List<T> load(Class<?> clazz) { + String fullName = PREFIX + clazz.getName(); + return load(fullName, clazz); + } + public static <T> List<T> load(String name, Class<?> clazz) { LOG.info("Looking for a resource file of name [{}] ...", name); List<T> services = new ArrayList<>(); @@ -113,7 +111,6 @@ public class ServiceProvider { return services; } try (BufferedReader reader = new BufferedReader(new InputStreamReader(is, StandardCharsets.UTF_8))) { - String serviceName = reader.readLine(); List<String> names = new ArrayList<>(); while (serviceName != null && !"".equals(serviceName)) { @@ -131,8 +128,14 @@ public class ServiceProvider { } return services; } - + + public static <T> T loadClass(Class<?> clazz) { + String fullName = PREFIX + clazz.getName(); + return loadClass(fullName, clazz); + } + public static <T> T loadClass(String name, Class<?> clazz) { + LOG.info("Looking for a resource file of name [{}] ...", name); T s = null; InputStream is = getResourceAsStream(getContextClassLoader(), name); if (is == null) { @@ -140,7 +143,6 @@ public class ServiceProvider { return null; } try (BufferedReader reader = new BufferedReader(new InputStreamReader(is, StandardCharsets.UTF_8))) { - String serviceName = reader.readLine(); if (serviceName != null && !"".equals(serviceName)) { s = initService(getContextClassLoader(), serviceName, clazz); diff --git a/proxy/src/main/java/org/apache/rocketmq/proxy/grpc/GrpcServerBuilder.java b/proxy/src/main/java/org/apache/rocketmq/proxy/grpc/GrpcServerBuilder.java index 509414b57..bb3b2b647 100644 --- a/proxy/src/main/java/org/apache/rocketmq/proxy/grpc/GrpcServerBuilder.java +++ b/proxy/src/main/java/org/apache/rocketmq/proxy/grpc/GrpcServerBuilder.java @@ -144,7 +144,7 @@ public class GrpcServerBuilder { public GrpcServerBuilder configInterceptor() { // grpc interceptors, including acl, logging etc. - List<AccessValidator> accessValidators = ServiceProvider.load(ServiceProvider.ACL_VALIDATOR_ID, AccessValidator.class); + List<AccessValidator> accessValidators = ServiceProvider.load(AccessValidator.class); if (!accessValidators.isEmpty()) { this.serverBuilder.intercept(new AuthenticationInterceptor(accessValidators)); } diff --git a/store/src/main/java/org/apache/rocketmq/store/DefaultMessageStore.java b/store/src/main/java/org/apache/rocketmq/store/DefaultMessageStore.java index 02f66dd08..844c8454d 100644 --- a/store/src/main/java/org/apache/rocketmq/store/DefaultMessageStore.java +++ b/store/src/main/java/org/apache/rocketmq/store/DefaultMessageStore.java @@ -206,7 +206,7 @@ public class DefaultMessageStore implements MessageStore { this.haService = new AutoSwitchHAService(); LOGGER.warn("Load AutoSwitch HA Service: {}", AutoSwitchHAService.class.getSimpleName()); } else { - this.haService = ServiceProvider.loadClass(ServiceProvider.HA_SERVICE_ID, HAService.class); + this.haService = ServiceProvider.loadClass(HAService.class); if (null == this.haService) { this.haService = new DefaultHAService(); LOGGER.warn("Load default HA Service: {}", DefaultHAService.class.getSimpleName());