This commit is contained in:
Redkale
2017-06-03 22:05:53 +08:00
parent a6c105d63d
commit 7b15ba33e0
3 changed files with 94 additions and 5 deletions

View File

@@ -296,6 +296,10 @@ public final class Application {
return startTime;
}
public AnyValue getAppConfig() {
return config;
}
public void init() throws Exception {
System.setProperty("java.util.concurrent.ForkJoinPool.common.parallelism", "" + Runtime.getRuntime().availableProcessors() * 4);
System.setProperty("convert.bson.tiny", "true");
@@ -441,6 +445,16 @@ public final class Application {
//------------------------------------------------------------------------
}
public void restoreConfig() throws IOException {
synchronized (this) {
File confFile = new File(this.home, "conf/application.xml");
confFile.renameTo(new File(this.home, "conf/application_" + String.format("%1$tY%1$tm%1$td%1$tH%1$tM%1$tS", System.currentTimeMillis()) + ".xml"));
final PrintStream ps = new PrintStream(new FileOutputStream(confFile));
ps.append(config.toXML("application"));
ps.close();
}
}
private void startSelfServer() throws Exception {
final Application application = this;
new Thread() {

View File

@@ -5,6 +5,7 @@
*/
package org.redkale.boot.watch;
import java.io.IOException;
import java.net.*;
import java.nio.channels.AsynchronousSocketChannel;
import java.util.List;
@@ -15,7 +16,8 @@ import org.redkale.net.*;
import org.redkale.net.http.*;
import org.redkale.net.sncp.*;
import org.redkale.service.*;
import org.redkale.util.Comment;
import org.redkale.util.*;
import org.redkale.util.AnyValue.DefaultAnyValue;
import org.redkale.watch.WatchService;
/**
@@ -49,7 +51,7 @@ public class TransportWatchService implements WatchService {
public RetResult addNode(
@RestParam(name = "group", comment = "Group节点名") final String group,
@RestParam(name = "addr", comment = "节点IP") final String addr,
@RestParam(name = "port", comment = "节点端口") final int port) {
@RestParam(name = "port", comment = "节点端口") final int port) throws IOException {
InetSocketAddress address;
try {
address = new InetSocketAddress(addr, port);
@@ -57,8 +59,7 @@ public class TransportWatchService implements WatchService {
channel.connect(address).get(2, TimeUnit.SECONDS); //连接超时2秒
channel.close();
} catch (Exception e) {
e.printStackTrace();
return new RetResult(RET_ADDR_ILLEGAL, "InetSocketAddress(addr=" + addr + ", port=" + port + ") is illegal");
return new RetResult(RET_ADDR_ILLEGAL, "InetSocketAddress(addr=" + addr + ", port=" + port + ") is illegal or cannot connect");
}
if (transportFactory.findGroupName(address) != null) return new RetResult(RET_ADDR_ILLEGAL, "InetSocketAddress(addr=" + addr + ", port=" + port + ") is exists");
synchronized (this) {
@@ -84,6 +85,14 @@ public class TransportWatchService implements WatchService {
}
}
}
DefaultAnyValue node = DefaultAnyValue.create("addr", addr).addValue("port", port);
for (AnyValue groupconf : application.getAppConfig().getAnyValue("resources").getAnyValues("group")) {
if (group.equals(groupconf.getValue("name"))) {
((DefaultAnyValue) groupconf).addValue("node", node);
break;
}
}
application.restoreConfig();
}
return RetResult.success();
}
@@ -92,7 +101,7 @@ public class TransportWatchService implements WatchService {
public RetResult removeNode(
@RestParam(name = "group", comment = "Group节点名") final String group,
@RestParam(name = "addr", comment = "节点IP") final String addr,
@RestParam(name = "port", comment = "节点端口") final int port) {
@RestParam(name = "port", comment = "节点端口") final int port) throws IOException {
if (group == null) return new RetResult(RET_NO_GROUP, "not found group (" + group + ")");
final InetSocketAddress address = new InetSocketAddress(addr, port);
if (!group.equals(transportFactory.findGroupName(address))) return new RetResult(RET_ADDR_ILLEGAL, "InetSocketAddress(addr=" + addr + ", port=" + port + ") not belong to group(" + group + ")");
@@ -119,6 +128,13 @@ public class TransportWatchService implements WatchService {
}
}
}
for (AnyValue groupconf : application.getAppConfig().getAnyValue("resources").getAnyValues("group")) {
if (group.equals(groupconf.getValue("name"))) {
((DefaultAnyValue) groupconf).removeValue("node", DefaultAnyValue.create("addr", addr).addValue("port", port));
break;
}
}
application.restoreConfig();
}
return RetResult.success();
}

View File

@@ -302,6 +302,18 @@ public abstract class AnyValue {
return this;
}
public DefaultAnyValue removeValue(String name, AnyValue value) {
if (name == null || value == null || this.anyEntrys == null) return this;
this.anyEntrys = Utility.remove(this.anyEntrys, (t) -> name.equals(((Entry) t).name) && ((Entry) t).getValue().equals(value));
return this;
}
public DefaultAnyValue removeValue(String name, String value) {
if (name == null || value == null || this.stringEntrys == null) return this;
this.stringEntrys = Utility.remove(this.stringEntrys, (t) -> name.equals(((Entry) t).name) && ((Entry) t).getValue().equals(value));
return this;
}
@Override
public AnyValue getAnyValue(String name) {
for (Entry<DefaultAnyValue> en : this.anyEntrys) {
@@ -533,4 +545,51 @@ public abstract class AnyValue {
return value == null ? defaultValue : value;
}
@Override
public boolean equals(Object other) {
if (!(other instanceof AnyValue)) return false;
AnyValue conf = (AnyValue) other;
if (!equals(this.getStringEntrys(), conf.getStringEntrys())) return false;
return equals(this.getAnyEntrys(), conf.getAnyEntrys());
}
private static <T> boolean equals(Entry<? extends T>[] entry1, Entry<T>[] entry2) {
if ((entry1 == null || entry1.length == 0) || (entry2 == null || entry2.length == 0)) return false;
if (entry1.length != entry2.length) return false;
for (int i = 0; i < entry1.length; i++) {
if (!entry1[i].equals(entry2[i])) return false;
}
return true;
}
@Override
public int hashCode() {
int hash = 7;
hash = 19 * hash + Arrays.deepHashCode(this.getStringEntrys());
hash = 19 * hash + Arrays.deepHashCode(this.getAnyEntrys());
return hash;
}
public String toXML(String rootName) {
return toXMLString(new StringBuilder("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n\r\n"), rootName, this, 0).toString();
}
protected static StringBuilder toXMLString(StringBuilder sb, String nodeName, AnyValue conf, int indent) { //indent: 缩进长度
if (indent < 0) indent = 0;
char[] chars = new char[indent];
Arrays.fill(chars, ' ');
final String space = new String(chars);
Entry<AnyValue>[] anys = conf.getAnyEntrys();
sb.append(space).append('<').append(nodeName);
for (Entry<String> en : conf.getStringEntrys()) {
sb.append(' ').append(en.name).append("=\"").append(en.value).append("\"");
}
if (anys == null || anys.length == 0) return sb.append("/>\r\n\r\n");
sb.append(">\r\n\r\n");
for (Entry<AnyValue> en : conf.getAnyEntrys()) {
toXMLString(sb, en.name, en.getValue(), indent + 4);
}
return sb.append(space).append("</").append(nodeName).append(">\r\n\r\n");
}
}