M.C.P.C.

―むり・くり―プラスコミュニケーション(更新終了)


| トップページ |

2011年12月 6日 22:45

Mojolicious 2.20以上のMojolicious::LiteのWebSocketとAnyEvent::Twitter::Streamを共存させるにはuse Mojolicious::Lite;を先に書く

このエントリーをはてなブックマークに追加 mixiチェック

先日から、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で動かすとだめみたいです。どうしたらいいんだろうなあ。

投稿 大野 義貴 [Perl] | |

トラックバック(0)

トラックバックURL: http://blog.dtpwiki.jp/MTOS/mt-tb.cgi/3792

コメントする