本対応Plaggerを0.7.17(2006/12/5版)以降で反映済みで古新聞化しました。
一昨日plaggerをインストールしてlivedoor2gmail.yamlで正常動作した。しかし、問題が発生した。
Plagger::Plugin::Subscription::LivedoorReader [info] You have 200 unread item(s) on livedoor Reader. Plagger::Plugin::Publish::Gmail [info] Sending void GraphicWizardsLair( void ); // to fugafuga@gmail.com Error: Timeout at C:/Perl/site/lib/Plagger/Plugin/Publish/Gmail.pm line 246 Error: Timeout at C:/Perl/site/lib/Plagger/Plugin/Publish/Gmail.pm line 246 Error: Timeout at C:/Perl/site/lib/Plagger/Plugin/Publish/Gmail.pm line 246 Error: Timeout at C:/Perl/site/lib/Plagger/Plugin/Publish/Gmail.pm line 246
新規にLivedoorReaderに追加したフィードを送信しようとするとTimeoutエラーになってしまう。どうもこの問題は特定のサイトのフィードの問題ではなくアイテム数の問題のようだ。上記例は200件だが、160件くらいの複数フィード累計アイテム数でも発生した。5件くらいのアイテム数なら何も問題ない。
閾値がどこら辺か分からないが、「送信量が多い」->「送信負荷がかかる」->「Timeoutの閾値を越える」->「エラー発生」という感じなのだろうと思う。もし、そうであるなら送信量を減らすために実行間隔を狭めるか、Timeoutの閾値を大きくするかが解決策と考える。前者は妥協した感じであまり嬉しくないので、後者での解決を図ろうとした。Gmail.pmの246行目というと以下のように書かれている。
244 @MIME::Lite::SMTP::TLS::ISA = qw( Net::SMTP::TLS ); 245 sub MIME::Lite::SMTP::TLS::print { shift->datasend(@_) }
怪しいと思ったのは、C:\Perl\site\lib\MIME\Lite.pmの226行目にある以下の指定値だ。
224 ### Do something like this in your 'main':
225 if ($I_DONT_HAVE_SENDMAIL) {
226 MIME::Lite->send('smtp', "smtp.myisp.net", Timeout=>60);
227 }
試しにこんなことをしてみたが、効果なし。
224 ### Do something like this in your 'main':
225 if ($I_DONT_HAVE_SENDMAIL) {
226 MIME::Lite->send('smtp', "smtp.myisp.net", Timeout=>300);
227 # MIME::Lite->send('smtp', "smtp.myisp.net", Timeout=>60);
227 }
………ここはただのperldocの部分だな。相当激烈にアホなことをした。顔から火が出そうだが自爆スキーなので経緯を晒しておく。にしても、どこで指定してるんだ。うーん。C:\Perl\site\lib\Net\SMTP\TLS.pmに余裕のあるTimeout値を与えれば何とかなるのかもとか思うがサッパリ分からん。検索しても同じようなことで困ったなんて話は引っかからないしなあ。
我慢するしかないのか。orz
Gmail.pmの中をジーっと訳分からんなり見てみると、109行目にある
$msg->send_by_smtp_tls(@{ $self->{tls_args} });
で、SMTP_TLSでの送信に関する引数を与えている。send_by_smtp_tlsは204行目に# hack MIME::Lite to support TLS Authenticationとある。MIME::LiteにTLS認証を出来るようNet::SMTP::TLSと組み合わせて拡張しているっぽい。tls_argsをいじってみることにして108行目を追加してこう書いてみた。
103 $self->{tls_args} = [
104 $route->{host},
105 User => $route->{username},
106 Password => $route->{password},
107 Port => $route->{port} || 587,
108 Timeout => $route->{timeout} || 300,
109 ];
上の行の猿真似でtimeout値を300秒とした。お。200件item送ってもエラー出なくなったぞ。これでええのんか?うーん。微妙。問題が起きたとき外せるように覚書しとこう。
真似する人はいないと思うが注意書き。訳分からないのに試しでやっているので、上記を真似して困ったことが起こっても責任持てないよ。多分、108行目を削除するだけで元に戻ると思うけど…。
ここまででとりあえずの問題を解決したと安心していたらこんなエラーが表示された。
Plagger::Plugin::Subscription::LivedoorReader [info] You have 11 unread item(s) on livedoor Reader. JSON::Syck parser (line 12, column 15): syntax error at C:/Perl/site/lib/Plagger /Plugin/Subscription/LivedoorReader.pm line 154.
うわー。またかよう。ご勘弁願いますよ、ホント…とか思って、やおらLivedoorReader.pmの該当個所を見るもサッパリ分からん。
153 if ($self->{mech}->status == 200) {
154 return JSON::Syck::Load($self->{mech}->content);
155 }
仕方ないのでLivedoorReaderを直接ブラウザで見に行ったら、諸般の事情でメンテナンス中とのこと。plagger側の問題じゃなくて良かった。
接続サービス サーバメンテナンスのお知らせ
2006年11月22日
平素より、livedoor 接続サービスをご利用くださいまして、誠にありがとうございます。下記の日程で、サーバのメンテナンスを実施させていただくため一部のサービスをご利用いただけなくなります。ご迷惑をお掛けいたしますが、ご理解とご協力の程、よろしくお願い申し上げます。
- メンテナンス開始日時 2006年11月25日(土) 21:00
- メンテナンス終了予定日時 2006年11月26日(日) 05:00 予定
ただまあ、あれ。HTTPのレスポンスが200の場合リクエストOKとしてJSON::Syck::Loadをいきなりしてしまうのはまずいかもしれない。サービスとしてOKかどうかをもう一段チェックするような作りにしないとこういう状況には対応できない。まあ、こういう状況自体そうそう無いとは思うが…。どうしたものかな?
* Publish::Gmail: added timeout config for mailroute when used with SMTP-TLS*
で、gmail.pmの中身を見たら、このまま反映してる。公式?ええのんか?まあ、ダメだったらまたそのとき直せばいいし*1。300にこれといった確たる根拠無いけど、動くまでに何回か書き直して動作を試したので、多分妥当とは思う。今のとここの問題は再発していないし…(^^;;
ということで、この記事通りやるよりPlaggerを0.7.17以降にした方がいいです。他にもあれこれ変わっているし。
*1:後戻りできる修正なら、とりあえず行っとけで