This commit is contained in:
Redkale
2017-06-04 08:00:13 +08:00
parent 023a9abdef
commit 95e18dfd48
12 changed files with 161 additions and 74 deletions

View File

@@ -135,6 +135,7 @@
<!--
name: 显式指定name覆盖默认的空字符串值。 注意: name不能包含$符号。
groups: 显式指定groups覆盖<services>节点的groups默认值。
ignore: 是否禁用, 默认为false。
-->
<service value="com.xxx.XXX2Service" name="" groups="xxx;yyy"/>
<!-- 给Service增加配置属性 -->
@@ -153,7 +154,12 @@
excludes 当autoload="true" 排除类名与excludes中的正则表达式匹配的类, 多个正则表达式用分号;隔开
-->
<filters autoload="true" includes="" excludes="">
<!--
显著加载指定的Filter类
value=: Filter类名。必须与Server的协议层相同HTTP必须是HttpFilter
ignore: 是否禁用, 默认为false。
-->
<!-- 显著加载指定的Filter类 -->
<filter value="com.xxx.XXX1Filter"/>
@@ -247,7 +253,11 @@
excludes 当autoload="true" 排除类名与excludes中的正则表达式匹配的类, 多个正则表达式用分号;隔开
-->
<servlets path="/pipes" autoload="true" includes="" excludes="">
<!-- 显著加载指定的Servlet -->
<!--
显著加载指定的Servlet类
value=: Servlet类名。必须与Server的协议层相同HTTP必须是HttpServlet
ignore: 是否禁用, 默认为false。
-->
<servlet value="com.xxx.XXX1Servlet" />
<servlet value="com.xxx.XXX2Servlet" />
<servlet value="com.xxx.XXX3Servlet" >

View File

@@ -450,62 +450,6 @@ public abstract class NodeServer {
maxClassNameLength = Math.max(maxClassNameLength, Sncp.getResourceType(y).getName().length() + 1);
}
/*
* protected List<Transport> loadTransports(final HashSet<String> groups) {
* if (groups == null) return null;
* final List<Transport> 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<String> 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<Transport> transports = new ArrayList<>();
* for (String group : groups) {
* transports.add(loadTransport(group));
* }
* Set<InetSocketAddress> 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<InetSocketAddress> addrs = ginfo.copyAddresses();
* if (addrs == null) throw new RuntimeException("Not found <group> = " + group + " on <resources> ");
* 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<Filter> createFilterClassFilter();
protected abstract ClassFilter<Servlet> 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", "");

View File

@@ -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 {
}

View File

@@ -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();
}
}

View File

@@ -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 {
}

View File

@@ -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;
/**
* <p>
@@ -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;

View File

@@ -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;
/**
* <p>
@@ -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;

View File

@@ -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;
}

View File

@@ -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;

View File

@@ -63,6 +63,15 @@ public abstract class PrepareServlet<K extends Serializable, C extends Context,
}
}
public boolean containsServlet(Class<? extends S> 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<K, S> newmappings = new HashMap<>(mappings);
@@ -139,6 +148,15 @@ public abstract class PrepareServlet<K extends Serializable, C extends Context,
return removeFilter(f -> filterClass.equals(f.getClass()));
}
public boolean containsFilter(Class<? extends Filter<C, R, P>> 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<C, R, P> removeFilter(Predicate<Filter<C, R, P>> predicate) {
if (this.headFilter == null || predicate == null) return null;
synchronized (filters) {

View File

@@ -104,6 +104,18 @@ public class HttpServer extends Server<String, HttpContext, HttpRequest, HttpRes
return (T) this.prepare.removeFilter(filterClass);
}
/**
* 判断是否存在HttpFilter
*
* @param <T> 泛型
* @param filterClass HttpFilter类
*
* @return boolean
*/
public <T extends HttpFilter> boolean containsHttpFilter(Class<T> filterClass) {
return this.prepare.containsFilter(filterClass);
}
/**
* 添加HttpFilter
*
@@ -159,6 +171,18 @@ public class HttpServer extends Server<String, HttpContext, HttpRequest, HttpRes
return this;
}
/**
* 判断是否存在HttpServlet
*
* @param <T> 泛型
* @param servletClass HttpServlet类
*
* @return boolean
*/
public <T extends HttpServlet> boolean containsHttpServlet(Class<T> servletClass) {
return this.prepare.containsServlet(servletClass);
}
/**
* 添加WebSocketServlet
*

View File

@@ -62,6 +62,18 @@ public class SncpServer extends Server<DLong, SncpContext, SncpRequest, SncpResp
return this;
}
/**
* 判断是否存在SncpFilter
*
* @param <T> 泛型
* @param filterClass SncpFilter类
*
* @return SncpFilter
*/
public <T extends SncpFilter> boolean containsSncpFilter(Class<T> filterClass) {
return this.prepare.containsFilter(filterClass);
}
/**
* 删除SncpServlet
*
@@ -82,6 +94,18 @@ public class SncpServer extends Server<DLong, SncpContext, SncpRequest, SncpResp
return ((SncpPrepareServlet) this.prepare).getSncpServlets();
}
/**
* 判断是否存在SncpServlet
*
* @param <T> 泛型
* @param servletClass SncpServlet类
*
* @return boolean
*/
public <T extends SncpServlet> boolean containsSncpServlet(Class<T> servletClass) {
return this.prepare.containsServlet(servletClass);
}
@Override
@SuppressWarnings("unchecked")
protected SncpContext createContext() {