Net::STOMPモジュールを使って、メッセージのやりとりをしているのだけれど、時折、メッセージが処理されなくなることがある。メッセージの到達は、can_read()を使って、検出しているのだが、この can_read()が、そこに受信可能なメッセージがあるのに、falseを返してくるのだ。
実際ためしに、can_read()が falseを返したところで、receive_frame()をかけると、メッセージが出てくる。おそらくは、can_read()が、バッファリングされている部分を適切に扱えていない……つまりは perlのIO::HandleとIO::Selectの実装の問題のような気がするのだけれど、コレをどうにかしないことには始まらない。
Net::STOMPは 0.33まで、can_read()がかかってくると、受信可能なメッセージは全部受信しちゃって、内部のlistにため込んで、ここから順繰りに吐き出すという、自前バッファリングをしていたのだけれど、0.34で、このあたりは全部 IO系のライブラリに任せる形に変わった。
バッファリングが悪いのだとすれば、sysread()で読み出して、バッファをバイパスするようにすればいいのだが、今度はそうすると、IO::Selectが上手いこと、これを検知してくれない。
使っているシステムは、aio_read()がどうも上手く使えないようで、いずれにしても、read()はブロックされてしまう。八方ふさがりになってきた。要するに perlを捨てればいいという話もあるが……。
コメント