实现集群过滤器 |
创建 com.supermap.sample.ImageBoundsFilter 类(实现 ClusterServiceFilter 接口)实现一个名为根据 bbox 参数来选择集群节点的类(即集群节点过滤器)。
代码如下:
package com.supermap.sample;
import java.util.Enumeration;
import javax.servlet.http.HttpServletRequest;
import com.supermap.services.cluster.ServiceInfo;
import com.supermap.services.cluster.client.spi.ClusterServiceFilter;
import com.supermap.services.components.spi.ClusterServiceFilterType;
@ClusterServiceFilterType(componentType = "Map", interfaceType = "WMS")
public class ImageBoundsFilter implements ClusterServiceFilter {
/**
* 实现 com.supermap.services.cluster.client.spi.ClusterServiceFilter 中的方法,该方法会被集群服务调用以决定一个服务是否可用于处理特定请求。
*/
public boolean filter(ServiceInfo serviceInfo, HttpServletRequest request) {
if(serviceInfo != null) {
// 过滤掉不是 WMS 和 Map 组件类型的服务
if(!"WMS".equalsIgnoreCase(serviceInfo.protocol) || !"Map".equalsIgnoreCase(serviceInfo.type) ) {
return true;
}
}
//从请求中获取 bbox 参数
String requestBBox = getBBox(request);
if (requestBBox == null) {
//bbox 参数为 null,则这个 filter 不适用于这个请求,返回 ClusterServiceFilter.NEUTRAL
return true;
}
if (serviceInfo.address == null) {
return true;
}
//判断当前请求中要求的 bbox 是否在配置的范围内,并且对应的服务器信息地址端口为指定端口
if(isContain(requestBBox, new double[]{-180,-90,0,90}) && serviceInfo.address.indexOf("8091") != -1) {
return false;
}
if(isContain(requestBBox, new double[]{0,-90,180,90}) && serviceInfo.address.indexOf("8092") != -1) {
return false;
}
return true;
}
private boolean isContain(String requestBBox, double[] bounds) {
double[] requested = split(requestBBox);
return requested[0] >= bounds[0] && requested[1] >= bounds[1] && requested[2] <= bounds[2] && requested[3] <= bounds[3];
}
private String getBBox(HttpServletRequest request) {
Enumeration names = request.getParameterNames();
while (names.hasMoreElements()) {
String name = (String) names.nextElement();
if ("BBOX".equalsIgnoreCase(name)) {
return request.getParameter(name);
}
}
return null;
}
private double[] split(String bbox) {
String[] tmp = bbox.split(",");
double[] result = new double[4];
for (int i = 0; i < 4; i++) {
result[i] = Double.parseDouble(tmp[i]);
}
return result;
}
}
新建一个名为 SuperMapClusterClient.properties 的文件,进行必要的配置。该文件需要放到指定目录(META-INF/extensions/cluster/filters)下,该文件的内容如下:
implementation=com.supermap.sample.ImageBoundsFilter
该文件中配置声明了对于自定义 WMS 集群功能的过滤器,集群服务会读取这个配置文件并构造对应的实例对象。
将以上代码编译之后,将 ImageBoundsFilter.class 及过滤器的声明文件(SuperMapClusterClient.properties)打成 Jar 包,如 clusterfilter.jar。将 clusterfilter.jar 放置到集群服务器(此例中即8090端口上的 iServer 服务)的 SuperMap iServer Web 应用下,即 %SuperMap iServer_HOME%webapps\iserver\WEB-INF\lib 目录下。