diff --git a/com.creditease.uav.hook.dubbo/src/main/java/com/creditease/uav/hook/dubbo/DubboHookProxy.java b/com.creditease.uav.hook.dubbo/src/main/java/com/creditease/uav/hook/dubbo/DubboHookProxy.java index 3fcc6230..e53f386c 100644 --- a/com.creditease.uav.hook.dubbo/src/main/java/com/creditease/uav/hook/dubbo/DubboHookProxy.java +++ b/com.creditease.uav.hook.dubbo/src/main/java/com/creditease/uav/hook/dubbo/DubboHookProxy.java @@ -51,6 +51,7 @@ public void start(HookContext context, ClassLoader webapploader) { Event evt = context.get(Event.class); switch (evt) { + case SPRING_BEAN_REGIST: case WEBCONTAINER_INIT: InsertInterceptToClients(context, webapploader); break; @@ -69,6 +70,9 @@ public void start(HookContext context, ClassLoader webapploader) { private void InsertInterceptToClients(HookContext context, ClassLoader webapploader) { + if (isHookEventDone("InsertInterceptToClients")) { + return; + } InterceptContext ic = (InterceptContext) context.get(HookConstants.INTERCEPTCONTEXT); String contextPath = (String) ic.get(InterceptConstants.CONTEXTPATH); diff --git a/com.creditease.uav.hook.httpclients/src/main/java/com/creditease/uav/hook/httpclients/async/HttpAsyncClientHookProxy.java b/com.creditease.uav.hook.httpclients/src/main/java/com/creditease/uav/hook/httpclients/async/HttpAsyncClientHookProxy.java index 96ec06db..66c979dd 100644 --- a/com.creditease.uav.hook.httpclients/src/main/java/com/creditease/uav/hook/httpclients/async/HttpAsyncClientHookProxy.java +++ b/com.creditease.uav.hook.httpclients/src/main/java/com/creditease/uav/hook/httpclients/async/HttpAsyncClientHookProxy.java @@ -57,6 +57,7 @@ public void start(HookContext context, ClassLoader webapploader) { Event evt = context.get(Event.class); switch (evt) { + case SPRING_BEAN_REGIST: case WEBCONTAINER_INIT: InsertInterceptToClients(context, webapploader); break; @@ -76,6 +77,10 @@ public void start(HookContext context, ClassLoader webapploader) { public void InsertInterceptToClients(HookContext context, ClassLoader webapploader) { + if (isHookEventDone("InsertInterceptToClients")) { + return; + } + InterceptContext ic = (InterceptContext) context.get(HookConstants.INTERCEPTCONTEXT); String contextPath = (String) ic.get(InterceptConstants.CONTEXTPATH); diff --git a/com.creditease.uav.hook.httpclients/src/main/java/com/creditease/uav/hook/httpclients/sync/HttpClientHookProxy.java b/com.creditease.uav.hook.httpclients/src/main/java/com/creditease/uav/hook/httpclients/sync/HttpClientHookProxy.java index 8a80a577..b7197b45 100644 --- a/com.creditease.uav.hook.httpclients/src/main/java/com/creditease/uav/hook/httpclients/sync/HttpClientHookProxy.java +++ b/com.creditease.uav.hook.httpclients/src/main/java/com/creditease/uav/hook/httpclients/sync/HttpClientHookProxy.java @@ -56,6 +56,7 @@ public void start(HookContext context, ClassLoader webapploader) { Event evt = context.get(Event.class); switch (evt) { + case SPRING_BEAN_REGIST: case WEBCONTAINER_INIT: InsertInterceptToClients(context, webapploader); break; @@ -76,6 +77,10 @@ public void start(HookContext context, ClassLoader webapploader) { public void InsertInterceptToClients(HookContext context, ClassLoader webapploader) { + if (isHookEventDone("InsertInterceptToClients")) { + return; + } + InterceptContext ic = (InterceptContext) context.get(HookConstants.INTERCEPTCONTEXT); String contextPath = (String) ic.get(InterceptConstants.CONTEXTPATH); diff --git a/com.creditease.uav.hook.httpclients/src/main/java/com/creditease/uav/hook/httpclients3/sync/HttpClient3HookProxy.java b/com.creditease.uav.hook.httpclients/src/main/java/com/creditease/uav/hook/httpclients3/sync/HttpClient3HookProxy.java index 031e84aa..de0149d0 100644 --- a/com.creditease.uav.hook.httpclients/src/main/java/com/creditease/uav/hook/httpclients3/sync/HttpClient3HookProxy.java +++ b/com.creditease.uav.hook.httpclients/src/main/java/com/creditease/uav/hook/httpclients3/sync/HttpClient3HookProxy.java @@ -56,6 +56,7 @@ public void start(HookContext context, ClassLoader webapploader) { Event evt = context.get(Event.class); switch (evt) { + case SPRING_BEAN_REGIST: case WEBCONTAINER_RESOURCE_INIT: break; case WEBCONTAINER_INIT: @@ -76,6 +77,10 @@ public void start(HookContext context, ClassLoader webapploader) { public void InsertInterceptToClients(HookContext context, ClassLoader webapploader) { + if (isHookEventDone("InsertInterceptToClients")) { + return; + } + InterceptContext ic = (InterceptContext) context.get(HookConstants.INTERCEPTCONTEXT); String contextPath = (String) ic.get(InterceptConstants.CONTEXTPATH); String basePath = (String) ic.get(InterceptConstants.BASEPATH); diff --git a/com.creditease.uav.hook.jaxws/src/main/java/com/creditease/uav/hook/jaxws/JaxWSHookProxy.java b/com.creditease.uav.hook.jaxws/src/main/java/com/creditease/uav/hook/jaxws/JaxWSHookProxy.java index b66b65cc..3420e959 100644 --- a/com.creditease.uav.hook.jaxws/src/main/java/com/creditease/uav/hook/jaxws/JaxWSHookProxy.java +++ b/com.creditease.uav.hook.jaxws/src/main/java/com/creditease/uav/hook/jaxws/JaxWSHookProxy.java @@ -51,6 +51,7 @@ public void start(HookContext context, ClassLoader webapploader) { Event event = context.get(Event.class); switch (event) { + case SPRING_BEAN_REGIST: case WEBCONTAINER_INIT: insertIntercepter(context, webapploader); break; @@ -70,6 +71,10 @@ public void start(HookContext context, ClassLoader webapploader) { private void insertIntercepter(HookContext context, ClassLoader webapploader) { + if (isHookEventDone("InsertInterceptToClients")) { + return; + } + InterceptContext ic = (InterceptContext) context.get(HookConstants.INTERCEPTCONTEXT); String contextPath = (String) ic.get(InterceptConstants.CONTEXTPATH); @@ -87,7 +92,7 @@ public void doInstallDProxy(ClassLoader webapploader, final String appid) { dpInstall.setTargetClassLoader(webapploader); /** - * install proxy to InternalHttpAsyncClient + * install proxy to javax.xml.ws.Service */ dpInstall.installProxy("javax.xml.ws.Service", new String[] { "com.creditease.uav.hook.jaxws.interceptors" }, new DynamicProxyProcessor() { diff --git a/com.creditease.uav.hook.jdbc/src/main/java/com/creditease/uav/hook/jdbc/JdbcHookProxy.java b/com.creditease.uav.hook.jdbc/src/main/java/com/creditease/uav/hook/jdbc/JdbcHookProxy.java index 332c0715..cd946e3c 100644 --- a/com.creditease.uav.hook.jdbc/src/main/java/com/creditease/uav/hook/jdbc/JdbcHookProxy.java +++ b/com.creditease.uav.hook.jdbc/src/main/java/com/creditease/uav/hook/jdbc/JdbcHookProxy.java @@ -44,17 +44,9 @@ public class JdbcHookProxy extends HookProxy { private final DynamicProxyInstaller dpInstall; - private boolean isInjectDrvMgr = false; - private boolean isInjectDruid = false; - private boolean isInjectDBCP2 = false; - private boolean isInjectTomcatDBCP2 = false; - private boolean isInjectHikari = false; - private boolean isInjectDataSource = false; - @SuppressWarnings("rawtypes") public JdbcHookProxy(String id, Map config) { super(id, config); - dpInstall = new DynamicProxyInstaller(); } @@ -64,6 +56,7 @@ public void start(HookContext context, ClassLoader webapploader) { Event event = context.get(Event.class); InterceptContext ic = (InterceptContext) context.get(HookConstants.INTERCEPTCONTEXT); switch (event) { + case SPRING_BEAN_REGIST: case WEBCONTAINER_RESOURCE_INIT: this.injectDriverManager(webapploader, ic); this.injectDBCP2(webapploader, ic); @@ -113,12 +106,10 @@ private String getAppID(InterceptContext ic) { */ private void injectDriverManager(ClassLoader webapploader, InterceptContext ic) { - if (this.isInjectDrvMgr == true) { + if (isHookEventDone("isInjectDrvMgr")) { return; } - this.isInjectDrvMgr = true; - JdbcDriverIT jdbcDriverIT = new JdbcDriverIT(this.getAppID(ic)); jdbcDriverIT.initSomeDrivers(webapploader); @@ -149,12 +140,10 @@ private void injectDataSource(InterceptContext ic) { return; } - if (this.isInjectDataSource == true) { + if (isHookEventDone("isInjectDataSource")) { return; } - this.isInjectDataSource = true; - JdbcDriverIT jdbcDriverIT = new JdbcDriverIT(this.getAppID(ic)); ServerVendor vendor = (ServerVendor) this.getServerInfo(CaptureConstants.INFO_APPSERVER_VENDOR); @@ -188,12 +177,10 @@ private void injectTomcatDBCP2(ClassLoader webapploader, InterceptContext ic) { return; } - if (this.isInjectTomcatDBCP2 == true) { + if (isHookEventDone("isInjectTomcatDBCP2")) { return; } - this.isInjectTomcatDBCP2 = true; - final String appid = this.getAppID(ic); /** @@ -242,12 +229,10 @@ private void injectDBCP2(ClassLoader webapploader, InterceptContext ic) { return; } - if (this.isInjectDBCP2 == true) { + if (isHookEventDone("isInjectDBCP2")) { return; } - this.isInjectDBCP2 = true; - final String appid = this.getAppID(ic); /** @@ -294,12 +279,10 @@ private void injectHikari(ClassLoader webapploader, InterceptContext ic) { return; } - if (isInjectHikari == true) { + if (isHookEventDone("isInjectHikari")) { return; } - isInjectHikari = true; - final String appid = this.getAppID(ic); final String contextPath = (String) ic.get(InterceptConstants.CONTEXTPATH); @@ -357,12 +340,10 @@ private void injectDruid(ClassLoader webapploader, InterceptContext ic) { return; } - if (this.isInjectDruid == true) { + if (isHookEventDone("isInjectDruid")) { return; } - this.isInjectDruid = true; - final String appid = this.getAppID(ic); /** diff --git a/com.creditease.uav.hook.jdbc/src/main/java/com/creditease/uav/hook/jdbc/pools/AbsDBPoolHookProxy.java b/com.creditease.uav.hook.jdbc/src/main/java/com/creditease/uav/hook/jdbc/pools/AbsDBPoolHookProxy.java index 9460cb88..1ee192d6 100644 --- a/com.creditease.uav.hook.jdbc/src/main/java/com/creditease/uav/hook/jdbc/pools/AbsDBPoolHookProxy.java +++ b/com.creditease.uav.hook.jdbc/src/main/java/com/creditease/uav/hook/jdbc/pools/AbsDBPoolHookProxy.java @@ -56,6 +56,7 @@ public void start(HookContext context, ClassLoader webapploader) { Event event = context.get(Event.class); InterceptContext ic = (InterceptContext) context.get(HookConstants.INTERCEPTCONTEXT); switch (event) { + case SPRING_BEAN_REGIST: case WEBCONTAINER_INIT: initHook(ic); break; @@ -89,6 +90,9 @@ public void start(HookContext context, ClassLoader webapploader) { */ private void initHook(InterceptContext ic) { + if (isHookEventDone("initHook")) { + return; + } String contextPath = (String) ic.get(InterceptConstants.CONTEXTPATH); String basePath = (String) ic.get(InterceptConstants.BASEPATH); appid = MonitorServerUtil.getApplicationId(contextPath, basePath); diff --git a/com.creditease.uav.hook.jdbc/src/main/java/com/creditease/uav/hook/jdbc/pools/dbcp/DBCPHookProxy.java b/com.creditease.uav.hook.jdbc/src/main/java/com/creditease/uav/hook/jdbc/pools/dbcp/DBCPHookProxy.java index f8354e56..c2f88042 100644 --- a/com.creditease.uav.hook.jdbc/src/main/java/com/creditease/uav/hook/jdbc/pools/dbcp/DBCPHookProxy.java +++ b/com.creditease.uav.hook.jdbc/src/main/java/com/creditease/uav/hook/jdbc/pools/dbcp/DBCPHookProxy.java @@ -46,8 +46,6 @@ public class DBCPHookProxy extends AbsDBPoolHookProxy { protected DynamicProxyInstaller dpInstall; - private boolean isInit = false; - @SuppressWarnings("rawtypes") public DBCPHookProxy(String id, Map config) { super(id, config); @@ -62,6 +60,7 @@ public void start(HookContext context, ClassLoader webapploader) { Event event = context.get(Event.class); switch (event) { + case SPRING_BEAN_REGIST: case WEBCONTAINER_RESOURCE_INIT: case WEBCONTAINER_INIT: InsertInterceptToClients(context, webapploader); @@ -93,16 +92,15 @@ public void start(HookContext context, ClassLoader webapploader) { */ private void InsertInterceptToClients(HookContext context, ClassLoader webapploader) { + if (isHookEventDone("InsertInterceptToClients")) { + return; + } + InterceptContext ic = (InterceptContext) context.get(HookConstants.INTERCEPTCONTEXT); String contextPath = (String) ic.get(InterceptConstants.CONTEXTPATH); String basePath = (String) ic.get(InterceptConstants.BASEPATH); appid = MonitorServerUtil.getApplicationId(contextPath, basePath); - if (isInit == true) { - return; - } - - isInit = true; /** * set the webapploader is the target classloader */ diff --git a/com.creditease.uav.hook.jdbc/src/main/java/com/creditease/uav/hook/jdbc/pools/hikari/HikariHookProxy.java b/com.creditease.uav.hook.jdbc/src/main/java/com/creditease/uav/hook/jdbc/pools/hikari/HikariHookProxy.java index 8bdee82f..2dd5ca39 100644 --- a/com.creditease.uav.hook.jdbc/src/main/java/com/creditease/uav/hook/jdbc/pools/hikari/HikariHookProxy.java +++ b/com.creditease.uav.hook.jdbc/src/main/java/com/creditease/uav/hook/jdbc/pools/hikari/HikariHookProxy.java @@ -58,6 +58,7 @@ public void start(HookContext context, ClassLoader webapploader) { Event event = context.get(Event.class); switch (event) { + case SPRING_BEAN_REGIST: case WEBCONTAINER_RESOURCE_INIT: case WEBCONTAINER_INIT: InsertInterceptToClients(context, webapploader); @@ -89,16 +90,15 @@ public void start(HookContext context, ClassLoader webapploader) { */ private void InsertInterceptToClients(HookContext context, ClassLoader webapploader) { + if (isHookEventDone("InsertInterceptToClients")) { + return; + } + InterceptContext ic = (InterceptContext) context.get(HookConstants.INTERCEPTCONTEXT); String contextPath = (String) ic.get(InterceptConstants.CONTEXTPATH); String basePath = (String) ic.get(InterceptConstants.BASEPATH); appid = MonitorServerUtil.getApplicationId(contextPath, basePath); - if (isInit == true) { - return; - } - - isInit = true; // /** // * set the webapploader is the target classloader // */ diff --git a/com.creditease.uav.hook.jdbc/src/main/java/com/creditease/uav/hook/jdbc/pools/mybatis/MybatisHookProxy.java b/com.creditease.uav.hook.jdbc/src/main/java/com/creditease/uav/hook/jdbc/pools/mybatis/MybatisHookProxy.java index c2e6eef5..d8b2c772 100644 --- a/com.creditease.uav.hook.jdbc/src/main/java/com/creditease/uav/hook/jdbc/pools/mybatis/MybatisHookProxy.java +++ b/com.creditease.uav.hook.jdbc/src/main/java/com/creditease/uav/hook/jdbc/pools/mybatis/MybatisHookProxy.java @@ -49,7 +49,6 @@ public class MybatisHookProxy extends AbsDBPoolHookProxy { protected DynamicProxyInstaller dpInstall; private ClassLoader webapploaderForMybatis = null; - private boolean isInit = false; @SuppressWarnings("rawtypes") public MybatisHookProxy(String id, Map config) { @@ -65,6 +64,7 @@ public void start(HookContext context, ClassLoader webapploader) { webapploaderForMybatis = webapploader; Event event = context.get(Event.class); switch (event) { + case SPRING_BEAN_REGIST: case WEBCONTAINER_RESOURCE_INIT: case WEBCONTAINER_INIT: InsertInterceptToClients(context, webapploader); @@ -111,17 +111,15 @@ protected void collectDBPoolMetrics(MonitorElement clientElem) { private void InsertInterceptToClients(HookContext context, ClassLoader webapploader) { + if (isHookEventDone("InsertInterceptToClients")) { + return; + } + InterceptContext ic = (InterceptContext) context.get(HookConstants.INTERCEPTCONTEXT); String contextPath = (String) ic.get(InterceptConstants.CONTEXTPATH); String basePath = (String) ic.get(InterceptConstants.BASEPATH); appid = MonitorServerUtil.getApplicationId(contextPath, basePath); - if (isInit == true) { - return; - } - - isInit = true; - dpInstall.setTargetClassLoader(webapploader); dpInstall.installProxy("org.apache.ibatis.datasource.pooled.PooledDataSource", @@ -157,7 +155,7 @@ private void collectDataSourceStat(MonitorElementInstance inst, DataSource pds, ReflectHelper.invoke(className, pds, prefix + collectMtrx[i], null, null, webapploader)); } - Object poolState = ReflectHelper.invoke(className, pds, "getPoolState", null, null,webapploader); + Object poolState = ReflectHelper.invoke(className, pds, "getPoolState", null, null, webapploader); for (; i < collectMtrx.length; i++) { diff --git a/com.creditease.uav.hook.mongoclients/src/main/java/com/creditease/uav/hook/mongoclients/MongoClientHookProxy.java b/com.creditease.uav.hook.mongoclients/src/main/java/com/creditease/uav/hook/mongoclients/MongoClientHookProxy.java index 8ee927f3..31cf3688 100644 --- a/com.creditease.uav.hook.mongoclients/src/main/java/com/creditease/uav/hook/mongoclients/MongoClientHookProxy.java +++ b/com.creditease.uav.hook.mongoclients/src/main/java/com/creditease/uav/hook/mongoclients/MongoClientHookProxy.java @@ -22,11 +22,9 @@ import java.util.Map; -import com.creditease.monitor.UAVServer; import com.creditease.monitor.appfra.hook.spi.HookConstants; import com.creditease.monitor.appfra.hook.spi.HookContext; import com.creditease.monitor.appfra.hook.spi.HookProxy; -import com.creditease.monitor.captureframework.spi.CaptureConstants; import com.creditease.monitor.interceptframework.spi.InterceptConstants; import com.creditease.monitor.interceptframework.spi.InterceptContext; import com.creditease.monitor.interceptframework.spi.InterceptContext.Event; @@ -59,6 +57,7 @@ public void start(HookContext context, ClassLoader webapploader) { Event evt = context.get(Event.class); switch (evt) { + case SPRING_BEAN_REGIST: case WEBCONTAINER_INIT: InsertInterceptToClients(context, webapploader); break; @@ -78,14 +77,9 @@ public void start(HookContext context, ClassLoader webapploader) { public void InsertInterceptToClients(HookContext context, ClassLoader webapploader) { - /** - * NOTE: this is a special process for springboot, because the MongoClient hook happens in transform - */ - if (UAVServer.ServerVendor.SPRINGBOOT == UAVServer.instance() - .getServerInfo(CaptureConstants.INFO_APPSERVER_VENDOR)) { + if (isHookEventDone("InsertInterceptToClients")) { return; } - InterceptContext ic = (InterceptContext) context.get(HookConstants.INTERCEPTCONTEXT); String contextPath = (String) ic.get(InterceptConstants.CONTEXTPATH); diff --git a/com.creditease.uav.hook.mq/src/main/java/com/creditease/uav/hook/rabbitmq/RabbitmqHookProxy.java b/com.creditease.uav.hook.mq/src/main/java/com/creditease/uav/hook/rabbitmq/RabbitmqHookProxy.java index ae90ae03..bec0a692 100644 --- a/com.creditease.uav.hook.mq/src/main/java/com/creditease/uav/hook/rabbitmq/RabbitmqHookProxy.java +++ b/com.creditease.uav.hook.mq/src/main/java/com/creditease/uav/hook/rabbitmq/RabbitmqHookProxy.java @@ -57,6 +57,7 @@ public void start(HookContext context, ClassLoader webapploader) { Event evt = context.get(Event.class); switch (evt) { + case SPRING_BEAN_REGIST: case WEBCONTAINER_INIT: InsertInterceptToClients(context, webapploader); break; @@ -76,6 +77,10 @@ public void start(HookContext context, ClassLoader webapploader) { public void InsertInterceptToClients(HookContext context, ClassLoader webapploader) { + if (isHookEventDone("InsertInterceptToClients")) { + return; + } + InterceptContext ic = (InterceptContext) context.get(HookConstants.INTERCEPTCONTEXT); String contextPath = (String) ic.get(InterceptConstants.CONTEXTPATH); diff --git a/com.creditease.uav.hook.mq/src/main/java/com/creditease/uav/hook/rocketmq/RocketmqHookProxy.java b/com.creditease.uav.hook.mq/src/main/java/com/creditease/uav/hook/rocketmq/RocketmqHookProxy.java index 2dc1f78a..085ae525 100644 --- a/com.creditease.uav.hook.mq/src/main/java/com/creditease/uav/hook/rocketmq/RocketmqHookProxy.java +++ b/com.creditease.uav.hook.mq/src/main/java/com/creditease/uav/hook/rocketmq/RocketmqHookProxy.java @@ -56,6 +56,7 @@ public void start(HookContext context, ClassLoader webapploader) { Event evt = context.get(Event.class); switch (evt) { + case SPRING_BEAN_REGIST: case WEBCONTAINER_INIT: InsertInterceptToClients(context, webapploader); break; @@ -75,6 +76,10 @@ public void start(HookContext context, ClassLoader webapploader) { public void InsertInterceptToClients(HookContext context, ClassLoader webapploader) { + if (isHookEventDone("InsertInterceptToClients")) { + return; + } + InterceptContext ic = (InterceptContext) context.get(HookConstants.INTERCEPTCONTEXT); String contextPath = (String) ic.get(InterceptConstants.CONTEXTPATH); diff --git a/com.creditease.uav.hook.redis/src/main/java/com/creditease/uav/hook/redis/aredis/AredisHookProxy.java b/com.creditease.uav.hook.redis/src/main/java/com/creditease/uav/hook/redis/aredis/AredisHookProxy.java index 5a68edf3..438d6ea7 100644 --- a/com.creditease.uav.hook.redis/src/main/java/com/creditease/uav/hook/redis/aredis/AredisHookProxy.java +++ b/com.creditease.uav.hook.redis/src/main/java/com/creditease/uav/hook/redis/aredis/AredisHookProxy.java @@ -48,6 +48,10 @@ public AredisHookProxy(String id, @SuppressWarnings("rawtypes") Map config) { protected void insertIntercepter(HookContext context, ClassLoader webapploader) { + if (isHookEventDone("insertIntercepter")) { + return; + } + InterceptContext ic = (InterceptContext) context.get(HookConstants.INTERCEPTCONTEXT); String contextPath = (String) ic.get(InterceptConstants.CONTEXTPATH); @@ -96,6 +100,7 @@ public void start(HookContext context, ClassLoader webapploader) { Event evt = context.get(Event.class); switch (evt) { + case SPRING_BEAN_REGIST: case WEBCONTAINER_INIT: insertIntercepter(context, webapploader); break; diff --git a/com.creditease.uav.hook.redis/src/main/java/com/creditease/uav/hook/redis/jedis/JedisHookProxy.java b/com.creditease.uav.hook.redis/src/main/java/com/creditease/uav/hook/redis/jedis/JedisHookProxy.java index 22ea72d7..c9e7a8db 100644 --- a/com.creditease.uav.hook.redis/src/main/java/com/creditease/uav/hook/redis/jedis/JedisHookProxy.java +++ b/com.creditease.uav.hook.redis/src/main/java/com/creditease/uav/hook/redis/jedis/JedisHookProxy.java @@ -50,6 +50,7 @@ public void start(HookContext context, ClassLoader webapploader) { Event evt = context.get(Event.class); switch (evt) { + case SPRING_BEAN_REGIST: case WEBCONTAINER_INIT: insertIntercepter(context, webapploader); break; @@ -90,6 +91,10 @@ public void stop(HookContext context, ClassLoader webapploader) { protected void insertIntercepter(HookContext context, ClassLoader webapploader) { + if (isHookEventDone("insertIntercepter")) { + return; + } + InterceptContext ic = (InterceptContext) context.get(HookConstants.INTERCEPTCONTEXT); String contextPath = (String) ic.get(InterceptConstants.CONTEXTPATH); diff --git a/com.creditease.uav.hook.redis/src/main/java/com/creditease/uav/hook/redis/lettuce/LettuceHookProxy.java b/com.creditease.uav.hook.redis/src/main/java/com/creditease/uav/hook/redis/lettuce/LettuceHookProxy.java index 77044e8b..0f5941b7 100644 --- a/com.creditease.uav.hook.redis/src/main/java/com/creditease/uav/hook/redis/lettuce/LettuceHookProxy.java +++ b/com.creditease.uav.hook.redis/src/main/java/com/creditease/uav/hook/redis/lettuce/LettuceHookProxy.java @@ -46,6 +46,10 @@ public LettuceHookProxy(String id, @SuppressWarnings("rawtypes") Map config) { protected void insertIntercepter(HookContext context, ClassLoader webapploader) { + if (isHookEventDone("insertIntercepter")) { + return; + } + InterceptContext ic = (InterceptContext) context.get(HookConstants.INTERCEPTCONTEXT); String contextPath = (String) ic.get(InterceptConstants.CONTEXTPATH); @@ -94,6 +98,7 @@ public void start(HookContext context, ClassLoader webapploader) { Event evt = context.get(Event.class); switch (evt) { + case SPRING_BEAN_REGIST: case WEBCONTAINER_INIT: insertIntercepter(context, webapploader); break; diff --git a/com.creditease.uav.monitorframework.agent/src/main/java/com/creditease/uav/monitorframework/adaptors/SpringBootTomcatAdaptor.java b/com.creditease.uav.monitorframework.agent/src/main/java/com/creditease/uav/monitorframework/adaptors/SpringBootTomcatAdaptor.java index 695c3b73..2a6632de 100644 --- a/com.creditease.uav.monitorframework.agent/src/main/java/com/creditease/uav/monitorframework/adaptors/SpringBootTomcatAdaptor.java +++ b/com.creditease.uav.monitorframework.agent/src/main/java/com/creditease/uav/monitorframework/adaptors/SpringBootTomcatAdaptor.java @@ -89,55 +89,22 @@ public byte[] onLoadClass(ClassLoader clsLoader, String uavMofRoot, String class final AbstractAdaptor aa = this; - /* - * Springboot's AutoConfig would load MongoClient before webContainer started, so the hook should be done in - * transform - */ - if ("com.mongodb.MongoClient".equals(className)) { - hookJarMap = getHookJarMap(); - - String jarFileLoc = hookJarMap.get("com.mongodb.Mongo"); - - try { - installHookJars(clsLoader, jarFileLoc, uavMofRoot); - } - catch (Exception e) { - e.printStackTrace(); - return null; - } - return this.inject(className, new String[] { "com.creditease.uav.hook.mongoclients.interceptors" }, - new AdaptorProcessor() { - - @Override - public void process(CtMethod m) throws Exception { - - aa.addLocalVar(m, "mObj", - "com.creditease.uav.hook.mongoclients.interceptors.MongoClientIT"); - m.insertAfter("{mObj=new MongoClientIT(\"" + getAppid() + "\");$_=mObj.doInstall($_);}"); - - } - - @Override - public String getMethodName() { - - return "getDatabase"; - } - - }); - - } - else if (className.equals("org.springframework.context.support.AbstractApplicationContext")) + if (className.equals("org.springframework.context.support.AbstractApplicationContext")) { return this.inject(className, new String[] { "com.creditease.tomcat.plus.interceptor" }, new AdaptorProcessor() { + /** + * we need startServer before ApplicationContext's refresh cause some hook operation could + * happen when refresh. + */ @Override public void process(CtMethod m) throws Exception { aa.addLocalVar(m, "mObj", "com.creditease.tomcat.plus.interceptor.SpringBootTomcatPlusIT"); m.insertBefore( - "{mObj=new SpringBootTomcatPlusIT();mObj.setAppid(this.getEnvironment().getProperty(\"server.context-path\"));}"); + "{mObj=new SpringBootTomcatPlusIT();mObj.startServer(this.getEnvironment().getProperty(\"server.port\"),this.getEnvironment().getProperty(\"server.context-path\"));}"); } @Override @@ -148,28 +115,7 @@ public String getMethodName() { }); } - else if (className.equals("org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainer")) { - - return this.inject(className, new String[] { "com.creditease.tomcat.plus.interceptor" }, - new AdaptorProcessor() { - - @Override - public void process(CtMethod m) throws Exception { - - aa.addLocalVar(m, "mObj", "com.creditease.tomcat.plus.interceptor.SpringBootTomcatPlusIT"); - m.insertBefore( - "{mObj=new SpringBootTomcatPlusIT();mObj.startServer(this.tomcat.getService().findConnectors()[0].getPort());}"); - } - - @Override - public String getMethodName() { - - return "initialize"; - } - }); - - } else if (className.equals("org.apache.catalina.core.StandardEngineValve")) { return this.inject(className, new String[] { "com.creditease.tomcat.plus.interceptor" }, new AdaptorProcessor() { @@ -339,15 +285,43 @@ public void process(CtMethod m) throws Exception { } }); } + else if (className.equals("org.springframework.boot.context.embedded.EmbeddedWebApplicationContext")) { + return this.inject(className, new String[] { "com.creditease.tomcat.plus.interceptor" }, + new AdaptorProcessor[] { new AdaptorProcessor() { - return null; - } + @Override + public String getMethodName() { - private String getAppid() { + return "finishRefresh"; + } + + @Override + public void process(CtMethod m) throws Exception { - return System.getProperty("com.creditease.uav.springboot.appid") == null ? "" - : System.getProperty("com.creditease.uav.springboot.appid"); + aa.addLocalVar(m, "mObj", "com.creditease.tomcat.plus.interceptor.SpringBootTomcatPlusIT"); + m.insertAfter("{mObj=new SpringBootTomcatPlusIT();mObj.onSpringFinishRefresh();}"); + } + + }, new AdaptorProcessor() { + @Override + public String getMethodName() { + + return "postProcessBeanFactory"; + } + + @Override + public void process(CtMethod m) throws Exception { + + aa.addLocalVar(m, "mObj", "com.creditease.tomcat.plus.interceptor.SpringBootTomcatPlusIT"); + m.insertBefore( + "{mObj=new SpringBootTomcatPlusIT();mObj.onSpringBeanRegist(this.getEnvironment().getProperty(\"server.context-path\"));}"); + } + + } }); + } + + return null; } } diff --git a/com.creditease.uav.monitorframework.dproxy/src/main/java/com/creditease/uav/monitorframework/webservice/listeners/WebServiceListener.java b/com.creditease.uav.monitorframework.dproxy/src/main/java/com/creditease/uav/monitorframework/webservice/listeners/WebServiceListener.java index 6c76d4f8..9250c134 100644 --- a/com.creditease.uav.monitorframework.dproxy/src/main/java/com/creditease/uav/monitorframework/webservice/listeners/WebServiceListener.java +++ b/com.creditease.uav.monitorframework.dproxy/src/main/java/com/creditease/uav/monitorframework/webservice/listeners/WebServiceListener.java @@ -22,6 +22,8 @@ import java.util.List; +import com.creditease.monitor.UAVServer; +import com.creditease.monitor.captureframework.spi.CaptureConstants; import com.creditease.monitor.interceptframework.spi.InterceptConstants; import com.creditease.monitor.interceptframework.spi.InterceptContext; import com.creditease.monitor.interceptframework.spi.InterceptContext.Event; @@ -47,8 +49,14 @@ public WebServiceListener() { public boolean isEventListener(Event event) { switch (event) { - case WEBCONTAINER_INIT: + case SPRING_BEAN_REGIST: return true; + case WEBCONTAINER_INIT: + if (UAVServer.ServerVendor.SPRINGBOOT != UAVServer.instance() + .getServerInfo(CaptureConstants.INFO_APPSERVER_VENDOR)) { + return true; + } + break; case WEBCONTAINER_RESOURCE_CREATE: break; case AFTER_SERVET_INIT: @@ -119,8 +127,10 @@ public void handleEvent(InterceptContext context) { ClassLoader webapploader = (ClassLoader) context.get(InterceptConstants.WEBAPPLOADER); // switch event - Event evt = context.getEvent(); - switch (evt) { + Event event = context.getEvent(); + switch (event) { + case SPRING_BEAN_REGIST: + case WEBCONTAINER_INIT: insertWebServiceInterceptor(context, webapploader); break; diff --git a/com.creditease.uav.monitorframework.springbootFat/pom.xml b/com.creditease.uav.monitorframework.springbootFat/pom.xml index 820106cf..debc1ceb 100644 --- a/com.creditease.uav.monitorframework.springbootFat/pom.xml +++ b/com.creditease.uav.monitorframework.springbootFat/pom.xml @@ -8,7 +8,7 @@ com.example starter 0.0.1-SNAPSHOT - war + jar springbootStart @@ -16,6 +16,22 @@ org.springframework.boot spring-boot-starter-web + + + com.alibaba + dubbo + 2.5.3 + + + spring + org.springframework + + + commons-logging + commons-logging + + + junit @@ -101,6 +117,12 @@ com.creditease.moniter com.creditease.uav.cache.redis 1.0 + + + commons-logging + commons-logging + + biz.paluch.redis diff --git a/com.creditease.uav.monitorframework.springbootFat/src/main/java/com/creditease/monitorframework/fat/dubbo/IMyDubboService.java b/com.creditease.uav.monitorframework.springbootFat/src/main/java/com/creditease/monitorframework/fat/dubbo/IMyDubboService.java new file mode 100644 index 00000000..85b2d00f --- /dev/null +++ b/com.creditease.uav.monitorframework.springbootFat/src/main/java/com/creditease/monitorframework/fat/dubbo/IMyDubboService.java @@ -0,0 +1,32 @@ +/*- + * << + * UAVStack + * == + * Copyright (C) 2016 - 2017 UAVStack + * == + * Licensed 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 com.creditease.monitorframework.fat.dubbo; + +import java.io.IOException; + +public interface IMyDubboService { + + String sayHello(String name); + + String sayException(String name) throws IOException; + + String sayUncatchException(String name); +} diff --git a/com.creditease.uav.monitorframework.springbootFat/src/main/java/com/creditease/monitorframework/fat/dubbo/MyDubboService.java b/com.creditease.uav.monitorframework.springbootFat/src/main/java/com/creditease/monitorframework/fat/dubbo/MyDubboService.java new file mode 100644 index 00000000..5800bb5f --- /dev/null +++ b/com.creditease.uav.monitorframework.springbootFat/src/main/java/com/creditease/monitorframework/fat/dubbo/MyDubboService.java @@ -0,0 +1,48 @@ +/*- + * << + * UAVStack + * == + * Copyright (C) 2016 - 2017 UAVStack + * == + * Licensed 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 com.creditease.monitorframework.fat.dubbo; + +import java.io.IOException; + +public class MyDubboService implements IMyDubboService { + + @Override + public String sayHello(String name) { + + // TODO Auto-generated method stub + return name; + } + + @Override + public String sayException(String name) throws IOException { + + throw new IOException("专门测试用的异常"); + } + + @Override + public String sayUncatchException(String name) { + + String exceptionInt = "test"; + int num = Integer.parseInt(exceptionInt); + return name + num; + } + +} diff --git a/com.creditease.uav.monitorframework.springbootFat/src/main/java/com/creditease/uav/monitorframework/springbootFat/CxfConfig.java b/com.creditease.uav.monitorframework.springbootFat/src/main/java/com/creditease/uav/monitorframework/springbootFat/CxfConfig.java index 7f475f9d..e9297fb4 100644 --- a/com.creditease.uav.monitorframework.springbootFat/src/main/java/com/creditease/uav/monitorframework/springbootFat/CxfConfig.java +++ b/com.creditease.uav.monitorframework.springbootFat/src/main/java/com/creditease/uav/monitorframework/springbootFat/CxfConfig.java @@ -1,5 +1,9 @@ package com.creditease.uav.monitorframework.springbootFat; +import javax.xml.ws.Endpoint; + +import org.apache.cxf.bus.spring.SpringBus; +import org.apache.cxf.jaxws.EndpointImpl; import org.apache.cxf.transport.servlet.CXFServlet; import org.springframework.boot.web.servlet.ServletRegistrationBean; import org.springframework.context.annotation.Bean; @@ -13,24 +17,24 @@ public ServletRegistrationBean dispatcherCXFServlet() { return new ServletRegistrationBean(new CXFServlet(), "/soap/*"); } - // - // @Bean(name = SpringBus.DEFAULT_BUS_ID) - // public SpringBus springBus() { - // - // return new SpringBus(); - // } - // - // @Bean - // public UserService userService() { - // - // return new UserServiceImpl(); - // } - // - // @Bean - // public Endpoint endpoint() { - // - // EndpointImpl endpoint = new EndpointImpl(new SpringBus(), userService()); - // endpoint.publish("/user"); - // return endpoint; - // } + + @Bean(name = SpringBus.DEFAULT_BUS_ID) + public SpringBus springBus() { + + return new SpringBus(); + } + + @Bean + public UserService userService() { + + return new UserServiceImpl(); + } + + @Bean + public Endpoint endpoint() { + + EndpointImpl endpoint = new EndpointImpl(new SpringBus(), userService()); + endpoint.publish("/user"); + return endpoint; + } } \ No newline at end of file diff --git a/com.creditease.uav.monitorframework.springbootFat/src/main/java/config.xml b/com.creditease.uav.monitorframework.springbootFat/src/main/java/config.xml deleted file mode 100644 index f1de412f..00000000 --- a/com.creditease.uav.monitorframework.springbootFat/src/main/java/config.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - \ No newline at end of file diff --git a/com.creditease.uav.monitorframework.springbootFat/src/main/java/application.properties b/com.creditease.uav.monitorframework.springbootFat/src/main/resources/application.properties similarity index 100% rename from com.creditease.uav.monitorframework.springbootFat/src/main/java/application.properties rename to com.creditease.uav.monitorframework.springbootFat/src/main/resources/application.properties diff --git a/com.creditease.uav.monitorframework.springbootFat/src/main/resources/config.xml b/com.creditease.uav.monitorframework.springbootFat/src/main/resources/config.xml new file mode 100644 index 00000000..5a55ea03 --- /dev/null +++ b/com.creditease.uav.monitorframework.springbootFat/src/main/resources/config.xml @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/com.creditease.uav.monitorframework/src/main/java/com/creditease/monitor/appfra/hook/spi/HookProxy.java b/com.creditease.uav.monitorframework/src/main/java/com/creditease/monitor/appfra/hook/spi/HookProxy.java index 83dac2f0..8acb6636 100644 --- a/com.creditease.uav.monitorframework/src/main/java/com/creditease/monitor/appfra/hook/spi/HookProxy.java +++ b/com.creditease.uav.monitorframework/src/main/java/com/creditease/monitor/appfra/hook/spi/HookProxy.java @@ -21,6 +21,7 @@ package com.creditease.monitor.appfra.hook.spi; import java.util.Collections; +import java.util.HashMap; import java.util.Map; import com.creditease.uav.common.BaseComponent; @@ -30,6 +31,8 @@ public abstract class HookProxy extends BaseComponent { protected final String id; + protected Map isHookEventDone = new HashMap(); + protected final Map config; public HookProxy(String id, Map config) { @@ -82,4 +85,17 @@ public boolean isRun(HookContext context) { return false; } + + /** + * check if hook event is done + * + * @param event + * @return + */ + public boolean isHookEventDone(String event) { + + Boolean result = isHookEventDone.get(event); + isHookEventDone.put(event, true); + return (result == null) ? false : result; + } } diff --git a/com.creditease.uav.monitorframework/src/main/java/com/creditease/monitor/interceptframework/StandardInterceptContextHelper.java b/com.creditease.uav.monitorframework/src/main/java/com/creditease/monitor/interceptframework/StandardInterceptContextHelper.java index eee0ccff..c51a19cd 100644 --- a/com.creditease.uav.monitorframework/src/main/java/com/creditease/monitor/interceptframework/StandardInterceptContextHelper.java +++ b/com.creditease.uav.monitorframework/src/main/java/com/creditease/monitor/interceptframework/StandardInterceptContextHelper.java @@ -23,12 +23,13 @@ import java.util.Map; import java.util.concurrent.ConcurrentHashMap; +import com.alibaba.ttl.TransmittableThreadLocal; import com.creditease.monitor.interceptframework.spi.InterceptContext; import com.creditease.monitor.interceptframework.spi.InterceptContext.Event; public class StandardInterceptContextHelper { - private static ThreadLocal ThreadCaptureContextHelper = new ThreadLocal(); + private static TransmittableThreadLocal ThreadCaptureContextHelper = new TransmittableThreadLocal(); protected static InterceptContext getContext(Event event, boolean isCreateForNone) { diff --git a/com.creditease.uav.monitorframework/src/main/java/com/creditease/monitor/interceptframework/spi/InterceptContext.java b/com.creditease.uav.monitorframework/src/main/java/com/creditease/monitor/interceptframework/spi/InterceptContext.java index a4f1046d..197449cb 100644 --- a/com.creditease.uav.monitorframework/src/main/java/com/creditease/monitor/interceptframework/spi/InterceptContext.java +++ b/com.creditease.uav.monitorframework/src/main/java/com/creditease/monitor/interceptframework/spi/InterceptContext.java @@ -25,7 +25,7 @@ public interface InterceptContext { public enum Event { - WEBCONTAINER_RESOURCE_INIT, WEBCONTAINER_RESOURCE_CREATE, WEBCONTAINER_INIT, WEBCONTAINER_STARTED, WEBCONTAINER_STOPPED, AFTER_SERVET_INIT, BEFORE_SERVLET_DESTROY, GLOBAL_FILTER_REQUEST, GLOBAL_FILTER_RESPONSE + SPRING_BEAN_REGIST, WEBCONTAINER_RESOURCE_INIT, WEBCONTAINER_RESOURCE_CREATE, WEBCONTAINER_INIT, WEBCONTAINER_STARTED, WEBCONTAINER_STOPPED, AFTER_SERVET_INIT, BEFORE_SERVLET_DESTROY, GLOBAL_FILTER_REQUEST, GLOBAL_FILTER_RESPONSE } public T get(Class c); diff --git a/com.creditease.uav.monitorframework/src/main/java/com/creditease/uav/appserver/listeners/AppFrkHookFactoryListener.java b/com.creditease.uav.monitorframework/src/main/java/com/creditease/uav/appserver/listeners/AppFrkHookFactoryListener.java index 72adc56b..44137ec2 100644 --- a/com.creditease.uav.monitorframework/src/main/java/com/creditease/uav/appserver/listeners/AppFrkHookFactoryListener.java +++ b/com.creditease.uav.monitorframework/src/main/java/com/creditease/uav/appserver/listeners/AppFrkHookFactoryListener.java @@ -56,6 +56,7 @@ public void handleEvent(InterceptContext context) { Event evt = context.getEvent(); switch (evt) { + case SPRING_BEAN_REGIST: case WEBCONTAINER_RESOURCE_INIT: case WEBCONTAINER_RESOURCE_CREATE: case WEBCONTAINER_INIT: @@ -181,6 +182,8 @@ private void startAppFrkHook(Event evt, ClassLoader webapploader, InterceptConte public boolean isEventListener(Event event) { switch (event) { + case SPRING_BEAN_REGIST: + break; case WEBCONTAINER_INIT: break; case AFTER_SERVET_INIT: diff --git a/com.creditease.uav.tomcat.plus.core/src/main/java/com/creditease/tomcat/plus/interceptor/SpringBootTomcatPlusIT.java b/com.creditease.uav.tomcat.plus.core/src/main/java/com/creditease/tomcat/plus/interceptor/SpringBootTomcatPlusIT.java index 7a3bb44a..8b5a4337 100644 --- a/com.creditease.uav.tomcat.plus.core/src/main/java/com/creditease/tomcat/plus/interceptor/SpringBootTomcatPlusIT.java +++ b/com.creditease.uav.tomcat.plus.core/src/main/java/com/creditease/tomcat/plus/interceptor/SpringBootTomcatPlusIT.java @@ -27,6 +27,7 @@ import org.apache.catalina.core.StandardWrapper; import org.apache.catalina.loader.WebappClassLoader; +import com.creditease.agent.helpers.DataConvertHelper; import com.creditease.agent.helpers.ReflectHelper; import com.creditease.monitor.UAVServer; import com.creditease.monitor.captureframework.spi.CaptureConstants; @@ -35,22 +36,27 @@ import com.creditease.monitor.interceptframework.spi.InterceptContext; import com.creditease.monitor.interceptframework.spi.InterceptContext.Event; import com.creditease.tomcat.plus.util.TomcatLog; +import com.creditease.uav.util.MonitorServerUtil; public class SpringBootTomcatPlusIT extends TomcatPlusIT { /** * startUAVServer */ - public void startServer(int port) { + public void startServer(String port, String contextPath) { // integrate Tomcat log UAVServer.instance().setLog(new TomcatLog("MonitorServer")); // start Monitor Server when server starts UAVServer.instance().start(new Object[] { UAVServer.ServerVendor.SPRINGBOOT }); - + // set appid + setAppid(contextPath); // set the connector port - UAVServer.instance().putServerInfo(CaptureConstants.INFO_APPSERVER_LISTEN_PORT, port); - + UAVServer.instance().putServerInfo(CaptureConstants.INFO_APPSERVER_LISTEN_PORT, + DataConvertHelper.toInt(port, 8080)); + InterceptSupport iSupport = InterceptSupport.instance(); + // this context will be transmited from springboot mainThread to webcontainerInit thread then back to mainThread + iSupport.getThreadLocalContext(Event.WEBCONTAINER_STARTED); } /** @@ -67,7 +73,7 @@ else if (contextPath.indexOf("/") == 0) { contextPath = contextPath.substring(1); } - System.setProperty("com.creditease.uav.springboot.appid", contextPath); + System.setProperty("com.creditease.uav.appid", MonitorServerUtil.getApplicationId(contextPath, "")); } @@ -252,7 +258,7 @@ public void onAppStart(Object... args) { StandardContext sc = (StandardContext) args[0]; InterceptSupport iSupport = InterceptSupport.instance(); - InterceptContext context = iSupport.createInterceptContext(Event.WEBCONTAINER_STARTED); + InterceptContext context = iSupport.getThreadLocalContext(Event.WEBCONTAINER_STARTED); /** * NOTE: spring boot rewrite the tomcat webappclassloader, makes the addURL for nothing, then we can't do @@ -285,8 +291,9 @@ else if (basePath.lastIndexOf("/") == (basePath.length() - 1) } context.put(InterceptConstants.BASEPATH, basePath); + // we don't doIntercept here cause some pre-profile(like dubbo) not happen yet, profile will be done after + // finishRefresh - iSupport.doIntercept(context); } /** @@ -301,15 +308,14 @@ public void onAppStop(Object... args) { InterceptSupport iSupport = InterceptSupport.instance(); InterceptContext context = iSupport.createInterceptContext(Event.WEBCONTAINER_STOPPED); - /** - * NOTE: spring boot rewrite the tomcat webappclassloader, makes the addURL for nothing, then we can't do - * anything on this we may use its webappclassloader's parent as the classloader - */ - if (null == context || null == sc) { return; } - + + /** + * NOTE: spring boot rewrite the tomcat webappclassloader, makes the addURL for nothing, then we can't do + * anything on this we may use its webappclassloader's parent as the classloader + */ context.put(InterceptConstants.WEBAPPLOADER, sc.getLoader().getClassLoader().getParent()); context.put(InterceptConstants.WEBWORKDIR, sc.getWorkPath()); @@ -371,4 +377,30 @@ public void onServletStop(Object... args) { iSupport.doIntercept(context); } + /** + * springboot load beans before web container start, hook opr should be done before beanRegist in case of duplicate + * definition ,so we define SPRING_BEAN_REGIST event to trigger hook + */ + public void onSpringBeanRegist(String contextPath) { + + InterceptSupport iSupport = InterceptSupport.instance(); + InterceptContext context = iSupport.createInterceptContext(Event.SPRING_BEAN_REGIST); + context.put(InterceptConstants.WEBAPPLOADER, Thread.currentThread().getContextClassLoader()); + context.put(InterceptConstants.CONTEXTPATH, contextPath); + context.put(InterceptConstants.BASEPATH, ""); + iSupport.doIntercept(context); + } + + /** + * ComponentProfile will be done after springboot finish it's context's refresh, cause every pre-profile(like dubbo) + * is ready. + * + */ + public void onSpringFinishRefresh() { + + InterceptSupport iSupport = InterceptSupport.instance(); + InterceptContext context = iSupport.getThreadLocalContext(Event.WEBCONTAINER_STARTED); + + iSupport.doIntercept(context); + } } diff --git a/com.creditease.uav.tomcat.plus.core/src/main/java/com/creditease/tomcat/plus/interceptor/TomcatPlusIT.java b/com.creditease.uav.tomcat.plus.core/src/main/java/com/creditease/tomcat/plus/interceptor/TomcatPlusIT.java index 09d63857..22ca29ca 100644 --- a/com.creditease.uav.tomcat.plus.core/src/main/java/com/creditease/tomcat/plus/interceptor/TomcatPlusIT.java +++ b/com.creditease.uav.tomcat.plus.core/src/main/java/com/creditease/tomcat/plus/interceptor/TomcatPlusIT.java @@ -448,7 +448,7 @@ public void onServletStop(Object... args) { @SuppressWarnings("unused") public void onDeployUAVApp(Object... args) { - if (System.getProperty("com.creditease.uav.iapp.install") != null) { + if (System.getProperty("com.creditease.uav.iapp.install") != null) { return; } @@ -485,7 +485,7 @@ else if (curVersion.equals("7") && versions[1].equals("0") ReflectHelper.invoke("org.apache.catalina.startup.HostConfig", hc, "deployDirectory", new Class[] { String.class, File.class, String.class }, - new Object[] { "com.creditease.uav", dir, mofRoot + "/com.creditease.uav" }, + new Object[] { "/com.creditease.uav", dir, mofRoot + "/com.creditease.uav" }, hc.getClass().getClassLoader()); break; case 1: