2016-06-09 1 views
0

У меня есть приложение 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); 
      } 
     } 
    } 

Я не знаю почему этот код повторит для свежего соединения, когда он уже подключен. Любой ключ приветствуется.

ответ

1

Кажется, сессия все еще действительна. Убедитесь, что нет сеанса зомби, если есть, то все они будут закрыты. Это гарантирует, что ссылка на отправку ссылки прекратится.

+0

Если сеанс по-прежнему действителен, то почему reconnectAfter метод вызывается из SessionStateListener, вы предлагаете какие-либо изменения в вышеприведенном коде? Как я могу узнать, есть ли какие-либо сеансы зомби? – sikander

Смежные вопросы