增加RestDyncListener功能
This commit is contained in:
@@ -116,7 +116,7 @@
|
||||
|
||||
<!--
|
||||
Application启动的监听事件,可配置多个节点
|
||||
value: 类名,必须是ApplicationListener的子类
|
||||
value: 类名,必须是ApplicationListener或RestDyncListener的子类
|
||||
-->
|
||||
<listener value="org.redkalex.xxx.XXXApplicationListener"/>
|
||||
|
||||
|
||||
@@ -27,7 +27,7 @@ import org.redkale.convert.bson.BsonFactory;
|
||||
import org.redkale.convert.json.*;
|
||||
import org.redkale.mq.*;
|
||||
import org.redkale.net.*;
|
||||
import org.redkale.net.http.MimeType;
|
||||
import org.redkale.net.http.*;
|
||||
import org.redkale.net.sncp.*;
|
||||
import org.redkale.service.Service;
|
||||
import org.redkale.source.*;
|
||||
@@ -175,6 +175,8 @@ public final class Application {
|
||||
//监听事件
|
||||
private final List<ApplicationListener> listeners = new CopyOnWriteArrayList<>();
|
||||
|
||||
final List<RestDyncListener> restListeners = new CopyOnWriteArrayList<>();
|
||||
|
||||
//服务启动时间
|
||||
private final long startTime = System.currentTimeMillis();
|
||||
|
||||
@@ -733,6 +735,11 @@ public final class Application {
|
||||
final String listenClass = conf.getValue("value", "");
|
||||
if (listenClass.isEmpty()) continue;
|
||||
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;
|
||||
@SuppressWarnings("unchecked")
|
||||
ApplicationListener listener = (ApplicationListener) clazz.getDeclaredConstructor().newInstance();
|
||||
|
||||
@@ -284,7 +284,7 @@ public class NodeHttpServer extends NodeServer {
|
||||
}
|
||||
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
|
||||
String prefix2 = prefix;
|
||||
WebServlet ws = servlet.getClass().getAnnotation(WebServlet.class);
|
||||
|
||||
@@ -238,11 +238,12 @@ public class HttpServer extends Server<String, HttpContext, HttpRequest, HttpRes
|
||||
* @param userType 用户数据类型
|
||||
* @param baseServletType RestServlet基类
|
||||
* @param prefix url前缀
|
||||
* @param listeners RestDyncListener列表
|
||||
*
|
||||
* @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) {
|
||||
return addRestServlet(classLoader, null, service, userType, baseServletType, 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, listeners);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -256,11 +257,13 @@ public class HttpServer extends Server<String, HttpContext, HttpRequest, HttpRes
|
||||
* @param userType 用户数据类型
|
||||
* @param baseServletType RestServlet基类
|
||||
* @param prefix url前缀
|
||||
* @param listeners RestDyncListener列表
|
||||
*
|
||||
* @return RestServlet
|
||||
*/
|
||||
@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;
|
||||
final boolean sncp = Sncp.isSncpDyn(service);
|
||||
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;
|
||||
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
|
||||
try { //若提供动态变更Service服务功能,则改Rest服务无法做出相应更新
|
||||
Field field = servlet.getClass().getDeclaredField(Rest.REST_SERVICE_FIELD_NAME);
|
||||
|
||||
@@ -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 (!HttpServlet.class.isAssignableFrom(baseServletType)) throw new RuntimeException(baseServletType + " is not HttpServlet Class on createRestServlet");
|
||||
int mod = baseServletType.getModifiers();
|
||||
@@ -1158,7 +1159,7 @@ public final class Rest {
|
||||
}
|
||||
} 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});
|
||||
}
|
||||
|
||||
@@ -1949,6 +1950,11 @@ public final class Rest {
|
||||
cw2.visitEnd();
|
||||
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
|
||||
|
||||
// HashMap<String, InnerActionEntry> _createRestInnerActionEntry() {
|
||||
|
||||
25
src/org/redkale/net/http/RestDyncListener.java
Normal file
25
src/org/redkale/net/http/RestDyncListener.java
Normal 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);
|
||||
}
|
||||
Reference in New Issue
Block a user