return Observable.using(new Func0<XMPPTCPConnection>() {
@Override
public XMPPTCPConnection call() {
L.log("creating connection");
connection = _createConnection();
return connection;
}
}, new Func1<XMPPTCPConnection, Observable<?>>() {
@Override
public Observable<?> call(final XMPPTCPConnection connection) {
try {
_authenticate(connection, username, password);
} catch (Exception e) {
throw new RuntimeException(e);
}
return Observable.just(connection)
.repeatWhen(new RepeatWhenOperator(-1, 1000))
.map(new Func1<XMPPTCPConnection, Object>() {
@Override
public Object call(XMPPTCPConnection connection) {
if (!connection.isConnected()) {
throw new RuntimeException("Disconnected");
}
return null;
}
});
}
}, new Action1<XMPPTCPConnection>() {
@Override
public void call(XMPPTCPConnection connection) {
L.log("disposing");
_disconnect();
}
})
.subscribeOn(Schedulers.io())
.unsubscribeOn(Schedulers.io())
.retry();
好的,所以基於Observable.using()我想出了這個解決方案。它可以工作,但我對解決方案不滿意 - 即每秒查詢連接是否仍然存在。 XMPPTCPConnection爲我提供了一個關於連接何時死亡的監聽器,這似乎是一個更好的解決方案 - 只是不知道如何合併...
_disconnect()方法實際上意味着斷開連接並處理;在當前情況下它可能是一個可憐的名字,但導致拋出RuntimeException的斷開發生在這個系統之外。
任何想法或改進將大大appriciated!
通常TCP連接不會僅僅關閉自身,除非高層協議需要它。 TCP已經有了一些錯誤糾正機制,而它本身無法解決的任何問題通常都是一個真正的網絡問題。你確定,你不想在這裏依賴成熟的低層機制嗎? –
@SebastianS如果出現網絡中斷,則TCP將斷開連接。就我所知,在這個特定的實現中,在網絡再次可用後,它不會重新連接。 – travikk