Rinda::TupleSpace を公開したくない時に不都合が
class Server def initialize @ts = Rinda::TupleSpace.new end def get(name) @ts.take([name]) end end DRb.start_service(nil, Server.new)
きれいなインターフェースのために、上記のようなTupleSpaceを直接公開しないコードを書きたいのだが、接続切れ対策のためTupleSpaceProxyと同じことをしようとすると困る。TupleSpaceProxyは
class TupleSpaceProxy def take(tuple, sec=nil, &block) port = [] @ts.move(DRbObject.new(port), tuple, sec, &block) port[0] end end
このようなことをやっていて、元のTupleSpaceとportが別々のサーバにあるので接続が切れた場合moveが失敗してくれるわけなんだけど、最初のコードのようにローカルでTupleSpaceを保持しているとそうはできない。
module Client def port DRbObject.new([]) end end class Server def initialize @ts = Rinda::TupleSpace.new end def get(client, name) port = client.port @ts.move(port, [name]) port[0] end end
みたいに、takeをつかう時は必ずリモートのオブジェクトを引数に渡すように強制する、というのを考えたんだけど、ちょっと汚い感じ。引数で渡さなくても呼び出し元を特定する方法がありそうなものだけど、よくわからない。良い案はありませんか。