Search in sources :

Example 1 with KeySmpp

use of org.mobicents.tools.sip.balancer.KeySmpp in project load-balancer by RestComm.

the class ClientConnectionImpl method packetReceived.

@Override
public void packetReceived(Pdu packet) {
    switch(clientState) {
        case INITIAL:
        case OPEN:
            logger.error("LB received packet (" + packet + ") in initial or open state from " + channel.getRemoteAddress().toString() + " sessionId : " + sessionId);
            break;
        case BINDING:
            Boolean correctPacket = false;
            switch(config.getType()) {
                case TRANSCEIVER:
                    if (packet.getCommandId() == SmppConstants.CMD_ID_BIND_TRANSCEIVER_RESP)
                        correctPacket = true;
                    break;
                case RECEIVER:
                    if (packet.getCommandId() == SmppConstants.CMD_ID_BIND_RECEIVER_RESP)
                        correctPacket = true;
                    break;
                case TRANSMITTER:
                    if (packet.getCommandId() == SmppConstants.CMD_ID_BIND_TRANSMITTER_RESP)
                        correctPacket = true;
                    break;
            }
            if (!correctPacket)
                logger.error("Received invalid packet in binding state, packet type: " + packet.getName());
            else {
                if (packet.getCommandStatus() == SmppConstants.STATUS_OK) {
                    if (logger.isDebugEnabled())
                        logger.debug("LB received bind response (" + packet + ") from " + channel.getRemoteAddress().toString() + ". sessionId : " + sessionId);
                    clientState = ClientState.BOUND;
                    lbClientListener.bindSuccesfull(sessionId, packet);
                } else {
                    logger.error("Binding to " + channel.getRemoteAddress().toString() + " is unsuccesful. sessionId" + sessionId + " , error code: " + packet.getCommandStatus());
                    lbClientListener.bindFailed(sessionId, packet);
                    closeChannel();
                    clientState = ClientState.CLOSED;
                }
            }
            break;
        case BOUND:
            correctPacket = false;
            switch(packet.getCommandId()) {
                case SmppConstants.CMD_ID_CANCEL_SM_RESP:
                case SmppConstants.CMD_ID_DATA_SM_RESP:
                case SmppConstants.CMD_ID_QUERY_SM_RESP:
                case SmppConstants.CMD_ID_REPLACE_SM_RESP:
                case SmppConstants.CMD_ID_SUBMIT_SM_RESP:
                case SmppConstants.CMD_ID_SUBMIT_MULTI_RESP:
                    if (logger.isDebugEnabled())
                        logger.debug("LB received SMPP response (" + packet + ") from " + channel.getRemoteAddress().toString() + ". sessionId: " + sessionId);
                    Integer originalSequence = sequenceMap.remove(packet.getSequenceNumber());
                    if (originalSequence != null) {
                        packet.setSequenceNumber(originalSequence);
                        correctPacket = true;
                        this.lbClientListener.smppEntityResponse(sessionId, packet);
                    }
                    break;
                case SmppConstants.CMD_ID_GENERIC_NACK:
                    if (logger.isDebugEnabled())
                        logger.debug("LB received generic nack (" + packet + ") from " + channel.getRemoteAddress().toString() + ". sessionId : " + sessionId);
                    correctPacket = true;
                    this.lbClientListener.smppEntityResponse(sessionId, packet);
                    break;
                case SmppConstants.CMD_ID_ENQUIRE_LINK_RESP:
                    if (logger.isDebugEnabled())
                        logger.debug("LB received enquire_link response from " + channel.getRemoteAddress().toString() + ". session ID : " + sessionId);
                    correctPacket = true;
                    isEnquireLinkSent = false;
                    connectionCheck.cancel();
                    // connectionCheckServerSideTimer.cancel(false);
                    this.lbClientListener.enquireLinkReceivedFromServer(sessionId);
                    break;
                case SmppConstants.CMD_ID_DATA_SM:
                case SmppConstants.CMD_ID_DELIVER_SM:
                    if (logger.isDebugEnabled())
                        logger.debug("LB received SMPP request (" + packet + ") from " + channel.getRemoteAddress().toString() + ". sessionId : " + sessionId);
                    correctPacket = true;
                    ServerTimerResponse response = new ServerTimerResponse(this, packet);
                    packetMap.put(packet.getSequenceNumber(), new TimerData(packet, monitorExecutor.schedule(response, timeoutResponse, TimeUnit.MILLISECONDS), response));
                    this.lbClientListener.smppEntityRequestFromServer(sessionId, packet);
                    break;
                case SmppConstants.CMD_ID_ENQUIRE_LINK:
                    if (logger.isDebugEnabled())
                        logger.debug("LB received enquire_link request from " + channel.getRemoteAddress().toString() + ". sessionId : " + sessionId);
                    correctPacket = true;
                    EnquireLinkResp resp = new EnquireLinkResp();
                    resp.setSequenceNumber(packet.getSequenceNumber());
                    sendSmppResponse(resp);
                    break;
                case SmppConstants.CMD_ID_UNBIND:
                    if (logger.isDebugEnabled())
                        logger.debug("LB received unbind request from " + channel.getRemoteAddress().toString() + ". sessionId : " + sessionId);
                    correctPacket = true;
                    response = new ServerTimerResponse(this, packet);
                    packetMap.put(packet.getSequenceNumber(), new TimerData(packet, monitorExecutor.schedule(response, timeoutResponse, TimeUnit.MILLISECONDS), response));
                    lbClientListener.unbindRequestedFromServer(sessionId, packet);
                    clientState = ClientState.UNBINDING;
                    break;
            }
            if (!correctPacket) {
                logger.error("LB received invalid packet in bound state. sessionId : " + sessionId + ". packet : " + packet);
            }
            break;
        case REBINDING:
            switch(packet.getCommandId()) {
                case SmppConstants.CMD_ID_BIND_RECEIVER_RESP:
                case SmppConstants.CMD_ID_BIND_TRANSCEIVER_RESP:
                case SmppConstants.CMD_ID_BIND_TRANSMITTER_RESP:
                    if (packet.getCommandStatus() == SmppConstants.STATUS_OK) {
                        if (logger.isDebugEnabled())
                            logger.debug("Connection reconnected to " + channel.getRemoteAddress().toString() + ". sessionId : " + sessionId);
                        this.lbClientListener.reconnectSuccesful(sessionId);
                        clientState = ClientState.BOUND;
                        if (invocationContext.activeNodeKey != null)
                            invocationContext.activeNodeKey = new KeySmpp((Node) new ArrayList(invocationContext.smppNodeMap.values()).get(0));
                    } else {
                        logger.debug("Reconnection to client unsuccessful. client session ID : " + sessionId + ". LB will close session!");
                        this.lbClientListener.unbindRequestedFromServer(sessionId, new Unbind());
                    }
            }
            break;
        case UNBINDING:
            correctPacket = false;
            if (packet.getCommandId() == SmppConstants.CMD_ID_UNBIND_RESP)
                correctPacket = true;
            if (!correctPacket)
                logger.error("LB received invalid packet (" + packet + ") form " + channel.getRemoteAddress().toString() + " in unbinding state. sessionId : " + sessionId);
            else {
                if (logger.isDebugEnabled())
                    logger.debug("LB received unbind response form  " + channel.getRemoteAddress().toString() + ". sessionId : " + sessionId);
                Integer originalSequence = sequenceMap.remove(packet.getSequenceNumber());
                if (originalSequence != null) {
                    packet.setSequenceNumber(originalSequence);
                    this.lbClientListener.unbindSuccesfull(sessionId, packet);
                }
                sequenceMap.clear();
                packetMap.clear();
                closeChannel();
                clientState = ClientState.CLOSED;
            }
            break;
        case CLOSED:
            logger.error("LB received packet (" + packet + ") in closed state from " + channel.getRemoteAddress().toString() + " sessionId : " + sessionId);
            break;
    }
}
Also used : AtomicInteger(java.util.concurrent.atomic.AtomicInteger) ServerTimerResponse(org.mobicents.tools.smpp.balancer.timers.ServerTimerResponse) KeySmpp(org.mobicents.tools.sip.balancer.KeySmpp) EnquireLinkResp(com.cloudhopper.smpp.pdu.EnquireLinkResp) TimerData(org.mobicents.tools.smpp.balancer.timers.TimerData) ArrayList(java.util.ArrayList) Unbind(com.cloudhopper.smpp.pdu.Unbind)

