fix:tcp启动问题修复

master
xiwa 2023-10-29 12:55:55 +08:00
parent 9550c091eb
commit 1ddaa6045d
9 changed files with 174 additions and 209 deletions

View File

@ -18,6 +18,8 @@ import org.springframework.stereotype.Service;
import javax.annotation.PostConstruct; import javax.annotation.PostConstruct;
import java.util.Map; import java.util.Map;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
/** /**
* @author sjg * @author sjg
@ -66,15 +68,20 @@ public class HttpPlugin implements PluginCloseListener {
@Override @Override
public void close(GenericApplicationContext applicationContext, PluginInfo pluginInfo, PluginCloseType closeType) { public void close(GenericApplicationContext applicationContext, PluginInfo pluginInfo, PluginCloseType closeType) {
try { try {
httpVerticle.stop(); log.info("plugin close,type:{},pluginId:{}", closeType, pluginInfo.getPluginId());
if (deployedId != null) {
CountDownLatch wait = new CountDownLatch(1);
Future<Void> future = vertx.undeploy(deployedId); Future<Void> future = vertx.undeploy(deployedId);
future.onSuccess(unused -> log.info("http plugin stopped success")); future.onSuccess(unused -> {
if (closeType == PluginCloseType.UNINSTALL) { log.info("tcp plugin stopped success");
log.info("http plugin UNINSTALL{}", pluginInfo.getPluginId()); wait.countDown();
} else if (closeType == PluginCloseType.STOP) { });
log.info("http plugin STOP{}", pluginInfo.getPluginId()); future.onFailure(h -> {
} else if (closeType == PluginCloseType.UPGRADE_UNINSTALL) { log.info("tcp plugin stopped failed");
log.info("http plugin UPGRADE_UNINSTALL{}", pluginInfo.getPluginId()); h.printStackTrace();
wait.countDown();
});
wait.await(5, TimeUnit.SECONDS);
} }
} catch (Throwable e) { } catch (Throwable e) {
log.error("http plugin stop error", e); log.error("http plugin stop error", e);

View File

@ -78,8 +78,7 @@ public class HttpVerticle extends AbstractVerticle implements Handler<RoutingCon
} }
@Override @Override
public void stop() throws Exception { public void stop() {
httpServer.close((r) -> log.info("http server close result:{}", r.succeeded()));
} }
@Override @Override

View File

@ -122,14 +122,8 @@ public class ModbusPlugin implements PluginCloseListener {
@Override @Override
public void close(GenericApplicationContext applicationContext, PluginInfo pluginInfo, PluginCloseType closeType) { public void close(GenericApplicationContext applicationContext, PluginInfo pluginInfo, PluginCloseType closeType) {
try { try {
log.info("plugin close,type:{},pluginId:{}", closeType, pluginInfo.getPluginId());
master.disconnect(); master.disconnect();
if (closeType == PluginCloseType.UNINSTALL) {
log.info("modbus plugin UNINSTALL{}", pluginInfo.getPluginId());
} else if (closeType == PluginCloseType.STOP) {
log.info("modbus plugin STOP{}", pluginInfo.getPluginId());
} else if (closeType == PluginCloseType.UPGRADE_UNINSTALL) {
log.info("modbus plugin UPGRADE_UNINSTALL{}", pluginInfo.getPluginId());
}
} catch (Throwable e) { } catch (Throwable e) {
log.error("modbus plugin stop error", e); log.error("modbus plugin stop error", e);
} }

View File

@ -18,6 +18,8 @@ import org.springframework.stereotype.Service;
import javax.annotation.PostConstruct; import javax.annotation.PostConstruct;
import java.util.Map; import java.util.Map;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
/** /**
* @author sjg * @author sjg
@ -65,15 +67,20 @@ public class MqttPlugin implements PluginCloseListener, IPlugin {
@Override @Override
public void close(GenericApplicationContext applicationContext, PluginInfo pluginInfo, PluginCloseType closeType) { public void close(GenericApplicationContext applicationContext, PluginInfo pluginInfo, PluginCloseType closeType) {
try { try {
mqttVerticle.stop(); log.info("plugin close,type:{},pluginId:{}", closeType, pluginInfo.getPluginId());
if (deployedId != null) {
CountDownLatch wait = new CountDownLatch(1);
Future<Void> future = vertx.undeploy(deployedId); Future<Void> future = vertx.undeploy(deployedId);
future.onSuccess(unused -> log.info("mqtt plugin stopped success")); future.onSuccess(unused -> {
if (closeType == PluginCloseType.UNINSTALL) { log.info("tcp plugin stopped success");
log.info("mqtt plugin UNINSTALL{}", pluginInfo.getPluginId()); wait.countDown();
} else if (closeType == PluginCloseType.STOP) { });
log.info("mqtt plugin STOP{}", pluginInfo.getPluginId()); future.onFailure(h -> {
} else if (closeType == PluginCloseType.UPGRADE_UNINSTALL) { log.info("tcp plugin stopped failed");
log.info("mqtt plugin UPGRADE_UNINSTALL{}", pluginInfo.getPluginId()); h.printStackTrace();
wait.countDown();
});
wait.await(5, TimeUnit.SECONDS);
} }
} catch (Throwable e) { } catch (Throwable e) {
log.error("mqtt plugin stop error", e); log.error("mqtt plugin stop error", e);

View File

@ -404,7 +404,6 @@ public class MqttVerticle extends AbstractVerticle implements Handler<MqttEndpoi
); );
DEVICE_ONLINE.clear(); DEVICE_ONLINE.clear();
} }
mqttServer.close(voidAsyncResult -> log.info("close mqtt server..."));
} }
public void publish(String deviceName, String topic, String msg) { public void publish(String deviceName, String topic, String msg) {

View File

@ -23,10 +23,6 @@ import java.io.IOException;
@Builder @Builder
public class DataPackage { public class DataPackage {
public static final short FLAG = 0x8D;
public static final int HEAD_LEN = 2 + 6 + 2 + 2 + 4;
public static final short CODE_REGISTER = 0x10; public static final short CODE_REGISTER = 0x10;
public static final short CODE_REGISTER_REPLY = 0x11; public static final short CODE_REGISTER_REPLY = 0x11;
public static final short CODE_HEARTBEAT = 0x20; public static final short CODE_HEARTBEAT = 0x20;

View File

@ -11,6 +11,7 @@ import com.gitee.starblues.core.PluginCloseType;
import com.gitee.starblues.core.PluginInfo; import com.gitee.starblues.core.PluginInfo;
import io.vertx.core.Future; import io.vertx.core.Future;
import io.vertx.core.Vertx; import io.vertx.core.Vertx;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.support.GenericApplicationContext; import org.springframework.context.support.GenericApplicationContext;
@ -18,6 +19,8 @@ import org.springframework.stereotype.Service;
import javax.annotation.PostConstruct; import javax.annotation.PostConstruct;
import java.util.Map; import java.util.Map;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
/** /**
* tcp * tcp
@ -57,25 +60,30 @@ public class TcpPlugin implements PluginCloseListener, IPlugin {
deployedId = s; deployedId = s;
log.info("tcp plugin started success"); log.info("tcp plugin started success");
})); }));
future.onFailure((e) -> { future.onFailure(Throwable::printStackTrace);
log.error("tcp plugin startup failed", e);
});
} catch (Throwable e) { } catch (Throwable e) {
log.error("tcp plugin startup error", e); e.printStackTrace();
} }
} }
@SneakyThrows
@Override @Override
public void close(GenericApplicationContext applicationContext, PluginInfo pluginInfo, PluginCloseType closeType) { public void close(GenericApplicationContext applicationContext, PluginInfo pluginInfo, PluginCloseType closeType) {
tcpServerVerticle.stop(); log.info("plugin close,type:{},pluginId:{}", closeType, pluginInfo.getPluginId());
if (deployedId != null) {
CountDownLatch wait = new CountDownLatch(1);
Future<Void> future = vertx.undeploy(deployedId); Future<Void> future = vertx.undeploy(deployedId);
future.onSuccess(unused -> log.info("tcp plugin stopped success")); future.onSuccess(unused -> {
if (closeType == PluginCloseType.UNINSTALL) { log.info("tcp plugin stopped success");
log.info("tcp plugin UNINSTALL{}", pluginInfo.getPluginId()); wait.countDown();
} else if (closeType == PluginCloseType.STOP) { });
log.info("tcp plugin STOP{}", pluginInfo.getPluginId()); future.onFailure(h -> {
} else if (closeType == PluginCloseType.UPGRADE_UNINSTALL) { log.info("tcp plugin stopped failed");
log.info("tcp plugin UPGRADE_UNINSTALL{}", pluginInfo.getPluginId()); h.printStackTrace();
wait.countDown();
});
wait.await(5, TimeUnit.SECONDS);
} }
} }

View File

@ -49,8 +49,6 @@ public class TcpServerVerticle extends AbstractVerticle {
@Setter @Setter
private TcpServerConfig config; private TcpServerConfig config;
private VertxTcpServer tcpServer;
private final Map<String, VertxTcpClient> clientMap = new ConcurrentHashMap<>(); private final Map<String, VertxTcpClient> clientMap = new ConcurrentHashMap<>();
private final Map<String, String> dnToPk = new HashMap<>(); private final Map<String, String> dnToPk = new HashMap<>();
@ -60,7 +58,7 @@ public class TcpServerVerticle extends AbstractVerticle {
@Setter @Setter
private long keepAliveTimeout = Duration.ofSeconds(30).toMillis(); private long keepAliveTimeout = Duration.ofSeconds(30).toMillis();
private Collection<NetServer> tcpServers; private NetServer netServer;
@Getter @Getter
private IScriptEngine scriptEngine; private IScriptEngine scriptEngine;
@ -78,18 +76,18 @@ public class TcpServerVerticle extends AbstractVerticle {
@Override @Override
public void start() { public void start() {
tcpServer = new VertxTcpServer();
try { try {
initConfig(); initConfig();
initTcpServer(); initTcpServer();
} catch (Exception e) { } catch (Exception e) {
log.error("init tcp server failed", e); log.info("init tcp server failed");
e.printStackTrace();
} }
} }
@Override @Override
public void stop() { public void stop() {
tcpServer.shutdown(); log.info("tcp server stopped");
} }
/** /**
@ -104,30 +102,19 @@ public class TcpServerVerticle extends AbstractVerticle {
/** /**
* TCP * TCP
*/ */
private void initTcpServer() { private void initTcpServer() throws Exception {
int instance = Math.max(2, config.getInstance()); netServer = vertx.createNetServer(
List<NetServer> instances = new ArrayList<>(instance);
for (int i = 0; i < instance; i++) {
instances.add(vertx.createNetServer(
new NetServerOptions().setHost(config.getHost()) new NetServerOptions().setHost(config.getHost())
.setPort(config.getPort()) .setPort(config.getPort()));
)); netServer.connectHandler(this::acceptTcpConnection);
}
// 根据解析类型配置数据解析器
tcpServer.setServer(instances);
// 针对JVM做的多路复用优化
// 多个server listen同一个端口每个client连接的时候vertx会分配
// 一个connection只能在一个server中处理
for (NetServer netServer : instances) {
netServer.listen(config.createSocketAddress(), result -> { netServer.listen(config.createSocketAddress(), result -> {
if (result.succeeded()) { if (result.succeeded()) {
log.info("tcp server startup on {}", result.result().actualPort()); log.info("tcp server startup on {}", result.result().actualPort());
} else { } else {
log.error("tcp server startup error", result.cause()); result.cause().printStackTrace();
} }
}); });
} }
}
public void sendMsg(String addr, Buffer msg) { public void sendMsg(String addr, Buffer msg) {
VertxTcpClient tcpClient = clientMap.get(addr); VertxTcpClient tcpClient = clientMap.get(addr);
@ -164,23 +151,6 @@ public class TcpServerVerticle extends AbstractVerticle {
}); });
} }
class VertxTcpServer {
/**
* NetServerconnectHandler
*
* @param servers NetServer
*/
public void setServer(Collection<NetServer> servers) {
if (tcpServers != null && !tcpServers.isEmpty()) {
shutdown();
}
tcpServers = servers;
for (NetServer tcpServer : tcpServers) {
tcpServer.connectHandler(this::acceptTcpConnection);
}
}
/** /**
* TCP * TCP
* *
@ -193,7 +163,7 @@ public class TcpServerVerticle extends AbstractVerticle {
client.setKeepAliveTimeoutMs(keepAliveTimeout); client.setKeepAliveTimeoutMs(keepAliveTimeout);
try { try {
// TCP异常和关闭处理 // TCP异常和关闭处理
socket.exceptionHandler(err -> log.error("tcp server client [{}] error", socket.remoteAddress(), err)).closeHandler(nil -> { socket.exceptionHandler(Throwable::printStackTrace).closeHandler(nil -> {
log.debug("tcp server client [{}] closed", socket.remoteAddress()); log.debug("tcp server client [{}] closed", socket.remoteAddress());
client.shutdown(); client.shutdown();
}); });
@ -263,13 +233,13 @@ public class TcpServerVerticle extends AbstractVerticle {
} }
} catch (Exception e) { } catch (Exception e) {
log.error("handler error", e); e.printStackTrace();
} }
}); });
client.setParser(parser); client.setParser(parser);
log.debug("accept tcp client [{}] connection", socket.remoteAddress()); log.debug("accept tcp client [{}] connection", socket.remoteAddress());
} catch (Exception e) { } catch (Exception e) {
log.error("create tcp server client error", e); e.printStackTrace();
client.shutdown(); client.shutdown();
} }
} }
@ -287,19 +257,4 @@ public class TcpServerVerticle extends AbstractVerticle {
} }
} }
public void shutdown() {
if (tcpServers == null) {
return;
}
for (NetServer tcpServer : tcpServers) {
try {
tcpServer.close();
} catch (Exception e) {
log.warn("close tcp server error", e);
}
}
tcpServers = null;
}
}
} }

View File

@ -55,7 +55,7 @@ public class TcpClientVerticle extends AbstractVerticle {
netClient = vertx.createNetClient(options); netClient = vertx.createNetClient(options);
RecordParser parser = DataReader.getParser(this::handle); RecordParser parser = DataReader.getParser(this::handle);
netClient.connect(6884, "127.0.0.1", result -> { netClient.connect(6883, "127.0.0.1", result -> {
if (result.succeeded()) { if (result.succeeded()) {
log.debug("connect tcp success"); log.debug("connect tcp success");
socket = result.result(); socket = result.result();