Use a continuous connection for pub/sub to avoid EndOfStreamException and increase exception logging verbosity

feat/data-edit-commands
William 3 years ago
parent 4ab5070043
commit 9bf0fe7bb9

@ -2,6 +2,7 @@ package me.william278.husksync.redis;
import me.william278.husksync.Settings; import me.william278.husksync.Settings;
import redis.clients.jedis.*; import redis.clients.jedis.*;
import redis.clients.jedis.exceptions.JedisConnectionException;
import redis.clients.jedis.exceptions.JedisException; import redis.clients.jedis.exceptions.JedisException;
import java.io.IOException; import java.io.IOException;
@ -68,37 +69,53 @@ public abstract class RedisListener {
*/ */
public final void listen() { public final void listen() {
new Thread(() -> { new Thread(() -> {
try (Jedis jedis = getJedisConnection()) { isActiveAndEnabled = true;
if (jedis.isConnected()) { while (isActiveAndEnabled) {
isActiveAndEnabled = true;
log(Level.INFO, "Enabled Redis listener successfully!"); Jedis subscriber;
if (Settings.redisPassword.isEmpty()) {
subscriber = new Jedis(Settings.redisHost,
Settings.redisPort,
0);
} else { } else {
isActiveAndEnabled = false; final JedisClientConfig config = DefaultJedisClientConfig.builder()
log(Level.SEVERE, """ .password(Settings.redisPassword)
Failed to establish connection to the Redis server. .timeoutMillis(0).build();
HuskSync will now abort initialization.
Please check the credentials are correct and restart your server."""); subscriber = new Jedis(Settings.redisHost,
return; Settings.redisPort,
config);
} }
jedis.subscribe(new JedisPubSub() { subscriber.connect();
@Override
public void onMessage(String channel, String message) {
// Only accept messages to the HuskSync channel
if (!channel.equals(RedisMessage.REDIS_CHANNEL)) {
return;
}
// Handle the message log(Level.INFO, "Enabled Redis listener successfully!");
try { try {
handleMessage(new RedisMessage(message)); subscriber.subscribe(new JedisPubSub() {
} catch (IOException | ClassNotFoundException e) { @Override
log(Level.SEVERE, "Failed to deserialize message target"); public void onMessage(String channel, String message) {
// Only accept messages to the HuskSync channel
if (!channel.equals(RedisMessage.REDIS_CHANNEL)) {
return;
}
// Handle the message
try {
handleMessage(new RedisMessage(message));
} catch (IOException | ClassNotFoundException e) {
log(Level.SEVERE, "Failed to deserialize message target");
}
} }
} }, RedisMessage.REDIS_CHANNEL);
}, RedisMessage.REDIS_CHANNEL); } catch (JedisConnectionException connectionException) {
} catch (JedisException | IllegalStateException e) { log(Level.SEVERE, "A connection exception occurred with the Jedis listener");
log(Level.SEVERE, "An exception occurred with the Jedis Subscriber!"); connectionException.printStackTrace();
isActiveAndEnabled = false; } catch (JedisException jedisException) {
isActiveAndEnabled = false;
log(Level.SEVERE, "An exception occurred with the Jedis listener");
jedisException.printStackTrace();
} finally {
subscriber.close();
}
} }
}, "Redis Subscriber").start(); }, "Redis Subscriber").start();
} }

Loading…
Cancel
Save