- PR -

クラスタリング環境で画像表示させたい

投稿者投稿内容
@あまぎ
会議室デビュー日: 2006/08/25
投稿数: 11
投稿日時: 2006-09-04 21:27
質問させていただきます。

環境:Linux、j2sdk1.4.2_10、jakarta-tomcat-5.0.28

http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=33161&forum=12&0
のJSPファイルを使用して画像表示ができたのですが、
クラスタリングすると

java.util.NoSuchElementException
at javax.imageio.spi.FilterIterator.next(ServiceRegistry.java:804)
at javax.imageio.ImageIO$ImageWriterIterator.next(ImageIO.java:814)

のエラーが出てしまいます。最初のうちは表示されていたのですが、何かの拍子に表示されなくなってしまいました。クラスタを解除すると表示されます。
クラスタ機能はTomcat5の新機能を使用しています。サーバは2台でどちらも環境は同じです。

表示方法がわからず手詰まりとなってしまいました。
何かアドバイス等ございましたら、宜しくお願い致します。

[ メッセージ編集済み 編集者: @あまぎ 編集日時 2006-09-04 21:31 ]
nagise
ぬし
会議室デビュー日: 2006/05/19
投稿数: 1141
投稿日時: 2006-09-05 09:05
まず、NoSuchElementExceptionについて。
http://java.sun.com/j2se/1.5.0/ja/docs/ja/api/java/util/NoSuchElementException.html

スタックトレースからすると、ImageIOクラスから何かしらの
Iteratorを取得してループさせる際に回しすぎているのではないですか?
Iterator.next()を呼びすぎているなんてことはないでしょうか。
@あまぎ
会議室デビュー日: 2006/08/25
投稿数: 11
投稿日時: 2006-09-05 09:20
nagiseさん返答ありがとうございます。

Exceptionが発生している行は以下になるのですが、

http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=33161&forum=12&0
のコードで
ImageWriter writer = (ImageWriter)ite.next();

が該当するのですが、ループでまわしておらずこの1行のみとなります。
ImageIOの書き込みをpngにするとうまくいくのですが、freehepを利用して
gifの書き込みをするとうまくいかなくなります。
ただし、gifの書き込み自体はクラスタリングしなければ問題なくできます。

freehepを利用するとクラスタリングできない等の制限があるのでしょうか。。。
検索したのですが、特にバグ報告など見つからなかったので対応に困っています。
freehepが影響しているにしてもスタックトレースには何も出力されませんし、
出るのはNoSuchElementExceptionだけです。

他に何かアドバイス等ありませんでしょうか?
宜しくお願い致します。

[ メッセージ編集済み 編集者: @あまぎ 編集日時 2006-09-05 09:21 ]
nagise
ぬし
会議室デビュー日: 2006/05/19
投稿数: 1141
投稿日時: 2006-09-05 11:15
引用:

@あまぎさんの書き込み (2006-09-05 09:20) より:
ImageWriter writer = (ImageWriter)ite.next();



たぶん、ite.hasNext()がfalseを返すのでしょうね。
ite.next()が必ず取得できると想定しているのはマズイ。
最低でも
コード:
if (ite.hasNext()) {
    ite.next();
} else {
    // 取得できなかった場合の処理
}


といった対応は必要です。エラー処理が適切にされていない。
しかし、ここではとりあえずソースの記述の話はひとまず置いておきましょう。

なにやら元スレッドと類似の原因があるのではないでしょうか。
少なくともImageIO.getImageWritersByFormatName()が
空のIteratorを返すのですから、該当のフォーマットに対応するImageWriterの
実装が見つけられないということは確かでしょう。
クラスタリングする過程でなんらかの設定ミスがあるのではないか、
と考えるのが自然なのではないでしょうか。

私はクラスタリングした際のクラスローダの挙動について調べたことがないので
この先はアドバイスできそうにありません。
@あまぎ
会議室デビュー日: 2006/08/25
投稿数: 11
投稿日時: 2006-09-05 11:27
nagiseさん回答ありがとうございます。

