2008年11月17日月曜日

AppServerからの自Servletアクセス

先週末は、RmtWebプロジェクトのバグをほぼつぶした。しかし、実行してみるとAppServerにRenderをさせる場合も、Proxyをさせる場合もTimeoutが発生したりして思うように動作しない。(初回はまず間違いなく失敗するが、数回やると成功する、、、とか安定しない)
■Servlet仕様
RenderServlet JEditoPane を利用して他サイトのURLをRenderし画像として返すもの
例) xxx/scrn.render?url=http://xxx.example.com/yyy/zzpage.html

DelegateServlet Proxy的に動作し、指定のURLの出力をそのまま返すもの
例) xxx/scrn.wget?url=http://xxx.example.com/yyy/scrn.capt?Size=25

そこで、さらに切り替えを増やして直接画面キャプチャを指定できるようにした。
外部ネットからだとアクセス不可になってしまうが、安定した。

■不安定な理由の推定
1)Render:
SwingのイベントモデルはSingleのため、HTTP接続で待ちが発生するとすべてが待ちになってしまう。
これは、通常のJEditoPaneがHTMLの解釈と要素のDonwloadが非同期であり、終了したことを検知しにくいことから、同期式の取得に変更した場合に発生した。
 もともとのJEditorPaneでは非同期でHTMLを解釈するために、上記のような詰まりは発生しないと思われるが、今度は画像リンクの解釈がうまくいかなかった。たとえば、xxx/scrn.capt で、「PNG画像」が来るのだが、これを画像と認識してくれず変な表示となる。同期式に変えた場合にはきちんと表示できるので、JEditorPaneのバグっぽい。

2)Proxy:
AppServerのServletから自分自身へHTTP接続することになるのだが、これが問題のようで、頻繁にConnectionTimeoutする。リトライするようにコードを追加したが、ちょっとましになった程度で安定せず。Servletのスレッドから自AppServerの他ServletへのNetアクセスに制限があるのかもしれない。

0 件のコメント: