Archived
0

Bridge:fix: бесконечный реконнект

This commit is contained in:
2017-05-18 14:43:16 +03:00
parent 2070a5eb63
commit b1054aab89
4 changed files with 76 additions and 25 deletions

View File

@@ -1,5 +1,5 @@
group = 'asys' group = 'asys'
version = '0.5.2-SNAPSHOT' version = '0.5.3-SNAPSHOT'
repositories { repositories {
maven { url 'https://hub.spigotmc.org/nexus/content/groups/public/' } maven { url 'https://hub.spigotmc.org/nexus/content/groups/public/' }

View File

@@ -13,18 +13,13 @@ import org.bukkit.command.Command;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.bukkit.plugin.java.JavaPlugin; import org.bukkit.plugin.java.JavaPlugin;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;
public class BridgePlugin extends JavaPlugin { public class BridgePlugin extends JavaPlugin {
public static BridgePlugin INSTANCE; public static BridgePlugin INSTANCE;
private Client client; private Client client;
private ScheduledExecutorService ses; private TaskTicker connectTicker, pingTicker;
private ScheduledFuture<?> sesFuture, sesPingFuture;
private int tryConnect = 0; private int tryConnect = 0;
private BridgeLoggerAppender loggerAppender; private BridgeLoggerAppender loggerAppender;
private boolean needReconnect = true;
@Override @Override
public void onLoad() { public void onLoad() {
@@ -44,10 +39,8 @@ public class BridgePlugin extends JavaPlugin {
@Override @Override
public void onDisable() { public void onDisable() {
if (sesFuture != null) { setNeedReconnect(false);
sesFuture.cancel(false); stopReconnect();
}
stopPing(); stopPing();
if (client.isConnected()) { if (client.isConnected()) {
@@ -66,8 +59,8 @@ public class BridgePlugin extends JavaPlugin {
public void startReconnect() { public void startReconnect() {
client = new Client(); client = new Client();
ses = Executors.newScheduledThreadPool(2); connectTicker = new TaskTicker().setStepTimeMs(5000L);
sesFuture = ses.scheduleAtFixedRate(() -> { connectTicker.setTask(() -> {
getLogger().info(String.format("Connect(%d) to ASys...", ++tryConnect)); getLogger().info(String.format("Connect(%d) to ASys...", ++tryConnect));
client.connect(getConfig().getString("host"), getConfig().getInt("port")); client.connect(getConfig().getString("host"), getConfig().getInt("port"));
if (client.isConnected()) { if (client.isConnected()) {
@@ -76,20 +69,20 @@ public class BridgePlugin extends JavaPlugin {
getLogger().warning( getLogger().warning(
String.format("Connection(%d) fail. Try reconnect...", tryConnect)); String.format("Connection(%d) fail. Try reconnect...", tryConnect));
} }
}, 0L, 5L, TimeUnit.SECONDS); }).start();
} }
public void stopReconnect() { public void stopReconnect() {
if (sesFuture != null) { if (connectTicker != null) {
sesFuture.cancel(false); connectTicker.stop();
sesFuture = null;
tryConnect = 0; tryConnect = 0;
} }
} }
public void startPing(Channel channel) { public void startPing(Channel channel) {
getLoggerAppender().setChannel(channel); getLoggerAppender().setChannel(channel);
sesPingFuture = ses.scheduleAtFixedRate(() -> { pingTicker = new TaskTicker().setStepTimeMs(5000L);
pingTicker.setTask(() -> {
channel.write(new CS_Ping( channel.write(new CS_Ping(
System.currentTimeMillis(), System.currentTimeMillis(),
20.0D, //FIXME 20.0D, //FIXME
@@ -105,17 +98,25 @@ public class BridgePlugin extends JavaPlugin {
getLogger().warning("Try reconnect..."); getLogger().warning("Try reconnect...");
startReconnect(); startReconnect();
} }
}, 0L, 5L, TimeUnit.SECONDS); }).start();
} }
public void stopPing() { public void stopPing() {
getLoggerAppender().setChannel(null); getLoggerAppender().setChannel(null);
if (sesPingFuture != null) { if (pingTicker != null) {
sesPingFuture.cancel(false); pingTicker.stop();
} }
} }
public BridgeLoggerAppender getLoggerAppender() { public BridgeLoggerAppender getLoggerAppender() {
return loggerAppender; return loggerAppender;
} }
public boolean isNeedReconnect() {
return needReconnect;
}
public void setNeedReconnect(boolean needReconnect) {
this.needReconnect = needReconnect;
}
} }

View File

@@ -0,0 +1,48 @@
/*
* DmitriyMX <d.mihailov@samson-rus.com>
* 2017-05-18
*/
package asys.bridge.bukkit;
public class TaskTicker implements Runnable {
private Runnable task;
private long stepTimeMs = 1000L;
private Thread thread;
private boolean loop = false;
TaskTicker setTask(Runnable task) {
this.task = task;
return this;
}
TaskTicker setStepTimeMs(long stepTimeMs) {
this.stepTimeMs = stepTimeMs;
return this;
}
void start() {
thread = new Thread(this, "TaskTicker");
loop = true;
thread.start();
}
void stop() {
loop = false;
if (thread != null) {
thread.interrupt();
}
}
@Override
public void run() {
while (loop || !Thread.currentThread().isInterrupted()) {
task.run();
try {
Thread.sleep(stepTimeMs);
} catch (InterruptedException e) {
break;
}
}
}
}

View File

@@ -54,11 +54,12 @@ public class ClientPacketHandler extends ChannelInboundHandlerAdapter implements
@Override @Override
public void channelInactive(ChannelHandlerContext context) throws Exception { public void channelInactive(ChannelHandlerContext context) throws Exception {
if (BridgePlugin.INSTANCE != null) { if (BridgePlugin.INSTANCE != null) {
BridgePlugin.INSTANCE.getLogger().warning("Lost connection!");
BridgePlugin.INSTANCE.stopPing(); BridgePlugin.INSTANCE.stopPing();
BridgePlugin.INSTANCE.getLogger().warning("Try reconnect..."); if (BridgePlugin.INSTANCE.isNeedReconnect()) {
BridgePlugin.INSTANCE.getLogger().warning("Lost connection! Try reconnect...");
BridgePlugin.INSTANCE.startReconnect(); BridgePlugin.INSTANCE.startReconnect();
} }
}
context.channel().attr(KNOWN_PACKETS).remove(); context.channel().attr(KNOWN_PACKETS).remove();
context.channel().attr(KNOWN_HANDLERS).remove(); context.channel().attr(KNOWN_HANDLERS).remove();
super.channelInactive(context); super.channelInactive(context);
@@ -71,6 +72,7 @@ public class ClientPacketHandler extends ChannelInboundHandlerAdapter implements
if (pkt.getErrorCode() != 0) { if (pkt.getErrorCode() != 0) {
BridgePlugin.INSTANCE.getLogger().severe( BridgePlugin.INSTANCE.getLogger().severe(
String.format("Handshake: #%d %s", pkt.getErrorCode(), pkt.getMessage())); String.format("Handshake: #%d %s", pkt.getErrorCode(), pkt.getMessage()));
BridgePlugin.INSTANCE.setNeedReconnect(false);
} else { } else {
context.channel().attr(KNOWN_PACKETS).set(pingPackets); context.channel().attr(KNOWN_PACKETS).set(pingPackets);
BridgePlugin.INSTANCE.getLogger().info("Handshake: OK"); BridgePlugin.INSTANCE.getLogger().info("Handshake: OK");