У меня есть приложение java, которое использует jsmpp-библиотеку для отправки SMS-сообщений в SMSC. Приложение успешно подключается и отправляет SMS-сообщения. Проблема с подключением происходит через неделю или около того, в это время он отправляет тысячи SMS-сообщений. Но внезапно через несколько дней приложение начинает сталкиваться с проблемами подключения, некоторое время «Отрицательный ответ на связывание 0x00045» и некоторое время ожидания ответа на связывание. Когда я проверяю из wirehark, приложение постоянно отправляет запрашиваемые линейные пакеты и получает ответы для них со статусом «ОК». Это означает, что приложение подключено, но все же оно пытается для нового соединения. Ниже приведен код для управления подключением.Проблема связывания с сервером smpp с использованием jsmpp
Я называю метод newSession, чтобы получить сеанс для отправки SMS ..
private SMPPSession newSession(BindParameter bindParam) {
SMPPSession tmpSession = null;
dbOperations = new DBOperations();
Settings settings = dbOperations.getSettings();
if (settings == null)
logger.error("ERROR: No settings found to connect to SMSC!");
else {
try {
tmpSession = new SMPPSession(remoteIpAddress, remotePort, bindParam);
tmpSession.addSessionStateListener(new MySessionStateListener());
tmpSession.setMessageReceiverListener(new DeliverReceiptListener());
tmpSession.setEnquireLinkTimer(50000);
tmpSession.setTransactionTimer(5000L);
logger.info("New session established with " + remoteIpAddress + " on port " + remotePort + " as Transmitter");
} catch (Exception er) {
gateway=null;
logger.error("Exception Occurred While making Connection with SMPP Server with IP: " + remoteIpAddress + " and port " + remotePort+" and Error is:"+er.getMessage());
}
}
return tmpSession;
}
public void reconnectAfter(final long timeInMillis) {
final Settings settings = dbOperations.getSettings();
if (settings == null) {
logger.error("No settings found to connect to SMSC!");
return;
}
new Thread() {
@Override
public void run() {
logger.info("Schedule reconnect after " + timeInMillis + " milliseconds");
try {
Thread.sleep(timeInMillis);
} catch (InterruptedException e) {
logger.error(e.getMessage());
}
int attempt = 0;
while (session == null || session.getSessionState().equals(SessionState.CLOSED)) {
try {
logger.info("Reconnecting attempt #" + (++attempt) + "...");
session = newSession(bindParam);
} catch (Exception e) {
logger.error("Failed opening Transmitter connection and bind to " + remoteIpAddress + ":" + remotePort + " ");
logger.error(e.getMessage());
// wait for a second
try {
Thread.sleep(reconnectInterval);
} catch (InterruptedException ee) {
logger.error(e.getMessage());
}
}
}
}
}.start();
}
private class MySessionStateListener implements SessionStateListener {
public void onStateChange(SessionState newState, SessionState oldState, Object o) {
if (newState.equals(SessionState.OPEN)) {
logger.info("TCP connection established with SMSC at address " + remoteIpAddress);
}
if (newState.equals(SessionState.BOUND_TRX)) {
logger.info("SMPP Transceiver connection established with SMSC at address " + remoteIpAddress + " and port " + remotePort);
}
if (newState.equals(SessionState.CLOSED) || newState.equals(SessionState.UNBOUND)) {
logger.error("Connection closed, either by SMSC or there is network problem");
if(newState.equals(SessionState.CLOSED))
logger.error("Connection closed");
else
logger.error("Connection unbound");
logger.info("Reconnecting.......");
reconnectAfter(reconnectInterval);
}
}
}
Я не знаю почему этот код повторит для свежего соединения, когда он уже подключен. Любой ключ приветствуется.
Если сеанс по-прежнему действителен, то почему reconnectAfter метод вызывается из SessionStateListener, вы предлагаете какие-либо изменения в вышеприведенном коде? Как я могу узнать, есть ли какие-либо сеансы зомби? – sikander