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());

Reply via email to