0

我有一个网络服务,可以接收一条要发送的短信。一条 SMS = 一个 HTTP 呼叫。

那是: http://.../my-ws/?to=56998180333&body=blabla

该网络服务使用 SMSLib,并附加了一个 JSMPPGateway:

        JSMPPGateway gateway = new JSMPPGateway(systemType, ip, port, new BindAttributes(username, password, "cp", BindType.TRANSMITTER));

        Service.getInstance().addGateway(gateway);

这是一次完成,因为 getInstance() 就像一个单例。

当我发送短信时,我这样做:

public void send(String toMobile, String body) {    
    if ( Service.getInstance().getServiceStatus() != ServiceStatus.STARTED ) {
        myLog.append("ERR: Sending error. Failed to get instance\n");
        return;
    }

    try  {
        OutboundMessage outboundMessage = new OutboundMessage(toMobile, body);
        Service.getInstance().sendMessage(outboundMessage);

        if (outboundMessage.getRefNo().equals("")){
            myLog.append("ERR: Sending error. No RefNo was assigned after calling sendMessage\n");
            myLog.append("getFailureCause(): "+ outboundMessage.getFailureCause() +"\n");
            myLog.append("getMessageStatus(): "+ outboundMessage.getMessageStatus() +"\n");

            return;
        }

        myLog.append("OK: sent, refNo "+ outboundMessage.getRefNo() +"\n");

    } catch (GatewayException e)  {
        myLog.append("ERR: Sending error. GatewayException: "+ e +"\n");
    }  catch (TimeoutException e) {
        myLog.append("ERR: Sending error. TimeoutException: "+ e +"\n");
    }  catch (IOException e) {
        myLog.append("ERR: Sending error. IOException: "+ e +"\n");
    } catch (InterruptedException e) {
        myLog.append("ERR: Sending error. InterruptedException: "+ e +"\n");
    } catch (Exception e) {
        myLog.append("ERR: Sending error. Exception: "+ e +"\n");
    }
}

这通常工作正常。
连接始终保持打开状态,并且通过该方法发送 SMS。如果应用程序空闲时间过长,它将以新的 http 请求开始,并且连接将再次打开。那里没问题。

问题是当 outboundMessage 在 sendMessage() 之后没有 refNo 时。
不抛出异常,并返回此日志:

ERR: Sending error. No RefNo was assigned after calling sendMessage<br>
getFailureCause(): NO_ROUTE<br>
getMessageStatus(): FAILED

发生该错误后,所有以下 SMS 都会引发相同的 NO_ROUTE 错误(所有发送调用)

我通过重新启动应用程序来解决这个问题(也就是说,服务的实例再次启动,JSMPPGateway 被创建并再次附加,等等)。

还有其他更好的方法来解决这个问题吗?例如,以编程方式仅重新启动 JSMPPGateway 连接。

4

0 回答 0