配信される SMS を 1 つ受信する Web サービスがあります。1 つの SMS = 1 つの HTTP 呼び出し。
あれは:
http://.../my-ws/?to=56998180333&body=blabla
この Web サービスは、JSMPPGateway が接続された SMSLib を使用します。
JSMPPGateway gateway = new JSMPPGateway(systemType, ip, port, new BindAttributes(username, password, "cp", BindType.TRANSMITTER));
Service.getInstance().addGateway(gateway);
getInstance() はシングルトンのように動作するため、これは 1 回実行されます。
SMS を送信するときは、次のようにします。
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 要求で開始され、接続が再び開かれます。問題ありません。
問題は、sendMessage() の後に outboundMessage に refNo がない場合です。
例外はスローされず、次のログが返されます。
ERR: Sending error. No RefNo was assigned after calling sendMessage<br>
getFailureCause(): NO_ROUTE<br>
getMessageStatus(): FAILED
そのエラーが発生した後、後続のすべての SMS で同じ NO_ROUTE エラーがスローされます (すべての呼び出しが送信されます)。
アプリケーションを再起動することでこれを解決します (つまり、サービスのインスタンスが再起動し、JSMPPGateway が作成されて再度アタッチされるなど)。
これを解決する他の良い方法はありますか?たとえば、プログラムによって JSMPPGateway 接続のみを再起動します。