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 <[email protected]>
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 <[email protected]>
---
.../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());