AsmMethodBoost优化

This commit is contained in:
redkale
2023-12-19 22:57:56 +08:00
parent 7a37df319c
commit 4ddf2dbe86
9 changed files with 98 additions and 23 deletions

View File

@@ -4,6 +4,7 @@
package org.redkale.asm; package org.redkale.asm;
import java.lang.reflect.Method; import java.lang.reflect.Method;
import java.util.Collection;
import org.redkale.annotation.Nullable; import org.redkale.annotation.Nullable;
/** /**
@@ -15,6 +16,14 @@ import org.redkale.annotation.Nullable;
*/ */
public interface AsmMethodBoost<T> { public interface AsmMethodBoost<T> {
public static AsmMethodBoost create(Collection<AsmMethodBoost> list) {
return new AsmMethodBoosts(list);
}
public static AsmMethodBoost create(AsmMethodBoost... items) {
return new AsmMethodBoosts(items);
}
/** /**
* 对方法进行动态加强处理 * 对方法进行动态加强处理
* *

View File

@@ -4,6 +4,7 @@
package org.redkale.asm; package org.redkale.asm;
import java.lang.reflect.Method; import java.lang.reflect.Method;
import java.util.Collection;
/** /**
* 生产动态字节码的方法扩展器, 可以进行方法加强动作 * 生产动态字节码的方法扩展器, 可以进行方法加强动作
@@ -12,18 +13,22 @@ import java.lang.reflect.Method;
* *
* @since 2.8.0 * @since 2.8.0
*/ */
public class AsmMethodBoosts<T> implements AsmMethodBoost<T> { class AsmMethodBoosts<T> implements AsmMethodBoost<T> {
private final AsmMethodBoosts[] items; private final AsmMethodBoost[] items;
public AsmMethodBoosts(AsmMethodBoosts... items) { public AsmMethodBoosts(Collection<AsmMethodBoost> list) {
this.items = list.toArray(new AsmMethodBoost[list.size()]);
}
public AsmMethodBoosts(AsmMethodBoost... items) {
this.items = items; this.items = items;
} }
@Override @Override
public String doMethod(ClassWriter cw, Method method, String newMethodName) { public String doMethod(ClassWriter cw, Method method, String newMethodName) {
String newName = newMethodName; String newName = newMethodName;
for (AsmMethodBoosts item : items) { for (AsmMethodBoost item : items) {
if (item != null) { if (item != null) {
newName = item.doMethod(cw, method, newName); newName = item.doMethod(cw, method, newName);
} }
@@ -33,7 +38,7 @@ public class AsmMethodBoosts<T> implements AsmMethodBoost<T> {
@Override @Override
public void doInstance(T service) { public void doInstance(T service) {
for (AsmMethodBoosts item : items) { for (AsmMethodBoost item : items) {
if (item != null) { if (item != null) {
item.doInstance(service); item.doInstance(service);
} }

View File

@@ -21,6 +21,7 @@ import java.util.function.Consumer;
import java.util.logging.*; import java.util.logging.*;
import org.redkale.annotation.Nonnull; import org.redkale.annotation.Nonnull;
import org.redkale.annotation.Resource; import org.redkale.annotation.Resource;
import org.redkale.asm.AsmMethodBoost;
import org.redkale.boot.ClassFilter.FilterEntry; import org.redkale.boot.ClassFilter.FilterEntry;
import org.redkale.cache.spi.CacheModuleEngine; import org.redkale.cache.spi.CacheModuleEngine;
import org.redkale.cluster.*; import org.redkale.cluster.*;
@@ -841,6 +842,23 @@ public final class Application {
} }
} }
AsmMethodBoost createAsmMethodBoost(Class serviceClass) {
List<AsmMethodBoost> list = null;
for (ModuleEngine item : moduleEngines) {
AsmMethodBoost boost = item.createAsmMethodBoost(serviceClass);
if (boost != null) {
if (list == null) {
list = new ArrayList<>();
}
list.add(boost);
}
}
if (list == null) {
return null;
}
return list.size() == 1 ? list.get(0) : AsmMethodBoost.create(list);
}
/** /**
* 进入Application.init方法时被调用 * 进入Application.init方法时被调用
*/ */

View File

@@ -7,6 +7,7 @@ import java.util.List;
import java.util.Objects; import java.util.Objects;
import java.util.Properties; import java.util.Properties;
import java.util.logging.Logger; import java.util.logging.Logger;
import org.redkale.asm.AsmMethodBoost;
import org.redkale.inject.ResourceEvent; import org.redkale.inject.ResourceEvent;
import org.redkale.inject.ResourceFactory; import org.redkale.inject.ResourceFactory;
import org.redkale.service.Service; import org.redkale.service.Service;
@@ -54,6 +55,17 @@ public abstract class ModuleEngine {
return null; return null;
} }
/**
* 动态扩展类的方法
*
* @param serviceClass 类
*
* @return 方法动态扩展器
*/
public AsmMethodBoost createAsmMethodBoost(Class serviceClass) {
return null;
}
/** /**
* 进入Application.init方法时被调用 * 进入Application.init方法时被调用
* 此时状态: * 此时状态:

View File

@@ -14,6 +14,7 @@ import java.util.concurrent.locks.ReentrantLock;
import java.util.logging.Level; import java.util.logging.Level;
import java.util.stream.Stream; import java.util.stream.Stream;
import org.redkale.annotation.*; import org.redkale.annotation.*;
import org.redkale.asm.AsmMethodBoost;
import static org.redkale.boot.Application.RESNAME_SNCP_ADDRESS; import static org.redkale.boot.Application.RESNAME_SNCP_ADDRESS;
import org.redkale.boot.ClassFilter.FilterEntry; import org.redkale.boot.ClassFilter.FilterEntry;
import org.redkale.cluster.ClusterAgent; import org.redkale.cluster.ClusterAgent;
@@ -170,7 +171,9 @@ public class NodeHttpServer extends NodeServer {
} catch (Exception ex) { } catch (Exception ex) {
logger.log(Level.WARNING, "WebSocketServlet getMessageAgent error", ex); logger.log(Level.WARNING, "WebSocketServlet getMessageAgent error", ex);
} }
nodeService = Sncp.createLocalService(serverClassLoader, resourceName, org.redkale.net.http.WebSocketNodeService.class, application.getResourceFactory(), application.getSncpRpcGroups(), sncpClient, messageAgent, (String) null, (AnyValue) null); AsmMethodBoost methodBoost = application.createAsmMethodBoost(WebSocketNodeService.class);
nodeService = Sncp.createLocalService(serverClassLoader, resourceName, WebSocketNodeService.class, methodBoost,
application.getResourceFactory(), application.getSncpRpcGroups(), sncpClient, messageAgent, (String) null, (AnyValue) null);
regFactory.register(resourceName, WebSocketNode.class, nodeService); regFactory.register(resourceName, WebSocketNode.class, nodeService);
} }
resourceFactory.inject(resourceName, nodeService, self); resourceFactory.inject(resourceName, nodeService, self);

View File

@@ -18,6 +18,7 @@ import java.util.logging.*;
import org.redkale.annotation.*; import org.redkale.annotation.*;
import org.redkale.annotation.AutoLoad; import org.redkale.annotation.AutoLoad;
import org.redkale.annotation.Command; import org.redkale.annotation.Command;
import org.redkale.asm.AsmMethodBoost;
import static org.redkale.boot.Application.*; import static org.redkale.boot.Application.*;
import org.redkale.boot.ClassFilter.FilterEntry; import org.redkale.boot.ClassFilter.FilterEntry;
import org.redkale.cluster.ClusterAgent; import org.redkale.cluster.ClusterAgent;
@@ -28,6 +29,7 @@ import org.redkale.net.*;
import org.redkale.net.Filter; import org.redkale.net.Filter;
import org.redkale.net.client.ClientAddress; import org.redkale.net.client.ClientAddress;
import org.redkale.net.http.*; import org.redkale.net.http.*;
import org.redkale.net.http.WebSocketNodeService;
import org.redkale.net.sncp.*; import org.redkale.net.sncp.*;
import org.redkale.service.*; import org.redkale.service.*;
import org.redkale.source.*; import org.redkale.source.*;
@@ -262,7 +264,8 @@ public abstract class NodeServer {
if (groups.isEmpty() && isSNCP() && NodeServer.this.sncpGroup != null) { if (groups.isEmpty() && isSNCP() && NodeServer.this.sncpGroup != null) {
groups.add(NodeServer.this.sncpGroup); groups.add(NodeServer.this.sncpGroup);
} }
nodeService = Sncp.createLocalService(serverClassLoader, resourceName, org.redkale.net.http.WebSocketNodeService.class, AsmMethodBoost methodBoost = application.createAsmMethodBoost(WebSocketNodeService.class);
nodeService = Sncp.createLocalService(serverClassLoader, resourceName, WebSocketNodeService.class, methodBoost,
application.getResourceFactory(), application.getSncpRpcGroups(), sncpClient, null, (String) null, (AnyValue) null); application.getResourceFactory(), application.getSncpRpcGroups(), sncpClient, null, (String) null, (AnyValue) null);
(isSNCP() ? appResFactory : resourceFactory).register(resourceName, WebSocketNode.class, nodeService); (isSNCP() ? appResFactory : resourceFactory).register(resourceName, WebSocketNode.class, nodeService);
((org.redkale.net.http.WebSocketNodeService) nodeService).setName(resourceName); ((org.redkale.net.http.WebSocketNodeService) nodeService).setName(resourceName);
@@ -324,10 +327,14 @@ public abstract class NodeServer {
} }
//ResourceFactory resfactory = (isSNCP() ? appResFactory : resourceFactory); //ResourceFactory resfactory = (isSNCP() ? appResFactory : resourceFactory);
Service service = Modifier.isFinal(resServiceType.getModifiers()) || Sncp.isComponent(resServiceType) Service service;
? (Service) resServiceType.getConstructor().newInstance() if (Modifier.isFinal(resServiceType.getModifiers()) || Sncp.isComponent(resServiceType)) {
: Sncp.createLocalService(serverClassLoader, resourceName, resServiceType, service = (Service) resServiceType.getConstructor().newInstance();
appResFactory, application.getSncpRpcGroups(), sncpClient, null, null, null); } else {
AsmMethodBoost methodBoost = application.createAsmMethodBoost(resServiceType);
service = Sncp.createLocalService(serverClassLoader, resourceName, resServiceType,
methodBoost, appResFactory, application.getSncpRpcGroups(), sncpClient, null, null, null);
}
appResFactory.register(resourceName, resServiceType, service); appResFactory.register(resourceName, resServiceType, service);
field.set(srcObj, service); field.set(srcObj, service);
@@ -415,10 +422,14 @@ public abstract class NodeServer {
return null; return null;
} }
service = serviceImplClass.getDeclaredConstructor().newInstance(); service = serviceImplClass.getDeclaredConstructor().newInstance();
} else if (ws || localMode) { //本地模式 } else if (ws || localMode) { //本地模式
service = Sncp.createLocalService(serverClassLoader, resourceName, serviceImplClass, appResourceFactory, rpcGroups, this.sncpClient, agent, group, entry.getProperty()); AsmMethodBoost methodBoost = application.createAsmMethodBoost(serviceImplClass);
service = Sncp.createLocalService(serverClassLoader, resourceName, serviceImplClass,
methodBoost, appResourceFactory, rpcGroups, this.sncpClient, agent, group, entry.getProperty());
} else { } else {
service = Sncp.createRemoteService(serverClassLoader, resourceName, serviceImplClass, appResourceFactory, rpcGroups, this.sncpClient, agent, group, entry.getProperty()); AsmMethodBoost methodBoost = application.createAsmMethodBoost(serviceImplClass);
service = Sncp.createRemoteService(serverClassLoader, resourceName, serviceImplClass,
methodBoost, appResourceFactory, rpcGroups, this.sncpClient, agent, group, entry.getProperty());
} }
final Class restype = Sncp.getResourceType(service); final Class restype = Sncp.getResourceType(service);
if (rf.find(resourceName, restype) == null) { if (rf.find(resourceName, restype) == null) {

View File

@@ -56,7 +56,7 @@ public class CacheModuleEngine extends ModuleEngine {
//设置缓存管理器 //设置缓存管理器
this.config = application.getAppConfig().getAnyValue("cache"); this.config = application.getAppConfig().getAnyValue("cache");
this.cacheManager = createManager(this.config); this.cacheManager = createManager(this.config);
if (this.config != null && !application.isCompileMode()) { if (!application.isCompileMode()) {
this.resourceFactory.inject(this.cacheManager); this.resourceFactory.inject(this.cacheManager);
if (this.cacheManager instanceof Service) { if (this.cacheManager instanceof Service) {
((Service) this.cacheManager).init(this.config); ((Service) this.cacheManager).init(this.config);

View File

@@ -71,6 +71,7 @@ public abstract class Sncp {
} }
private Sncp() { private Sncp() {
//do nothing
} }
//key: actionid //key: actionid
@@ -459,11 +460,13 @@ public abstract class Sncp {
* @param classLoader ClassLoader * @param classLoader ClassLoader
* @param name 资源名 * @param name 资源名
* @param serviceImplClass Service类 * @param serviceImplClass Service类
* @param methodBoost 方法扩展
* *
* @return Service实例 * @return Service实例
*/ */
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
protected static <T extends Service> Class<? extends T> createLocalServiceClass(ClassLoader classLoader, final String name, final Class<T> serviceImplClass) { protected static <T extends Service> Class<? extends T> createLocalServiceClass(ClassLoader classLoader,
final String name, final Class<T> serviceImplClass, final AsmMethodBoost methodBoost) {
Objects.requireNonNull(serviceImplClass); Objects.requireNonNull(serviceImplClass);
if (!Service.class.isAssignableFrom(serviceImplClass)) { if (!Service.class.isAssignableFrom(serviceImplClass)) {
throw new SncpException(serviceImplClass + " is not Service type"); throw new SncpException(serviceImplClass + " is not Service type");
@@ -576,7 +579,7 @@ public abstract class Sncp {
} }
public static <T extends Service> T createSimpleLocalService(Class<T> serviceImplClass, ResourceFactory resourceFactory) { public static <T extends Service> T createSimpleLocalService(Class<T> serviceImplClass, ResourceFactory resourceFactory) {
return createLocalService(null, "", serviceImplClass, resourceFactory, null, null, null, null, null); return createLocalService(null, "", serviceImplClass, null, resourceFactory, null, null, null, null, null);
} }
/** /**
@@ -587,6 +590,7 @@ public abstract class Sncp {
* @param classLoader ClassLoader * @param classLoader ClassLoader
* @param name 资源名 * @param name 资源名
* @param serviceImplClass Service类 * @param serviceImplClass Service类
* @param methodBoost 方法扩展
* @param resourceFactory ResourceFactory * @param resourceFactory ResourceFactory
* @param sncpRpcGroups SncpRpcGroups * @param sncpRpcGroups SncpRpcGroups
* @param client SncpClient * @param client SncpClient
@@ -601,6 +605,7 @@ public abstract class Sncp {
final RedkaleClassLoader classLoader, final RedkaleClassLoader classLoader,
final String name, final String name,
final Class<T> serviceImplClass, final Class<T> serviceImplClass,
final AsmMethodBoost methodBoost,
final ResourceFactory resourceFactory, final ResourceFactory resourceFactory,
final SncpRpcGroups sncpRpcGroups, final SncpRpcGroups sncpRpcGroups,
final SncpClient client, final SncpClient client,
@@ -608,7 +613,7 @@ public abstract class Sncp {
final String remoteGroup, final String remoteGroup,
final AnyValue conf) { final AnyValue conf) {
try { try {
final Class newClazz = createLocalServiceClass(classLoader, name, serviceImplClass); final Class newClazz = createLocalServiceClass(classLoader, name, serviceImplClass, methodBoost);
T service = (T) newClazz.getDeclaredConstructor().newInstance(); T service = (T) newClazz.getDeclaredConstructor().newInstance();
//-------------------------------------- //--------------------------------------
Service remoteService = null; Service remoteService = null;
@@ -630,7 +635,8 @@ public abstract class Sncp {
field.setAccessible(true); field.setAccessible(true);
RedkaleClassLoader.putReflectionField(loop.getName(), field); RedkaleClassLoader.putReflectionField(loop.getName(), field);
if (remoteService == null && sncpRpcGroups != null && client != null) { if (remoteService == null && sncpRpcGroups != null && client != null) {
remoteService = createRemoteService(classLoader, name, serviceImplClass, resourceFactory, sncpRpcGroups, client, agent, remoteGroup, conf); remoteService = createRemoteService(classLoader, name, serviceImplClass,
methodBoost, resourceFactory, sncpRpcGroups, client, agent, remoteGroup, conf);
} }
if (remoteService != null) { if (remoteService != null) {
field.set(service, remoteService); field.set(service, remoteService);
@@ -648,6 +654,9 @@ public abstract class Sncp {
c.setAccessible(true); c.setAccessible(true);
c.set(service, agent == null ? null : agent.getName()); c.set(service, agent == null ? null : agent.getName());
} }
if (methodBoost != null) {
methodBoost.doInstance(service);
}
return service; return service;
} catch (RuntimeException rex) { } catch (RuntimeException rex) {
throw rex; throw rex;
@@ -656,15 +665,15 @@ public abstract class Sncp {
} }
} }
public static <T extends Service> T createSimpleRemoteService(Class<T> serviceImplClass, ResourceFactory resourceFactory, public static <T extends Service> T createSimpleRemoteService(Class<T> serviceImplClass,
SncpRpcGroups sncpRpcGroups, SncpClient client, String group) { ResourceFactory resourceFactory, SncpRpcGroups sncpRpcGroups, SncpClient client, String group) {
if (sncpRpcGroups == null) { if (sncpRpcGroups == null) {
throw new SncpException("SncpRpcGroups is null"); throw new SncpException("SncpRpcGroups is null");
} }
if (client == null) { if (client == null) {
throw new SncpException("SncpClient is null"); throw new SncpException("SncpClient is null");
} }
return createRemoteService(null, "", serviceImplClass, resourceFactory, sncpRpcGroups, client, null, group, null); return createRemoteService(null, "", serviceImplClass, null, resourceFactory, sncpRpcGroups, client, null, group, null);
} }
/** /**
@@ -703,6 +712,7 @@ public abstract class Sncp {
* @param classLoader ClassLoader * @param classLoader ClassLoader
* @param name 资源名 * @param name 资源名
* @param serviceTypeOrImplClass Service类 * @param serviceTypeOrImplClass Service类
* @param methodBoost 方法扩展
* @param resourceFactory ResourceFactory * @param resourceFactory ResourceFactory
* @param sncpRpcGroups SncpRpcGroups * @param sncpRpcGroups SncpRpcGroups
* @param client SncpClient * @param client SncpClient
@@ -717,6 +727,7 @@ public abstract class Sncp {
final ClassLoader classLoader, final ClassLoader classLoader,
final String name, final String name,
final Class<T> serviceTypeOrImplClass, final Class<T> serviceTypeOrImplClass,
final AsmMethodBoost methodBoost,
final ResourceFactory resourceFactory, final ResourceFactory resourceFactory,
final SncpRpcGroups sncpRpcGroups, final SncpRpcGroups sncpRpcGroups,
final SncpClient client, final SncpClient client,
@@ -780,6 +791,9 @@ public abstract class Sncp {
c.setAccessible(true); c.setAccessible(true);
c.set(service, info); c.set(service, info);
} }
if (methodBoost != null) {
methodBoost.doInstance(service);
}
return service; return service;
} catch (Throwable ex) { } catch (Throwable ex) {
//do nothing //do nothing
@@ -984,6 +998,9 @@ public abstract class Sncp {
c.set(service, info); c.set(service, info);
RedkaleClassLoader.putReflectionField(newDynName.replace('/', '.'), c); RedkaleClassLoader.putReflectionField(newDynName.replace('/', '.'), c);
} }
if (methodBoost != null) {
methodBoost.doInstance(service);
}
return service; return service;
} catch (Exception ex) { } catch (Exception ex) {
throw new SncpException(ex); throw new SncpException(ex);

View File

@@ -9,7 +9,7 @@ import java.util.concurrent.ConcurrentHashMap;
import org.redkale.boot.ClassFilter; import org.redkale.boot.ClassFilter;
/** /**
* 协议地址组合对象, 对应application.xml 中 resources-&#62;group 节点信息 * 协议地址组合对象, 对应application.xmlgroup节点信息
* *
* <p> * <p>
* 详情见: https://redkale.org * 详情见: https://redkale.org