Mojolicious 2.20以上のMojolicious::LiteのWebSocketとAnyEvent::Twitter::Streamを共存させるにはuse Mojolicious::Lite;を先に書く
先日から、Mojolicious 2.20にしたら、AnyEvent::Twitter::Streamが使われているとWebSocketが動かない問題に悩まされ、とりあえず本稼働が優先だったのでMojolicious 2.19で開発をしていた案件がとりあえず終わり、原因究明ということで、とりあえずMojoliciousをアップデートしたら、2.36まで進んでいた。進みすぎ!
そんで、いくらバージョンの進みが早すぎるからといっても、ドキュメントに書いてあるサンプルスクリプトが動かなくなるようなことはあるめえ、ということで、
http://search.cpan.org/~sri/Mojolicious-2.36/lib/Mojolicious/Guides/Cookbook.pod
を見て、WebSocketの場所に書いてあるプログラム
use Mojolicious::Lite;
# Template with browser-side code
get '/' => 'index';
# WebSocket echo service
websocket '/echo' => sub {
my $self = shift;
# Connected
$self->app->log->debug('WebSocket connected.');
# Incoming message
$self->on(message => sub {
my ($self, $message) = @_;
$self->send_message("echo: $message");
});
# Disconnected
$self->on(finish => sub {
my $self = shift;
$self->app->log->debug('WebSocket disconnected.');
});
};
app->start;
__DATA__
@@ index.html.ep
<!DOCTYPE html>
<html>
<head><title>Echo</title></head>
<body>
<script>
var ws = new WebSocket('<%= url_for('echo')->to_abs %>');
// Incoming messages
ws.onmessage = function(event) {
document.body.innerHTML += event.data + '<br/>';
};
// Outgoing messages
window.setInterval(function() {
ws.send('Hello Mojo!');
}, 1000);
</script>
</body>
</html>
を実行してみると、これは動いた。
これの先頭に、
use AnyEvent::Twitter::Stream;
を入れるだけで、WebSocket接続が勝手にcloseされてしまう。
で、いろいろ試行錯誤をした結果、
use Mojolicious::Lite; use AnyEvent::Twitter::Stream;
の順番に書くと、Mojolicious 2.20以上でもWebSocket接続が切れないことがわかりました!
これで、やっと最新のMojolicious環境でもAnyEvent::Twitter::Streamと、Mojolicious::LiteのWebSocketが共存できるようになりました!
ただし……今のところ、daemonで動くことは確認できているのですが、hypnotoadで動かすとだめみたいです。どうしたらいいんだろうなあ。
トラックバック
この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/19018/53422159
この記事へのトラックバック一覧です: Mojolicious 2.20以上のMojolicious::LiteのWebSocketとAnyEvent::Twitter::Streamを共存させるにはuse Mojolicious::Lite;を先に書く:

![すぐ解決!DTPトラブル対策ブック―最強最後のOS9(+OSX)ガイド [単行本]](http://ec2.images-amazon.com/images/I/51895BQKEPL._SL500_AA208_.jpg)








