openvidu-server: move KurentoConnectionListener creation to KmsManager

pull/375/head
pabloFuente 2019-06-13 12:18:13 +02:00
parent c37e777243
commit 4d32de7c19
2 changed files with 53 additions and 55 deletions

View File

@ -18,65 +18,12 @@
package io.openvidu.server.kurento.kms; package io.openvidu.server.kurento.kms;
import org.kurento.client.KurentoClient; import org.kurento.client.KurentoClient;
import org.kurento.client.KurentoConnectionListener;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import io.openvidu.server.kurento.core.KurentoSession;
import io.openvidu.server.kurento.core.KurentoSessionManager;
public class FixedOneKmsManager extends KmsManager { public class FixedOneKmsManager extends KmsManager {
private static final Logger log = LoggerFactory.getLogger(FixedOneKmsManager.class);
public FixedOneKmsManager(String kmsWsUri, LoadManager loadManager) { public FixedOneKmsManager(String kmsWsUri, LoadManager loadManager) {
super(loadManager); super(loadManager);
KurentoClient kClient = KurentoClient.create(kmsWsUri, this.generateKurentoConnectionListener(kmsWsUri));
KurentoClient kClient = KurentoClient.create(kmsWsUri, new KurentoConnectionListener() {
@Override
public void reconnected(boolean isReconnected) {
((KurentoSessionManager) sessionManager).getKmsManager().setKurentoClientConnectedToKms(kmsWsUri, true);
if (!isReconnected) {
// Different KMS. Reset sessions status (no Publisher or SUbscriber endpoints)
log.warn("Kurento Client reconnected to a different KMS instance, with uri {}", kmsWsUri);
log.warn("Updating all webrtc endpoints for active sessions");
final Kms kms = ((KurentoSessionManager) sessionManager).getKmsManager().kmss.get(kmsWsUri);
final long timeOfKurentoDisconnection = kms.getTimeOfKurentoClientDisconnection();
sessionManager.getSessions().forEach(s -> {
((KurentoSession) s).restartStatusInKurento(timeOfKurentoDisconnection);
});
kms.setTimeOfKurentoClientDisconnection(0);
} else {
// Same KMS. We may infer that openvidu-server/KMS connection has been lost, but
// not the clients/KMS connections
log.warn("Kurento Client reconnected to same KMS with uri {}", kmsWsUri);
}
}
@Override
public void disconnected() {
((KurentoSessionManager) sessionManager).getKmsManager().setKurentoClientConnectedToKms(kmsWsUri,
false);
((KurentoSessionManager) sessionManager).getKmsManager().setTimeOfKurentoClientDisconnection(kmsWsUri,
System.currentTimeMillis());
log.warn("Kurento Client disconnected from KMS with uri {}", kmsWsUri);
}
@Override
public void connectionFailed() {
((KurentoSessionManager) sessionManager).getKmsManager().setKurentoClientConnectedToKms(kmsWsUri,
false);
log.warn("Kurento Client failed connecting to KMS with uri {}", kmsWsUri);
}
@Override
public void connected() {
((KurentoSessionManager) sessionManager).getKmsManager().setKurentoClientConnectedToKms(kmsWsUri, true);
log.warn("Kurento Client is now connected to KMS with uri {}", kmsWsUri);
}
});
this.addKms(new Kms(kmsWsUri, kClient, loadManager)); this.addKms(new Kms(kmsWsUri, kClient, loadManager));
} }

View File

@ -24,12 +24,15 @@ import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import org.kurento.client.KurentoConnectionListener;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import io.openvidu.server.core.SessionManager; import io.openvidu.server.core.SessionManager;
import io.openvidu.server.kurento.core.KurentoSession;
import io.openvidu.server.kurento.core.KurentoSessionManager;
@Service @Service
public abstract class KmsManager { public abstract class KmsManager {
@ -63,7 +66,7 @@ public abstract class KmsManager {
protected LoadManager loadManager; protected LoadManager loadManager;
private final Logger log = LoggerFactory.getLogger(KmsManager.class); private static final Logger log = LoggerFactory.getLogger(KmsManager.class);
// Using KMS websocket uris as unique identifiers // Using KMS websocket uris as unique identifiers
protected Map<String, Kms> kmss = new ConcurrentHashMap<>(); protected Map<String, Kms> kmss = new ConcurrentHashMap<>();
@ -138,4 +141,52 @@ public abstract class KmsManager {
public boolean destroyWhenUnused() { public boolean destroyWhenUnused() {
return false; return false;
} }
protected KurentoConnectionListener generateKurentoConnectionListener(String kmsWsUri) {
return new KurentoConnectionListener() {
@Override
public void reconnected(boolean isReconnected) {
((KurentoSessionManager) sessionManager).getKmsManager().setKurentoClientConnectedToKms(kmsWsUri, true);
if (!isReconnected) {
// Different KMS. Reset sessions status (no Publisher or SUbscriber endpoints)
log.warn("Kurento Client reconnected to a different KMS instance, with uri {}", kmsWsUri);
log.warn("Updating all webrtc endpoints for active sessions");
final Kms kms = ((KurentoSessionManager) sessionManager).getKmsManager().kmss.get(kmsWsUri);
final long timeOfKurentoDisconnection = kms.getTimeOfKurentoClientDisconnection();
sessionManager.getSessions().forEach(s -> {
((KurentoSession) s).restartStatusInKurento(timeOfKurentoDisconnection);
});
kms.setTimeOfKurentoClientDisconnection(0);
} else {
// Same KMS. We may infer that openvidu-server/KMS connection has been lost, but
// not the clients/KMS connections
log.warn("Kurento Client reconnected to same KMS with uri {}", kmsWsUri);
}
}
@Override
public void disconnected() {
((KurentoSessionManager) sessionManager).getKmsManager().setKurentoClientConnectedToKms(kmsWsUri,
false);
((KurentoSessionManager) sessionManager).getKmsManager().setTimeOfKurentoClientDisconnection(kmsWsUri,
System.currentTimeMillis());
log.warn("Kurento Client disconnected from KMS with uri {}", kmsWsUri);
}
@Override
public void connectionFailed() {
((KurentoSessionManager) sessionManager).getKmsManager().setKurentoClientConnectedToKms(kmsWsUri,
false);
log.warn("Kurento Client failed connecting to KMS with uri {}", kmsWsUri);
}
@Override
public void connected() {
((KurentoSessionManager) sessionManager).getKmsManager().setKurentoClientConnectedToKms(kmsWsUri, true);
log.warn("Kurento Client is now connected to KMS with uri {}", kmsWsUri);
}
};
}
} }