From 7b15ba33e07391ebfd211174744834f58bcd599e Mon Sep 17 00:00:00 2001 From: Redkale <22250530@qq.com> Date: Sat, 3 Jun 2017 22:05:53 +0800 Subject: [PATCH] --- src/org/redkale/boot/Application.java | 14 +++++ .../boot/watch/TransportWatchService.java | 26 ++++++-- src/org/redkale/util/AnyValue.java | 59 +++++++++++++++++++ 3 files changed, 94 insertions(+), 5 deletions(-) diff --git a/src/org/redkale/boot/Application.java b/src/org/redkale/boot/Application.java index 4fe6437c9..45cdb15d8 100644 --- a/src/org/redkale/boot/Application.java +++ b/src/org/redkale/boot/Application.java @@ -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() { diff --git a/src/org/redkale/boot/watch/TransportWatchService.java b/src/org/redkale/boot/watch/TransportWatchService.java index ce5a6ce5a..0679115a4 100644 --- a/src/org/redkale/boot/watch/TransportWatchService.java +++ b/src/org/redkale/boot/watch/TransportWatchService.java @@ -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(); } diff --git a/src/org/redkale/util/AnyValue.java b/src/org/redkale/util/AnyValue.java index 6806dca90..690b9d6fd 100644 --- a/src/org/redkale/util/AnyValue.java +++ b/src/org/redkale/util/AnyValue.java @@ -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 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 boolean equals(Entry[] entry1, Entry[] 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("\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[] anys = conf.getAnyEntrys(); + sb.append(space).append('<').append(nodeName); + for (Entry 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 en : conf.getAnyEntrys()) { + toXMLString(sb, en.name, en.getValue(), indent + 4); + } + return sb.append(space).append("\r\n\r\n"); + } + }