diff --git a/src/META-INF/application-template.xml b/src/META-INF/application-template.xml index cc0549ef9..16a7cb812 100644 --- a/src/META-INF/application-template.xml +++ b/src/META-INF/application-template.xml @@ -135,6 +135,7 @@ @@ -153,7 +154,12 @@ excludes: 当autoload="true", 排除类名与excludes中的正则表达式匹配的类, 多个正则表达式用分号;隔开 --> - + + @@ -247,7 +253,11 @@ excludes: 当autoload="true", 排除类名与excludes中的正则表达式匹配的类, 多个正则表达式用分号;隔开 --> - + diff --git a/src/org/redkale/boot/NodeServer.java b/src/org/redkale/boot/NodeServer.java index ccc600b2e..8a8c1d723 100644 --- a/src/org/redkale/boot/NodeServer.java +++ b/src/org/redkale/boot/NodeServer.java @@ -450,62 +450,6 @@ public abstract class NodeServer { maxClassNameLength = Math.max(maxClassNameLength, Sncp.getResourceType(y).getName().length() + 1); } - /* - * protected List loadTransports(final HashSet groups) { - * if (groups == null) return null; - * final List transports = new ArrayList<>(); - * for (String group : groups) { - * if (this.sncpGroup == null || !this.sncpGroup.equals(group)) { - * transports.add(loadTransport(group)); - * } - * } - * return transports; - * } - * protected Transport loadTransport(final HashSet groups) { - * if (groups == null || groups.isEmpty()) return null; - * final String groupid = new ArrayList<>(groups).stream().sorted().collect(Collectors.joining(";")); //按字母排列顺序 - * Transport transport = application.resourceFactory.find(groupid, Transport.class); - * if (transport != null) return transport; - * final List transports = new ArrayList<>(); - * for (String group : groups) { - * transports.add(loadTransport(group)); - * } - * Set addrs = new HashSet(); - * transports.forEach(t -> addrs.addAll(Arrays.asList(t.getRemoteAddresses()))); - * Transport first = transports.get(0); - * TransportGroupInfo ginfo = application.transportFactory.findGroupInfo(first.getName()); - * Transport newTransport = new Transport(groupid, ginfo.getProtocol(), - * ginfo.getSubprotocol(), application.transportBufferPool, application.transportChannelGroup, this.sncpAddress, addrs); - * synchronized (application.resourceFactory) { - * transport = application.resourceFactory.find(groupid, Transport.class); - * if (transport == null) { - * transport = newTransport; - * application.resourceFactory.register(groupid, transport); - * } - * } - * return transport; - * } - * - * protected Transport loadTransport(final String group) { - * if (group == null) return null; - * Transport transport; - * synchronized (application.resourceFactory) { - * transport = application.resourceFactory.find(group, Transport.class); - * if (transport != null) { - * if (this.sncpAddress != null && !this.sncpAddress.equals(transport.getClientAddress())) { - * throw new RuntimeException(transport + "repeat create on newClientAddress = " + this.sncpAddress + ", oldClientAddress = " + transport.getClientAddress()); - * } - * return transport; - * } - * TransportGroupInfo ginfo = application.findGroupInfo(group); - * Set addrs = ginfo.copyAddresses(); - * if (addrs == null) throw new RuntimeException("Not found = " + group + " on "); - * transport = new Transport(group, ginfo.getProtocol(), ginfo.getSubprotocol(), application.transportBufferPool, application.transportChannelGroup, this.sncpAddress, addrs); - * application.resourceFactory.register(group, transport); - * } - * return transport; - * } - */ protected abstract ClassFilter createFilterClassFilter(); protected abstract ClassFilter createServletClassFilter(); @@ -571,7 +515,9 @@ public abstract class NodeServer { dav.addValue("properties", ps); av = dav; } - filter.filter(av, av.getValue("value"), false); + if (!av.getBoolValue("ignore", false)) { + filter.filter(av, av.getValue("value"), false); + } } if (list.getBoolValue("autoload", true)) { String includes = list.getValue("includes", ""); diff --git a/src/org/redkale/boot/watch/AbstractWatchService.java b/src/org/redkale/boot/watch/AbstractWatchService.java new file mode 100644 index 000000000..05ab2bd80 --- /dev/null +++ b/src/org/redkale/boot/watch/AbstractWatchService.java @@ -0,0 +1,17 @@ +/* + * 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.boot.watch; + +import org.redkale.service.AbstractService; +import org.redkale.watch.WatchService; + +/** + * + * @author zhangjx + */ +public abstract class AbstractWatchService extends AbstractService implements WatchService { + +} diff --git a/src/org/redkale/boot/watch/FilterWatchService.java b/src/org/redkale/boot/watch/FilterWatchService.java index 88fbf4a65..a4e062216 100644 --- a/src/org/redkale/boot/watch/FilterWatchService.java +++ b/src/org/redkale/boot/watch/FilterWatchService.java @@ -5,14 +5,40 @@ */ package org.redkale.boot.watch; -import org.redkale.net.http.RestService; -import org.redkale.watch.WatchService; +import java.io.IOException; +import javax.annotation.Resource; +import org.redkale.boot.Application; +import org.redkale.net.TransportFactory; +import org.redkale.net.http.*; +import org.redkale.service.RetResult; +import org.redkale.util.Comment; /** * * @author zhangjx */ @RestService(name = "filter", catalog = "watch", repair = false) -public class FilterWatchService implements WatchService { - +public class FilterWatchService extends AbstractWatchService { + + @Comment("不存在的Group节点") + public static final int RET_NO_GROUP = 1601_0001; + + @Comment("Filter类名不存在") + public static final int RET_FILTER_TYPE_ILLEGAL = 1601_0002; + + @Comment("Node节点IP地址已存在") + public static final int RET_FILTER_EXISTS = 1601_0003; + + @Resource + private Application application; + + @Resource + private TransportFactory transportFactory; + + @RestMapping(name = "addfilter", auth = false, comment = "动态增加Filter") + public RetResult addFilter(@RestParam(name = "server", comment = "Server节点名, 不指定名称则所有符合条件的Server都会增加Filter") final String serverName, + @RestParam(name = "type", comment = "Filter类名") final String filterType) throws IOException { + if (filterType == null) return new RetResult(RET_FILTER_TYPE_ILLEGAL, "Filter Type (" + filterType + ") is illegal"); + return RetResult.success(); + } } diff --git a/src/org/redkale/boot/watch/ServerWatchService.java b/src/org/redkale/boot/watch/ServerWatchService.java index b2580e316..70a21ea7d 100644 --- a/src/org/redkale/boot/watch/ServerWatchService.java +++ b/src/org/redkale/boot/watch/ServerWatchService.java @@ -6,13 +6,12 @@ package org.redkale.boot.watch; import org.redkale.net.http.RestService; -import org.redkale.watch.WatchService; /** * * @author zhangjx */ @RestService(name = "server", catalog = "watch", repair = false) -public class ServerWatchService implements WatchService { +public class ServerWatchService extends AbstractWatchService { } diff --git a/src/org/redkale/boot/watch/ServiceWatchService.java b/src/org/redkale/boot/watch/ServiceWatchService.java index a079b1e9c..45886dcc4 100644 --- a/src/org/redkale/boot/watch/ServiceWatchService.java +++ b/src/org/redkale/boot/watch/ServiceWatchService.java @@ -9,7 +9,6 @@ import javax.annotation.Resource; import org.redkale.boot.Application; import org.redkale.net.TransportFactory; import org.redkale.net.http.*; -import org.redkale.watch.WatchService; /** *

@@ -18,7 +17,7 @@ import org.redkale.watch.WatchService; * @author zhangjx */ @RestService(name = "service", catalog = "watch", repair = false) -public class ServiceWatchService implements WatchService { +public class ServiceWatchService extends AbstractWatchService { @Resource private Application application; diff --git a/src/org/redkale/boot/watch/ServletWatchService.java b/src/org/redkale/boot/watch/ServletWatchService.java index 805e94d06..6d787c503 100644 --- a/src/org/redkale/boot/watch/ServletWatchService.java +++ b/src/org/redkale/boot/watch/ServletWatchService.java @@ -9,7 +9,6 @@ import javax.annotation.Resource; import org.redkale.boot.Application; import org.redkale.net.TransportFactory; import org.redkale.net.http.*; -import org.redkale.watch.WatchService; /** *

@@ -18,7 +17,7 @@ import org.redkale.watch.WatchService; * @author zhangjx */ @RestService(name = "servlet", catalog = "watch", repair = false) -public class ServletWatchService implements WatchService { +public class ServletWatchService extends AbstractWatchService { @Resource private Application application; diff --git a/src/org/redkale/boot/watch/SourceWatchService.java b/src/org/redkale/boot/watch/SourceWatchService.java new file mode 100644 index 000000000..bc3cba427 --- /dev/null +++ b/src/org/redkale/boot/watch/SourceWatchService.java @@ -0,0 +1,26 @@ +/* + * 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.boot.watch; + +import javax.annotation.Resource; +import org.redkale.boot.Application; +import org.redkale.net.TransportFactory; +import org.redkale.net.http.RestService; + +/** + * + * @author zhangjx + */ +@RestService(name = "source", catalog = "watch", repair = false) +public class SourceWatchService extends AbstractWatchService { + + @Resource + private Application application; + + @Resource + private TransportFactory transportFactory; + +} diff --git a/src/org/redkale/boot/watch/TransportWatchService.java b/src/org/redkale/boot/watch/TransportWatchService.java index 0679115a4..9d8ad41b7 100644 --- a/src/org/redkale/boot/watch/TransportWatchService.java +++ b/src/org/redkale/boot/watch/TransportWatchService.java @@ -18,23 +18,22 @@ import org.redkale.net.sncp.*; import org.redkale.service.*; import org.redkale.util.*; import org.redkale.util.AnyValue.DefaultAnyValue; -import org.redkale.watch.WatchService; /** * * @author zhangjx */ @RestService(name = "transport", catalog = "watch", repair = false) -public class TransportWatchService implements WatchService { +public class TransportWatchService extends AbstractWatchService { @Comment("不存在的Group节点") - public static final int RET_NO_GROUP = 1605_0001; + public static final int RET_NO_GROUP = 1606_0001; @Comment("非法的Node节点IP地址") - public static final int RET_ADDR_ILLEGAL = 1605_0002; + public static final int RET_ADDR_ILLEGAL = 1606_0002; @Comment("Node节点IP地址已存在") - public static final int RET_ADDR_EXISTS = 1605_0003; + public static final int RET_ADDR_EXISTS = 1606_0003; @Resource private Application application; diff --git a/src/org/redkale/net/PrepareServlet.java b/src/org/redkale/net/PrepareServlet.java index 3af7effa1..b0bca86c9 100644 --- a/src/org/redkale/net/PrepareServlet.java +++ b/src/org/redkale/net/PrepareServlet.java @@ -63,6 +63,15 @@ public abstract class PrepareServlet servletClass) { + synchronized (lock1) { + for (S servlet : new HashSet<>(servlets)) { + if (servlet.getClass().equals(servletClass)) return true; + } + return false; + } + } + protected void putMapping(K key, S servlet) { synchronized (lock2) { Map newmappings = new HashMap<>(mappings); @@ -139,6 +148,15 @@ public abstract class PrepareServlet filterClass.equals(f.getClass())); } + public boolean containsFilter(Class> filterClass) { + if (this.headFilter == null || filterClass == null) return false; + Filter filter = this.headFilter; + do { + if (filter.getClass().equals(filterClass)) return true; + } while ((filter = filter._next) != null); + return false; + } + public Filter removeFilter(Predicate> predicate) { if (this.headFilter == null || predicate == null) return null; synchronized (filters) { diff --git a/src/org/redkale/net/http/HttpServer.java b/src/org/redkale/net/http/HttpServer.java index 7a26b4f57..dd4851602 100644 --- a/src/org/redkale/net/http/HttpServer.java +++ b/src/org/redkale/net/http/HttpServer.java @@ -104,6 +104,18 @@ public class HttpServer extends Server 泛型 + * @param filterClass HttpFilter类 + * + * @return boolean + */ + public boolean containsHttpFilter(Class filterClass) { + return this.prepare.containsFilter(filterClass); + } + /** * 添加HttpFilter * @@ -159,6 +171,18 @@ public class HttpServer extends Server 泛型 + * @param servletClass HttpServlet类 + * + * @return boolean + */ + public boolean containsHttpServlet(Class servletClass) { + return this.prepare.containsServlet(servletClass); + } + /** * 添加WebSocketServlet * diff --git a/src/org/redkale/net/sncp/SncpServer.java b/src/org/redkale/net/sncp/SncpServer.java index 54b9a8282..41936cd6e 100644 --- a/src/org/redkale/net/sncp/SncpServer.java +++ b/src/org/redkale/net/sncp/SncpServer.java @@ -62,6 +62,18 @@ public class SncpServer extends Server 泛型 + * @param filterClass SncpFilter类 + * + * @return SncpFilter + */ + public boolean containsSncpFilter(Class filterClass) { + return this.prepare.containsFilter(filterClass); + } + /** * 删除SncpServlet * @@ -82,6 +94,18 @@ public class SncpServer extends Server 泛型 + * @param servletClass SncpServlet类 + * + * @return boolean + */ + public boolean containsSncpServlet(Class servletClass) { + return this.prepare.containsServlet(servletClass); + } + @Override @SuppressWarnings("unchecked") protected SncpContext createContext() {