增加RestDyncListener功能

This commit is contained in:
Redkale
2020-09-17 15:33:39 +08:00
parent 788f7d5eb1
commit 5921cf5f0d
8 changed files with 54 additions and 13 deletions

View File

@@ -116,7 +116,7 @@
<!-- <!--
Application启动的监听事件,可配置多个节点 Application启动的监听事件,可配置多个节点
value: 类名必须是ApplicationListener的子类 value: 类名必须是ApplicationListener或RestDyncListener的子类
--> -->
<listener value="org.redkalex.xxx.XXXApplicationListener"/> <listener value="org.redkalex.xxx.XXXApplicationListener"/>

View File

@@ -27,7 +27,7 @@ import org.redkale.convert.bson.BsonFactory;
import org.redkale.convert.json.*; import org.redkale.convert.json.*;
import org.redkale.mq.*; import org.redkale.mq.*;
import org.redkale.net.*; import org.redkale.net.*;
import org.redkale.net.http.MimeType; import org.redkale.net.http.*;
import org.redkale.net.sncp.*; import org.redkale.net.sncp.*;
import org.redkale.service.Service; import org.redkale.service.Service;
import org.redkale.source.*; import org.redkale.source.*;
@@ -175,6 +175,8 @@ public final class Application {
//监听事件 //监听事件
private final List<ApplicationListener> listeners = new CopyOnWriteArrayList<>(); private final List<ApplicationListener> listeners = new CopyOnWriteArrayList<>();
final List<RestDyncListener> restListeners = new CopyOnWriteArrayList<>();
//服务启动时间 //服务启动时间
private final long startTime = System.currentTimeMillis(); private final long startTime = System.currentTimeMillis();
@@ -733,6 +735,11 @@ public final class Application {
final String listenClass = conf.getValue("value", ""); final String listenClass = conf.getValue("value", "");
if (listenClass.isEmpty()) continue; if (listenClass.isEmpty()) continue;
Class clazz = classLoader.loadClass(listenClass); Class clazz = classLoader.loadClass(listenClass);
if (RestDyncListener.class.isAssignableFrom(clazz)) {
RestDyncListener listener = (RestDyncListener) clazz.getDeclaredConstructor().newInstance();
this.restListeners.add(listener);
continue;
}
if (!ApplicationListener.class.isAssignableFrom(clazz)) continue; if (!ApplicationListener.class.isAssignableFrom(clazz)) continue;
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
ApplicationListener listener = (ApplicationListener) clazz.getDeclaredConstructor().newInstance(); ApplicationListener listener = (ApplicationListener) clazz.getDeclaredConstructor().newInstance();

View File

@@ -284,7 +284,7 @@ public class NodeHttpServer extends NodeServer {
} }
restedObjects.add(service); //避免重复创建Rest对象 restedObjects.add(service); //避免重复创建Rest对象
} }
HttpServlet servlet = httpServer.addRestServlet(serverClassLoader, service, userType, baseServletType, prefix); HttpServlet servlet = httpServer.addRestServlet(serverClassLoader, service, userType, baseServletType, prefix, application.restListeners);
if (servlet == null) return; //没有HttpMapping方法的HttpServlet调用Rest.createRestServlet就会返回null if (servlet == null) return; //没有HttpMapping方法的HttpServlet调用Rest.createRestServlet就会返回null
String prefix2 = prefix; String prefix2 = prefix;
WebServlet ws = servlet.getClass().getAnnotation(WebServlet.class); WebServlet ws = servlet.getClass().getAnnotation(WebServlet.class);

View File

