diff --git a/core/smpp-extensions/src/main/java/org/restcomm/smpp/EsmeCluster.java b/core/smpp-extensions/src/main/java/org/restcomm/smpp/EsmeCluster.java index 5428170..73f7b39 100644 --- a/core/smpp-extensions/src/main/java/org/restcomm/smpp/EsmeCluster.java +++ b/core/smpp-extensions/src/main/java/org/restcomm/smpp/EsmeCluster.java @@ -21,17 +21,22 @@ */ package org.restcomm.smpp; -import javolution.util.FastList; +import org.apache.log4j.Logger; import com.cloudhopper.smpp.SmppBindType; import com.cloudhopper.smpp.SmppSession; +import javolution.util.FastList; + /** * * @author Amit Bhayani * */ public class EsmeCluster { + + private final Logger LOG = Logger.getLogger(EsmeCluster.class); + private final String clusterName; private final FastList esmes = new FastList(); private final int networkId; @@ -83,24 +88,63 @@ void removeEsme(Esme esme) { * * @return */ - synchronized Esme getNextEsme() { + synchronized Esme getNextEsme(final boolean anUpdateIndex) { + int idx = index; + if (LOG.isDebugEnabled()) { + LOG.debug("Index: " + idx + ". Getting next ESME."); + } // TODO synchronized is correct here? for (int i = 0; i < this.esmesToSendPdu.size(); i++) { - this.index++; - if (this.index >= this.esmesToSendPdu.size()) { - this.index = 0; + idx++; + if (idx >= this.esmesToSendPdu.size()) { + idx = 0; } - Esme esme = this.esmesToSendPdu.get(this.index); + Esme esme = this.esmesToSendPdu.get(idx); if (esme.isBound()) { + if (LOG.isDebugEnabled()) { + LOG.debug("Index: " + idx + ". Using ESME: " + esme.getName() + "."); + } + if (anUpdateIndex) { + index = idx; + } return esme; } } - + if (LOG.isDebugEnabled()) { + LOG.debug("Index: " + idx + ". Next ESME not selected."); + } + if (anUpdateIndex) { + index = idx; + } return null; } + boolean hasMoreEsmes() { return (esmes.size() > 0); } + + @Override + public String toString() { + final int countAll = esmes.size(); + final int countEsmesForSending = esmesToSendPdu.size(); + final StringBuilder sb = new StringBuilder(); + sb.append(clusterName).append("["); + for (int i = 0; i < countAll; i++) { + sb.append(esmes.get(i).getName()); + if (i < countAll - 1) { + sb.append(","); + } + } + sb.append("]["); + for (int i = 0; i < countEsmesForSending; i++) { + sb.append(esmesToSendPdu.get(i).getName()); + if (i < countEsmesForSending - 1) { + sb.append(","); + } + } + sb.append("]"); + return sb.toString(); + } } diff --git a/core/smpp-extensions/src/main/java/org/restcomm/smpp/EsmeManagement.java b/core/smpp-extensions/src/main/java/org/restcomm/smpp/EsmeManagement.java index 44eab78..d015961 100644 --- a/core/smpp-extensions/src/main/java/org/restcomm/smpp/EsmeManagement.java +++ b/core/smpp-extensions/src/main/java/org/restcomm/smpp/EsmeManagement.java @@ -159,14 +159,14 @@ public Esme getEsmeByName(String esmeName) { } @Override - public Esme getEsmeByClusterName(String esmeClusterName) { - EsmeCluster esmeCluster = this.esmeClusters.get(esmeClusterName); + public Esme getEsmeByClusterName(final String esmeClusterName, final boolean anIndexUpdate) { + final EsmeCluster esmeCluster = this.esmeClusters.get(esmeClusterName); if (esmeCluster != null) { - return esmeCluster.getNextEsme(); + return esmeCluster.getNextEsme(anIndexUpdate); } return null; } - + protected Esme getEsmeByPrimaryKey(String SystemId, String host, int port, SmppBindType smppBindType) { // Check for actual SystemId, host and port diff --git a/core/smpp-extensions/src/main/java/org/restcomm/smpp/EsmeManagementMBean.java b/core/smpp-extensions/src/main/java/org/restcomm/smpp/EsmeManagementMBean.java index 763cb0b..b9be891 100644 --- a/core/smpp-extensions/src/main/java/org/restcomm/smpp/EsmeManagementMBean.java +++ b/core/smpp-extensions/src/main/java/org/restcomm/smpp/EsmeManagementMBean.java @@ -35,7 +35,7 @@ public interface EsmeManagementMBean { Esme getEsmeByName(String esmeName); - Esme getEsmeByClusterName(String esmeClusterName); + Esme getEsmeByClusterName(String esmeClusterName, boolean anIndexUpdate); Esme createEsme(String name, String systemId, String password, String host, int port, boolean chargingEnabled, String smppBindType, String systemType, String smppIntVersion, byte ton, byte npi, String address,