Example 2 with KeySmpp

use of org.mobicents.tools.sip.balancer.KeySmpp in project load-balancer by RestComm.

the class SmppToProviderActiveStandbyAlgorithm method processBindToProvider.

@Override
public Node processBindToProvider() {
    if (invocationContext.smppNodeMap.size() == 0)
        return null;
    if (invocationContext.activeNodeKey == null) {
        new ArrayList(invocationContext.smppNodeMap.values()).get(0);
        invocationContext.activeNodeKey = new KeySmpp((Node) new ArrayList(invocationContext.smppNodeMap.values()).get(0));
        return invocationContext.smppNodeMap.get(invocationContext.activeNodeKey);
    } else
        return invocationContext.smppNodeMap.get(invocationContext.activeNodeKey);
}
Also used : KeySmpp(org.mobicents.tools.sip.balancer.KeySmpp) Node(org.mobicents.tools.heartbeat.api.Node) ArrayList(java.util.ArrayList)

Example 3 with KeySmpp

use of org.mobicents.tools.sip.balancer.KeySmpp in project load-balancer by RestComm.

the class ClientConnectionImpl method rebind.

@Override
public void rebind() {
    if (logger.isDebugEnabled())
        logger.debug("LB tried to rebind to client " + channel.getRemoteAddress().toString() + ". sessionId : " + sessionId);
    if (invocationContext.activeNodeKey != null)
        invocationContext.activeNodeKey = new KeySmpp((Node) new ArrayList(invocationContext.smppNodeMap.values()).get(0));
    clientState = ClientState.REBINDING;
    this.lbClientListener.connectionLost(sessionId, bindPacket, node);
}
Also used : KeySmpp(org.mobicents.tools.sip.balancer.KeySmpp) ArrayList(java.util.ArrayList)

