前回のサンプルをいじってみます。
まずはcloseしたconnectionを保持しているのが良くないならそれを除去すればいい。
ということで、oncloseに以下の処理を加えてみる。
ws_conn.onclose do
i=0
connnections.each {|conn|
i=i+1
pp "Index : #{i} state ? #{conn.state}"
}
connnections.each{|conn| conn.send("Connect New Client : #{i+1}") }
connnections.each{|conn| conn.send("Reconnect Client : #{i}") }
end
普通に考えればoncloseで呼ばれた時点で既にstatusはclosedになっているはずで、そうなればそれをcollectionから除去してあげればいいはず
では実行です。
まずはクライアント3つ接続して、2つ目を閉じます。
'''
"Index : 1 state ? connected"
"Index : 2 state ? closed"
"Index : 3 state ? connected"
'''
やはり、この時点でclosedになっているようです。
後はコレを削除すればいい。
ということで、Rubyの文法調べながら試行錯誤して以下のように変更
ws_conn.onclose do
connnections.each {|conn|
if conn.state==:closed then
conn=nil
end
}
connnections.compact!
end
スレッドセーフであるかどうかはきちんと確認しないといけないけど、それはとりあえず、置いておくとして。。。。
Rubyの配列にはいろいろ便利な機能があって、配列の中身がnilの場合にcompactをすると
nilが除去されて、きれいになってくれるらしい。
ならば、connをnilしてしてあげればいいじゃない!
ということで、試してみる。
結果。。。。
配列が整理されていない。。。ダメポ。。。
最初と同じでブラウザ閉じてもcollectionのサイズがクリアされない。。。
なぜ???
とおもって、Javaらーな私が何気なく使っていた参照渡しの概念?とおもってみると
どうやら、Rubyは基本【値渡し】ということ。。。マジデカ。
ということで、それならばということで以下のコードに変更
ws_conn.onclose do
connnections.each_with_index {|conn, i|
if conn.state==:closed then
connnections.fill(nil, i, 1)
end
}
connnections.compact!
end
簡単に言うと、closedのものをnilにして、compactする。
3つブラウザを立ち上げて1つ閉じてもう1回開くと接続数は3と正しい数値が取れていた。
接続も切れてないし、とりあえず、これでcollectionの整理は出来たようだ。。。