package org.mobicents.tools.sip.balancer;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.util.ArrayList;
import java.util.Timer;
import java.util.TimerTask;
import java.util.concurrent.atomic.AtomicBoolean;
import org.mobicents.tools.heartbeat.api.SIPNode;
import org.mobicents.tools.heartbeat.rmi.NodeRegisterRMIStub;
import javax.sip.SipProvider;
import javax.sip.message.Response;
public class AppServerWithRmi extends AppServer {
Timer timer;
int port;
String name;
SIPNode appServerNode;
public boolean sendHeartbeat = true;
String lbAddress;
int lbRMIport;
int lbSIPext;
int lbSIPint;
String transport;
protected String balancers;
public SipProvider sipProvider;
public String version;
AtomicBoolean stopFlag = new AtomicBoolean(false);
boolean isDummy;
boolean isMediaFailure;
boolean isFirstStart = true;
boolean isIpv6 = false;
public AppServerWithRmi(String appServer, int port, String lbAddress, int lbRMI, int lbSIPext, int lbSIPint, String version , String transport)
{
super();
this.port = port;
this.name = appServer;
this.lbAddress = lbAddress;
this.lbRMIport = lbRMI;
this.lbSIPext = lbSIPext;
this.lbSIPint = lbSIPint;
this.version = version;
this.transport=transport;
}
public AppServerWithRmi(boolean isIpv6,String appServer, int port, String lbAddress, int lbRMI, int lbSIPext, int lbSIPint, String version , String transport)
{
this(appServer, port, lbAddress, lbRMI, lbSIPext, lbSIPint, version , transport);
this.isIpv6 = true;
}
public AppServerWithRmi(String appServer, int port, String lbAddress, int lbRMI, int lbSIPext, int lbSIPint, String version , String transport, boolean isDummy)
{
this(appServer, port, lbAddress, lbRMI, lbSIPext, lbSIPint, version , transport);
this.isDummy = isDummy;
}
public AppServerWithRmi(String appServer, int port, String lbAddress, int lbRMI, int lbSIPext, int lbSIPint, String version , String transport, boolean isDummy, boolean isMediaFailure)
{
this(appServer, port, lbAddress, lbRMI, lbSIPext, lbSIPint, version , transport);
this.isDummy = isDummy;
this.isMediaFailure = isMediaFailure;
}
public void setBalancers(String balancers) {
this.balancers = balancers;
}
public void setEventListener(EventListener listener) {
sipListener.eventListener = listener;
}
public void start() {
timer = new Timer();
protocolObjects = new ProtocolObjects(name, "gov.nist", transport, false, false, true);
if(!isDummy)
{
if(!isMediaFailure||!isFirstStart)
{
sipListener = new TestSipListener(isIpv6,port, lbSIPint, protocolObjects, false);
}
else
{
sipListener = new TestSipListener(isIpv6,port, lbSIPint, protocolObjects, false);
sipListener.setRespondWithError(Response.SERVICE_UNAVAILABLE);
}
}
else
{
sipListener = new TestSipListener(isIpv6,port+1, lbSIPint, protocolObjects, false);
}
sipListener.appServer = this;
try {
sipProvider = sipListener.createProvider();
sipProvider.addSipListener(sipListener);
protocolObjects.start();
} catch (Exception e) {
e.printStackTrace();
}
if(!isIpv6)
appServerNode = new SIPNode(name, "127.0.0.1");
else
appServerNode = new SIPNode(name, "::1");
appServerNode.getProperties().put(transport.toLowerCase() + "Port", port);
appServerNode.getProperties().put("version", version);
appServerNode.getProperties().put("sessionId", ""+System.currentTimeMillis());
stopFlag.set(false);
timer.schedule(new TimerTask() {
@Override
public void run() {
try {
ArrayList<SIPNode> nodes = new ArrayList<SIPNode>();
nodes.add(appServerNode);
appServerNode.getProperties().put("version", version);
if(!stopFlag.get())
sendKeepAliveToBalancers(nodes);
} catch (Exception e) {
e.printStackTrace();
}
}
}, 1000, 1000);
}
public void stop() {
isFirstStart = false;
stopFlag.getAndSet(true);
timer.cancel();
if(protocolObjects != null)
protocolObjects.sipStack.stop();
protocolObjects=null;
//sendCleanShutdownToBalancers();
}
private void sendKeepAliveToBalancers(ArrayList<SIPNode> info) {
if(sendHeartbeat) {
Thread.currentThread().setContextClassLoader(NodeRegisterRMIStub.class.getClassLoader());
if(balancers != null) {
for(String balancer:balancers.replaceAll(" ","").split(",")) {
if(balancer.length()<2) continue;
String host;
String port;
int semi = balancer.indexOf(':');
if(semi>0) {
host = balancer.substring(0, semi);
port = balancer.substring(semi+1);
} else {
host = balancer;
port = "2000";
}
try {
Registry registry = LocateRegistry.getRegistry(host, Integer.parseInt(port));
NodeRegisterRMIStub reg=(NodeRegisterRMIStub) registry.lookup("SIPBalancer");
reg.handlePing(info);
} catch (Exception e) {
e.printStackTrace();
}
}
} else {
try {
Registry registry = LocateRegistry.getRegistry(lbAddress, lbRMIport);
NodeRegisterRMIStub reg=(NodeRegisterRMIStub) registry.lookup("SIPBalancer");
reg.handlePing(info);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
public void sendCleanShutdownToBalancers() {
ArrayList<SIPNode> nodes = new ArrayList<SIPNode>();
nodes.add(appServerNode);
sendCleanShutdownToBalancers(nodes);
}
public void sendCleanShutdownToBalancers(ArrayList<SIPNode> info) {
Thread.currentThread().setContextClassLoader(NodeRegisterRMIStub.class.getClassLoader());
try {
Registry registry = LocateRegistry.getRegistry(lbAddress, lbRMIport);
NodeRegisterRMIStub reg=(NodeRegisterRMIStub) registry.lookup("SIPBalancer");
reg.forceRemoval(info);
stop();
Thread.sleep(2000); // delay the OK for a while
} catch (Exception e) {
e.printStackTrace();
}
}
public TestSipListener getTestSipListener() {
return this.sipListener;
}
// public SIPNode getNode() {
// return appServerNode;
// }
public void gracefulShutdown()
{
appServerNode.getProperties().put("GRACEFUL_SHUTDOWN", "true");
}
}