0

我有一个使用 jsmpp 库将 SMS 发送到 SMSC 的 java 应用程序。应用程序连接成功并发送短信。连接问题发生在一周左右的正常运行时间后,在此正常运行时间它会发送数千条短信。但是几天后突然应用程序开始面临连接问题,有时是“负绑定响应 0x00045”,有时是等待绑定响应。当我从 Wireshark 检查时,应用程序不断发送查询线路数据包并接收状态为“OK”的响应。这意味着应用程序已连接,但仍在尝试新连接。下面是连接管理的代码。

我调用 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);
            }
        }
    }

我不知道为什么这段代码在已经连接时会重试新连接。任何线索表示赞赏。

4

1 回答 1

1

看来会话仍然有效。确保没有僵尸会话,如果有则关闭它们。它确保查询链接发送停止。

于 2016-06-13T08:09:18.540 回答