@@ -238,11 +238,12 @@ public class HttpServer extends Server<String, HttpContext, HttpRequest, HttpRes
* @param userType 用户数据类型 * @param userType 用户数据类型
* @param baseServletType RestServlet基类 * @param baseServletType RestServlet基类
* @param prefix url前缀 * @param prefix url前缀
* @param listeners RestDyncListener列表
* *
* @return RestServlet * @return RestServlet
*/ */
public <S extends Service, T extends HttpServlet> T addRestServlet(final ClassLoader classLoader, final S service, final Class userType, final Class<T> baseServletType, final String prefix) { public <S extends Service, T extends HttpServlet> T addRestServlet(final ClassLoader classLoader, final S service, final Class userType, final Class<T> baseServletType, final String prefix, final List<RestDyncListener> listeners) {
return addRestServlet(classLoader, null, service, userType, baseServletType, prefix); return addRestServlet(classLoader, null, service, userType, baseServletType, prefix, listeners);
} }
/** /**
@@ -256,11 +257,13 @@ public class HttpServer extends Server<String, HttpContext, HttpRequest, HttpRes
* @param userType 用户数据类型 * @param userType 用户数据类型
* @param baseServletType RestServlet基类 * @param baseServletType RestServlet基类
* @param prefix url前缀 * @param prefix url前缀
* @param listeners RestDyncListener列表
* *
* @return RestServlet * @return RestServlet
*/ */
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public <S extends Service, T extends HttpServlet> T addRestServlet(final ClassLoader classLoader, final String name, final S service, final Class userType, final Class<T> baseServletType, final String prefix) { public <S extends Service, T extends HttpServlet> T addRestServlet(final ClassLoader classLoader, final String name, final S service,
final Class userType, final Class<T> baseServletType, final String prefix, final List<RestDyncListener> listeners) {
T servlet = null; T servlet = null;
final boolean sncp = Sncp.isSncpDyn(service); final boolean sncp = Sncp.isSncpDyn(service);
final String resname = name == null ? (sncp ? Sncp.getResourceName(service) : "") : name; final String resname = name == null ? (sncp ? Sncp.getResourceName(service) : "") : name;
@@ -281,7 +284,7 @@ public class HttpServer extends Server<String, HttpContext, HttpRequest, HttpRes
} }
} }
final boolean first = servlet == null; final boolean first = servlet == null;
if (servlet == null) servlet = Rest.createRestServlet(classLoader, userType, baseServletType, serviceType); if (servlet == null) servlet = Rest.createRestServlet(classLoader, userType, baseServletType, serviceType, listeners);
if (servlet == null) return null; //没有HttpMapping方法的HttpServlet调用Rest.createRestServlet就会返回null if (servlet == null) return null; //没有HttpMapping方法的HttpServlet调用Rest.createRestServlet就会返回null
try { //若提供动态变更Service服务功能则改Rest服务无法做出相应更新 try { //若提供动态变更Service服务功能则改Rest服务无法做出相应更新
Field field = servlet.getClass().getDeclaredField(Rest.REST_SERVICE_FIELD_NAME); Field field = servlet.getClass().getDeclaredField(Rest.REST_SERVICE_FIELD_NAME);

View File

@@ -741,7 +741,8 @@ public final class Rest {
} }
} }
public static <T extends HttpServlet> T createRestServlet(final ClassLoader classLoader, final Class userType0, final Class<T> baseServletType, final Class<? extends Service> serviceType) { public static <T extends HttpServlet> T createRestServlet(final ClassLoader classLoader, final Class userType0, final Class<T> baseServletType,
final Class<? extends Service> serviceType, final List<RestDyncListener> listeners) {
if (baseServletType == null || serviceType == null) throw new RuntimeException(" Servlet or Service is null Class on createRestServlet"); if (baseServletType == null || serviceType == null) throw new RuntimeException(" Servlet or Service is null Class on createRestServlet");
if (!HttpServlet.class.isAssignableFrom(baseServletType)) throw new RuntimeException(baseServletType + " is not HttpServlet Class on createRestServlet"); if (!HttpServlet.class.isAssignableFrom(baseServletType)) throw new RuntimeException(baseServletType + " is not HttpServlet Class on createRestServlet");
int mod = baseServletType.getModifiers(); int mod = baseServletType.getModifiers();
@@ -1158,7 +1159,7 @@ public final class Rest {
} }
} while ((loop = loop.getSuperclass()) != Object.class); } while ((loop = loop.getSuperclass()) != Object.class);
} }
java.lang.reflect.Type paramtype = TypeToken.getGenericType( param.getParameterizedType(),serviceType); java.lang.reflect.Type paramtype = TypeToken.getGenericType(param.getParameterizedType(), serviceType);
paramlist.add(new Object[]{param, n, ptype, radix, comment, required, annpara, annsid, annaddr, annhead, anncookie, annbody, annfile, annuri, userid, annheaders, paramtype}); paramlist.add(new Object[]{param, n, ptype, radix, comment, required, annpara, annsid, annaddr, annhead, anncookie, annbody, annfile, annuri, userid, annheaders, paramtype});
} }
@@ -1949,6 +1950,11 @@ public final class Rest {
cw2.visitEnd(); cw2.visitEnd();
newLoader.addClass((newDynName + "$" + entry.newActionClassName).replace('/', '.'), cw2.toByteArray()); newLoader.addClass((newDynName + "$" + entry.newActionClassName).replace('/', '.'), cw2.toByteArray());
} }
if (listeners != null && !listeners.isEmpty()) {
for (RestDyncListener listener : listeners) {
listener.invoke(classLoader, userType, serviceType, method);
}
}
} // end for each } // end for each
// HashMap<String, InnerActionEntry> _createRestInnerActionEntry() { // HashMap<String, InnerActionEntry> _createRestInnerActionEntry() {

