我有一个网络服务,可以接收一条要发送的短信。一条 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 连接。