Example 4 with KeySmpp

use of org.mobicents.tools.sip.balancer.KeySmpp in project load-balancer by RestComm.

the class SmppToProviderRoundRobinAlgorithm method configurationChanged.

@Override
public void configurationChanged() {
    ConcurrentHashMap<KeySmpp, Node> newSmppNodeMap = new ConcurrentHashMap<KeySmpp, Node>();
    String[] s = balancerContext.lbConfig.getSmppConfiguration().getRemoteServers().split(",");
    String[] sTmp = new String[2];
    for (int i = 0; i < s.length; i++) {
        sTmp = s[i].split(":");
        Node currNode = new Node("SMPP server " + i, sTmp[0].trim());
        currNode.getProperties().put("smppPort", sTmp[1].trim());
        newSmppNodeMap.put(new KeySmpp(sTmp[0].trim(), Integer.parseInt(sTmp[1].trim())), currNode);
    }
    ConcurrentHashMap<KeySmpp, Node> removedSmppNodes = null;
    ConcurrentHashMap<KeySmpp, Node> addedSmppNodes = null;
    logger.info("Nodes removed : " + (removedSmppNodes = mapDifference(newSmppNodeMap, invocationContext.smppNodeMap)).values());
    for (KeySmpp key : removedSmppNodes.keySet()) invocationContext.smppNodeMap.remove(key);
    logger.info("Nodes added : " + (addedSmppNodes = mapDifference(invocationContext.smppNodeMap, newSmppNodeMap)).values());
    invocationContext.smppNodeMap.putAll(addedSmppNodes);
    logger.info("Updated SMPP node map after changing config file : " + invocationContext.smppNodeMap.values());
}
Also used : KeySmpp(org.mobicents.tools.sip.balancer.KeySmpp) Node(org.mobicents.tools.heartbeat.api.Node) ConcurrentHashMap(java.util.concurrent.ConcurrentHashMap)

Aggregations

KeySmpp (org.mobicents.tools.sip.balancer.KeySmpp)4 ArrayList (java.util.ArrayList)3 Node (org.mobicents.tools.heartbeat.api.Node)2 EnquireLinkResp (com.cloudhopper.smpp.pdu.EnquireLinkResp)1 Unbind (com.cloudhopper.smpp.pdu.Unbind)1 ConcurrentHashMap (java.util.concurrent.ConcurrentHashMap)1 AtomicInteger (java.util.concurrent.atomic.AtomicInteger)1 ServerTimerResponse (org.mobicents.tools.smpp.balancer.timers.ServerTimerResponse)1 TimerData (org.mobicents.tools.smpp.balancer.timers.TimerData)1