有没有办法永久移除瓷砖;“以编程方式”;(Java)从GeoServer中的缓存中删除?
我正在使用GeoServer和Java后端。我可以使用Rest API重置磁贴的缓存,并通过从GeoServer的GUI中永久删除磁贴(磁贴缓存->磁贴层->检查磁贴->单击“删除选定的缓存层”)来防止任何进一步的粘结 我想自动化的过程,并从后端做它。我尝试了截断操作,深入研究了RESTAPI和Java对象,但还没有弄清楚如何进行 是否可以使用Java从缓存中永久删除磁贴?如果是,如何进行有没有办法永久移除瓷砖;“以编程方式”;(Java)从GeoServer中的缓存中删除?,java,geoserver,Java,Geoserver,我正在使用GeoServer和Java后端。我可以使用Rest API重置磁贴的缓存,并通过从GeoServer的GUI中永久删除磁贴(磁贴缓存->磁贴层->检查磁贴->单击“删除选定的缓存层”)来防止任何进一步的粘结 我想自动化的过程,并从后端做它。我尝试了截断操作,深入研究了RESTAPI和Java对象,但还没有弄清楚如何进行 是否可以使用Java从缓存中永久删除磁贴?如果是,如何进行 感谢您的帮助。如果您试图完全避免缓存层(而不是截断层的缓存),则需要访问其GWC REST端点: http
感谢您的帮助。如果您试图完全避免缓存层(而不是截断层的缓存),则需要访问其GWC REST端点:
http://localhost:8080/geoserver/gwc/rest/layers/zoomstack:airports.xml
这将为您提供如下文件:
<GeoServerLayer>
<id>LayerInfoImpl-36bac688:1666e6c28d4:-7ffd</id>
<enabled>true</enabled>
<inMemoryCached>true</inMemoryCached>
<name>zoomstack:airports</name>
<mimeFormats>
<string>image/png</string>
<string>image/jpeg</string>
</mimeFormats>
<gridSubsets>
<gridSubset>
<gridSetName>osgb</gridSetName>
</gridSubset>
<gridSubset>
<gridSetName>EPSG:900913</gridSetName>
</gridSubset>
<gridSubset>
<gridSetName>EPSG:4326</gridSetName>
</gridSubset>
</gridSubsets>
<metaWidthHeight>
<int>4</int>
<int>4</int>
</metaWidthHeight>
<expireCache>0</expireCache>
<expireClients>0</expireClients>
<parameterFilters>
<styleParameterFilter>
<key>STYLES</key>
<defaultValue/>
</styleParameterFilter>
</parameterFilters>
<gutter>0</gutter>
</GeoServerLayer>
LayerInfoImpl-36bac688:1666e6c28d4:-7ffd
真的
真的
zoomstack:机场
图像/png
图像/jpeg
osgb
EPSG:900913
EPSG:4326
4.
4.
0
0
风格
0
然后可以将
true
更改为false
,并将其放回服务器 作为对Ian答案的补充(很有魅力,谢谢Ian),这里有一个Java代码片段(需要一些爱、常量等):
private void removeLayerGroupFromCache()引发IOException{
URL=新URL(“http://localhost:8080/geoserver/gwc/rest/layers/layer group name.xml”);
字符串rawLayer=getXMLContent(url);
String updatedLayer=formatXMLContent(rawLayer);
updateLayerInGIS(url,updatedLayer);
}
私有字符串getXMLContent(URL)引发IOException{
URLConnection URLConnection=setUsernamePassword(url);
InputStreamReader InputStreamReader=新的InputStreamReader(urlConnection.getInputStream());
BufferedReader BufferedReader=新的BufferedReader(inputStreamReader);
StringBuilder结果=新建StringBuilder();
弦线;
而((line=bufferedReader.readLine())!=null){
结果。追加(行);
}
bufferedReader.close();
inputStreamReader.close();
返回result.toString();
}
//TODO:这感觉很糟糕,应该改进。(为什么要在urlConnection.getInputStream()调用中添加额外的空格?)
私有字符串格式XmlContent(字符串原始内容){
originalContent=originalContent.replaceAll(“\\s+”,“”);//删除不需要的空格。
originalContent=originalContent.replaceAll(“layergroupname.replaceAll(\\s+,“”),“图层组名称”);//如果名称包含空格,请确保名称匹配。
originalContent=originalContent.replace(“.replaceAll(\\s+”,“”),“”);//将所需的空格重新附加到XML声明中。
originalContent=originalContent.replace(“true”、“false”);//最后,禁用组的缓存。
返回原始内容;
}
私有URL连接setUsernamePassword(URL URL)引发IOException{
String authStringEncoded=新字符串(Base64.encodeBase64(“用户名:userpassword.getBytes());
URLConnection URLConnection=url.openConnection();
setRequestProperty(“授权”、“基本”+authStringEncoded);
返回URL连接;
}
私有void updateLayerInGIS(URL、字符串updateLayer)引发IOException{
Authentication auth=authenticationResolver.retrieve();
字符串encodedCredentials=java.util.Base64.getEncoder().encodeToString(“用户名:userpassword.getBytes());
URL directUrl=新URL(“http”,URL.getHost(),URL.getPort(),URL.getFile());
HttpURLConnection httpCon=(HttpURLConnection)directUrl.openConnection();
httpCon.setRequestProperty(“授权”、“基本”+encodedCredentials);
httpCon.setDoOutput(真);
httpCon.setRequestMethod(“POST”);
OutputStreamWriter out=新的OutputStreamWriter(httpCon.getOutputStream());
out.write(更新层);
out.close();
int statusCode=httpCon.getResponseCode();
如果(状态代码>=200&&statusCode<400){
httpCon.getInputStream();
}否则{
//获取更详细的消息,说明返回无效代码的原因。
字符串errorMessage=readStream(httpCon.getErrorStream());
抛出新IOException(errorMessage);
}
}
私有字符串读取流(InputStream流)引发IOException{
StringBuilder=新的StringBuilder();
try(BufferedReader in=new BufferedReader(new InputStreamReader(stream))){
弦线;
而((line=in.readLine())!=null){
builder.append(行);
}
}
返回builder.toString();
}
您是要删除一个磁贴还是一整层。不管怎样,休息可能是最好的option@IanTurton如果我引用GeoServer的语义,您是对的,这确实是一个完整的层(该列称为“层名称”)。我试图使用RESTAPI查找信息,但我只能找到一种清除缓存的方法,而不能阻止层进入缓存。
private void removeLayerGroupFromCache() throws IOException {
URL url = new URL("http://localhost:8080/geoserver/gwc/rest/layers/layer group name.xml");
String rawLayer = getXMLContent(url);
String updatedLayer = formatXMLContent(rawLayer);
updateLayerInGIS(url, updatedLayer);
}
private String getXMLContent(URL url) throws IOException {
URLConnection urlConnection = setUsernamePassword(url);
InputStreamReader inputStreamReader = new InputStreamReader(urlConnection.getInputStream());
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
StringBuilder result = new StringBuilder();
String line;
while ((line = bufferedReader.readLine()) != null) {
result.append(line);
}
bufferedReader.close();
inputStreamReader.close();
return result.toString();
}
// TODO: This feels akward and should be improved. (Why extra spaces are being added with the urlConnection.getInputStream() call?)
private String formatXMLContent(String originalContent) {
originalContent = originalContent.replaceAll("\\s+", ""); // Removes undesired spaces.
originalContent = originalContent.replaceAll("layergroupname".replaceAll("\\s+", ""), "layer group name"); // Makes sure the name is matching if it contains white spaces.
originalContent = originalContent.replace("<?xml version=\"1.0\" encoding=\"UTF-8\"?>".replaceAll("\\s+", ""), "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"); // Re-append required spaces to XML declaration.
originalContent = originalContent.replace("<enabled>true</enabled>", "<enabled>false</enabled>"); // Finally, disable the caching for the group.
return originalContent;
}
private URLConnection setUsernamePassword(URL url) throws IOException {
String authStringEncoded = new String(Base64.encodeBase64("username:userpassword".getBytes()));
URLConnection urlConnection = url.openConnection();
urlConnection.setRequestProperty("Authorization", "Basic " + authStringEncoded);
return urlConnection;
}
private void updateLayerInGIS(URL url, String updatedLayer) throws IOException {
Authentication auth = authenticationResolver.retrieve();
String encodedCredentials = java.util.Base64.getEncoder().encodeToString("username:userpassword".getBytes());
URL directUrl = new URL("http", url.getHost(), url.getPort(), url.getFile());
HttpURLConnection httpCon = (HttpURLConnection) directUrl.openConnection();
httpCon.setRequestProperty("Authorization", "Basic " + encodedCredentials);
httpCon.setDoOutput(true);
httpCon.setRequestMethod("POST");
OutputStreamWriter out = new OutputStreamWriter(httpCon.getOutputStream());
out.write(updatedLayer);
out.close();
int statusCode = httpCon.getResponseCode();
if(statusCode >= 200 && statusCode < 400) {
httpCon.getInputStream();
} else {
// Gets a more verbose message on why a non valid code has been returned.
String errorMessage = readStream(httpCon.getErrorStream());
throw new IOException(errorMessage);
}
}
private String readStream(InputStream stream) throws IOException {
StringBuilder builder = new StringBuilder();
try (BufferedReader in = new BufferedReader(new InputStreamReader(stream))) {
String line;
while ((line = in.readLine()) != null) {
builder.append(line);
}
}
return builder.toString();
}