そうですね。エラー処理入れ忘れています。ご指摘ありがとうございます。
現状、問題解決が困難なので画像表示を別の方法で表示しようと考えています。

それで

ImageIcon icon = new ImageIcon("ここに画像のURL");

として、JSP内で

<img src="<%=icon%>">

としたらURLがそのまま表示されてしまいました。
セキュリティ上、URLがそのまま表示されるのはまずいので、

BufferedImage bimg = ImageIO.read("ここに画像のURL");
ImageIcon icon = new ImageIcon(bimg);

としたところ、生成されたHTMLには
<img src="javax.swing.ImageIcon@4e17f9">
となっていました。

URLが隠せればこの方法で行こうと思うのですが、
URLを表示せずにImageIconを使用してimgタグで出力というのはできないのでしょうか?

自分のほうでも検索等続けますが、なにかアドバイス等ございましたら宜しくお願い致します。

[ メッセージ編集済み 編集者: @あまぎ 編集日時 2006-09-05 11:40 ]
nagise
ぬし
会議室デビュー日: 2006/05/19
投稿数: 1141
投稿日時: 2006-09-05 12:02
引用:

@あまぎさんの書き込み (2006-09-05 11:27) より:
<img src="<%=icon%>">

としたらURLがそのまま表示されてしまいました。



HTMLというかHTTPというか、imgタグではsrcに表示対象のURLを
指定するモノなので、本質的には回避できません。
HTMLの読み込みとは別途通信が走ることになってますからね…。
ちなみに、単にObject型を<%= %>で書き出した場合は
Object.toString()の値が出力されます。

一時的な画像表示という目的であれば、ワンタイムURLのような
仕組みを作らざるを得ないのではないでしょうか。
(ワンタイムURLについては検索すれば情報はいくらでも出ます)
@あまぎ
会議室デビュー日: 2006/08/25
投稿数: 11
投稿日時: 2006-09-05 16:43
nagiseさんご回答ありがとうございます。

引用:
HTMLというかHTTPというか、imgタグではsrcに表示対象のURLを
指定するモノなので、本質的には回避できません。
HTMLの読み込みとは別途通信が走ることになってますからね…。
ちなみに、単にObject型を<%= %>で書き出した場合は
Object.toString()の値が出力されます。


なるほど。無理なんですね。。。
ワンタイムURLのロジックですが、このロジックを入れるところがどうにもありません。
ワンタイムURLを解析するアクションを挟むことが現段階ではできないのです。
これは相手の都合なのでしかたないのですが。。。
他に方法を探してみます。

とりあえず、このスレッドはクローズさせていただきます。
ありがとうございました。

[ メッセージ編集済み 編集者: @あまぎ 編集日時 2006-09-05 16:44 ]
さくらば
大ベテラン
会議室デビュー日: 2002/11/12
投稿数: 145
投稿日時: 2006-09-05 17:32
こんにちは、さくらばです。

引用:

Exceptionが発生している行は以下になるのですが、

http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=33161&forum=12&0
のコードで
ImageWriter writer = (ImageWriter)ite.next();

が該当するのですが、ループでまわしておらずこの1行のみとなります。
ImageIOの書き込みをpngにするとうまくいくのですが、freehepを利用して
gifの書き込みをするとうまくいかなくなります。



これはクラスタリング云々の問題ではなく、GIF の書き込みができるか
どうかという問題です。この next の戻り値は ImageWrite になるので
すが、該当する形式 (ここでは GIF) の ImageWriter がなければ、例
外が発生します。

GIF の書き込みは特許の問題があり、Java SE 単体では Java SE 6 から
しかできません。

他の方法として、Image I/O Tools 1.0_01 をインストールすれば、GIF
の書き込みもできるようになります。

http://java.sun.com/products/java-media/jai/downloads/download-iio-1_0_01.html
https://jai-imageio.dev.java.net/

もともと運用していたマシンに Image I/O Tools がインストールされて
いて、クラスタリングしているマシンにはインストールされていなかった
とうのが、たぶん原因だと思います。

スキルアップ/キャリアアップ(JOB@IT)