View File

@@ -0,0 +1,25 @@
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package org.redkale.net.http;
import java.lang.reflect.Method;
import org.redkale.service.Service;
/**
* Application进程启动后动态创建RestServlet时调用 <br>
* 只能通过application.xml配置
*
* <p>
* 详情见: https://redkale.org
*
* @author zhangjx
* @since 2.2.0
*/
public interface RestDyncListener {
public void invoke(final ClassLoader classLoader, final Class baseServletType,
final Class<? extends Service> serviceType, final Method method);
}

View File

@@ -23,8 +23,8 @@ public class _DynHelloRestServlet1 extends SimpleRestServlet {
HelloService service = new HelloService(); HelloService service = new HelloService();
HttpServer server = new HttpServer(); HttpServer server = new HttpServer();
System.out.println(server.addRestServlet(null, service, null, SimpleRestServlet.class, "/pipes")); System.out.println(server.addRestServlet(null, service, null, SimpleRestServlet.class, "/pipes", null));
System.out.println(server.addRestServlet(null, new HelloService(3), null, SimpleRestServlet.class, "/pipes")); System.out.println(server.addRestServlet(null, new HelloService(3), null, SimpleRestServlet.class, "/pipes", null));
DefaultAnyValue conf = DefaultAnyValue.create("port", "" + port); DefaultAnyValue conf = DefaultAnyValue.create("port", "" + port);
server.init(conf); server.init(conf);

View File

@@ -73,7 +73,7 @@ public class ABMainService implements Service {
HttpServer server = new HttpServer(); HttpServer server = new HttpServer();
server.getLogger().setLevel(Level.WARNING); server.getLogger().setLevel(Level.WARNING);
server.addRestServlet(null, service, null, HttpServlet.class, "/pipes"); server.addRestServlet(null, service, null, HttpServlet.class, "/pipes", null);
resFactory.inject(cservice); resFactory.inject(cservice);
resFactory.inject(bcservice); resFactory.inject(bcservice);
@@ -114,7 +114,7 @@ public class ABMainService implements Service {
HttpServer server = new HttpServer(); HttpServer server = new HttpServer();
server.getLogger().setLevel(Level.WARNING); server.getLogger().setLevel(Level.WARNING);
server.addRestServlet(null, service, null, HttpServlet.class, "/pipes"); server.addRestServlet(null, service, null, HttpServlet.class, "/pipes", null);
server.init(DefaultAnyValue.create("port", "" + abport)); server.init(DefaultAnyValue.create("port", "" + abport));
server.start(); server.start();