This is an automated email from the ASF dual-hosted git repository.

technoboy pushed a commit to branch branch-3.2
in repository https://gitbox.apache.org/repos/asf/pulsar.git


The following commit(s) were added to refs/heads/branch-3.2 by this push:
     new a4b27cac0a4 [improve][broker] Remove ClassLoaderSwitcher to avoid 
objects allocations and consistent the codestyle (#22796)
a4b27cac0a4 is described below

commit a4b27cac0a4619859d95990db911e172311c6b3a
Author: 道君 <dao...@apache.org>
AuthorDate: Wed May 29 22:19:47 2024 +0800

    [improve][broker] Remove ClassLoaderSwitcher to avoid objects allocations 
and consistent the codestyle (#22796)
---
 .../apache/pulsar/broker/ClassLoaderSwitcher.java  | 37 ------------------
 .../servlet/AdditionalServletWithClassLoader.java  | 25 +++++++++---
 .../protocol/ProtocolHandlerWithClassLoader.java   | 44 +++++++++++++++++-----
 3 files changed, 55 insertions(+), 51 deletions(-)

diff --git 
a/pulsar-broker-common/src/main/java/org/apache/pulsar/broker/ClassLoaderSwitcher.java
 
b/pulsar-broker-common/src/main/java/org/apache/pulsar/broker/ClassLoaderSwitcher.java
deleted file mode 100644
index 55cb9198da2..00000000000
--- 
a/pulsar-broker-common/src/main/java/org/apache/pulsar/broker/ClassLoaderSwitcher.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you 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 org.apache.pulsar.broker;
-
-/**
- * Help to switch the class loader of current thread to the NarClassLoader, 
and change it back when it's done.
- * With the help of try-with-resources statement, the code would be cleaner 
than using try finally every time.
- */
-public class ClassLoaderSwitcher implements AutoCloseable {
-    private final ClassLoader prevClassLoader;
-
-    public ClassLoaderSwitcher(ClassLoader classLoader) {
-        prevClassLoader = Thread.currentThread().getContextClassLoader();
-        Thread.currentThread().setContextClassLoader(classLoader);
-    }
-
-    @Override
-    public void close() {
-        Thread.currentThread().setContextClassLoader(prevClassLoader);
-    }
-}
\ No newline at end of file
diff --git 
a/pulsar-broker-common/src/main/java/org/apache/pulsar/broker/web/plugin/servlet/AdditionalServletWithClassLoader.java
 
b/pulsar-broker-common/src/main/java/org/apache/pulsar/broker/web/plugin/servlet/AdditionalServletWithClassLoader.java
index c2b4b900733..bc1f25c5af9 100644
--- 
a/pulsar-broker-common/src/main/java/org/apache/pulsar/broker/web/plugin/servlet/AdditionalServletWithClassLoader.java
+++ 
b/pulsar-broker-common/src/main/java/org/apache/pulsar/broker/web/plugin/servlet/AdditionalServletWithClassLoader.java
@@ -22,7 +22,6 @@ import java.io.IOException;
 import lombok.Data;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
-import org.apache.pulsar.broker.ClassLoaderSwitcher;
 import org.apache.pulsar.common.configuration.PulsarConfiguration;
 import org.apache.pulsar.common.nar.NarClassLoader;
 import org.eclipse.jetty.servlet.ServletHolder;
@@ -40,29 +39,45 @@ public class AdditionalServletWithClassLoader implements 
AdditionalServlet {
 
     @Override
     public void loadConfig(PulsarConfiguration pulsarConfiguration) {
-        try (ClassLoaderSwitcher ignored = new 
ClassLoaderSwitcher(classLoader)) {
+        ClassLoader prevClassLoader = 
Thread.currentThread().getContextClassLoader();
+        try {
+            Thread.currentThread().setContextClassLoader(classLoader);
             servlet.loadConfig(pulsarConfiguration);
+        } finally {
+            Thread.currentThread().setContextClassLoader(prevClassLoader);
         }
     }
 
     @Override
     public String getBasePath() {
-        try (ClassLoaderSwitcher ignored = new 
ClassLoaderSwitcher(classLoader)) {
+        ClassLoader prevClassLoader = 
Thread.currentThread().getContextClassLoader();
+        try {
+            Thread.currentThread().setContextClassLoader(classLoader);
             return servlet.getBasePath();
+        } finally {
+            Thread.currentThread().setContextClassLoader(prevClassLoader);
         }
     }
 
     @Override
     public ServletHolder getServletHolder() {
-        try (ClassLoaderSwitcher ignored = new 
ClassLoaderSwitcher(classLoader)) {
+        ClassLoader prevClassLoader = 
Thread.currentThread().getContextClassLoader();
+        try {
+            Thread.currentThread().setContextClassLoader(classLoader);
             return servlet.getServletHolder();
+        } finally {
+            Thread.currentThread().setContextClassLoader(prevClassLoader);
         }
     }
 
     @Override
     public void close() {
-        try (ClassLoaderSwitcher ignored = new 
ClassLoaderSwitcher(classLoader)) {
+        ClassLoader prevClassLoader = 
Thread.currentThread().getContextClassLoader();
+        try {
+            Thread.currentThread().setContextClassLoader(classLoader);
             servlet.close();
+        } finally {
+            Thread.currentThread().setContextClassLoader(prevClassLoader);
         }
         try {
             classLoader.close();
diff --git 
a/pulsar-broker/src/main/java/org/apache/pulsar/broker/protocol/ProtocolHandlerWithClassLoader.java
 
b/pulsar-broker/src/main/java/org/apache/pulsar/broker/protocol/ProtocolHandlerWithClassLoader.java
index d648c261403..eb4bcb0a9bf 100644
--- 
a/pulsar-broker/src/main/java/org/apache/pulsar/broker/protocol/ProtocolHandlerWithClassLoader.java
+++ 
b/pulsar-broker/src/main/java/org/apache/pulsar/broker/protocol/ProtocolHandlerWithClassLoader.java
@@ -26,7 +26,6 @@ import java.util.Map;
 import lombok.Data;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
-import org.apache.pulsar.broker.ClassLoaderSwitcher;
 import org.apache.pulsar.broker.ServiceConfiguration;
 import org.apache.pulsar.broker.service.BrokerService;
 import org.apache.pulsar.common.nar.NarClassLoader;
@@ -44,52 +43,79 @@ class ProtocolHandlerWithClassLoader implements 
ProtocolHandler {
 
     @Override
     public String protocolName() {
-        try (ClassLoaderSwitcher ignored = new 
ClassLoaderSwitcher(classLoader)) {
+        ClassLoader prevClassLoader = 
Thread.currentThread().getContextClassLoader();
+        try {
+            Thread.currentThread().setContextClassLoader(classLoader);
             return handler.protocolName();
+        } finally {
+            Thread.currentThread().setContextClassLoader(prevClassLoader);
         }
     }
 
     @Override
     public boolean accept(String protocol) {
-        try (ClassLoaderSwitcher ignored = new 
ClassLoaderSwitcher(classLoader)) {
+        ClassLoader prevClassLoader = 
Thread.currentThread().getContextClassLoader();
+        try {
+            Thread.currentThread().setContextClassLoader(classLoader);
             return handler.accept(protocol);
+        } finally {
+            Thread.currentThread().setContextClassLoader(prevClassLoader);
         }
     }
 
     @Override
     public void initialize(ServiceConfiguration conf) throws Exception {
-        try (ClassLoaderSwitcher ignored = new 
ClassLoaderSwitcher(classLoader)) {
+        ClassLoader prevClassLoader = 
Thread.currentThread().getContextClassLoader();
+        try {
+            Thread.currentThread().setContextClassLoader(classLoader);
             handler.initialize(conf);
+        } finally {
+            Thread.currentThread().setContextClassLoader(prevClassLoader);
         }
     }
 
     @Override
     public String getProtocolDataToAdvertise() {
-        try (ClassLoaderSwitcher ignored = new 
ClassLoaderSwitcher(classLoader)) {
+        ClassLoader prevClassLoader = 
Thread.currentThread().getContextClassLoader();
+        try {
+            Thread.currentThread().setContextClassLoader(classLoader);
             return handler.getProtocolDataToAdvertise();
+        } finally {
+            Thread.currentThread().setContextClassLoader(prevClassLoader);
         }
     }
 
     @Override
     public void start(BrokerService service) {
-        try (ClassLoaderSwitcher ignored = new 
ClassLoaderSwitcher(classLoader)) {
+        ClassLoader prevClassLoader = 
Thread.currentThread().getContextClassLoader();
+        try {
+            Thread.currentThread().setContextClassLoader(classLoader);
             handler.start(service);
+        } finally {
+            Thread.currentThread().setContextClassLoader(prevClassLoader);
         }
     }
 
     @Override
     public Map<InetSocketAddress, ChannelInitializer<SocketChannel>> 
newChannelInitializers() {
-        try (ClassLoaderSwitcher ignored = new 
ClassLoaderSwitcher(classLoader)) {
+        ClassLoader prevClassLoader = 
Thread.currentThread().getContextClassLoader();
+        try {
+            Thread.currentThread().setContextClassLoader(classLoader);
             return handler.newChannelInitializers();
+        } finally {
+            Thread.currentThread().setContextClassLoader(prevClassLoader);
         }
     }
 
     @Override
     public void close() {
-        try (ClassLoaderSwitcher ignored = new 
ClassLoaderSwitcher(classLoader)) {
+        ClassLoader prevClassLoader = 
Thread.currentThread().getContextClassLoader();
+        try {
+            Thread.currentThread().setContextClassLoader(classLoader);
             handler.close();
+        } finally {
+            Thread.currentThread().setContextClassLoader(prevClassLoader);
         }
-
         try {
             classLoader.close();
         } catch (IOException e) {

Reply via email to