-4

Apache Tomcat 6.0.36 で Web アプリを実行し、Windows 7 の Web ブラウザーに IE8 を使用しています。最近、Java ゼロデイ パッチ (Java 7 Update 11) を適用しました。

現在、すべての Web アプリケーションで白い画面が表示され、「Internet Explorer は Web ページを表示できません」というメッセージが表示されます。カタリナ ログ ファイルから取得したエラー メッセージを次に示します。

Jan 18, 2013 3:44:55 PM org.apache.catalina.startup.Catalina start
INFO: Server startup in 38198 ms
Jan 18, 2013 3:51:17 PM org.apache.tomcat.util.net.NioEndpoint setSocketOptions
SEVERE:
java.net.SocketException: Invalid argument: no further information
at sun.nio.ch.Net.setIntOption0(Native Method)
at sun.nio.ch.Net.setSocketOption(Unknown Source)
at sun.nio.ch.SocketChannelImpl.setOption(Unknown Source)
at sun.nio.ch.SocketAdaptor.setIntOption(Unknown Source)
at sun.nio.ch.SocketAdaptor.setTrafficClass(Unknown Source)
at org.apache.tomcat.util.net.SocketProperties.setProperties(SocketProperties.java:184)
at org.apache.tomcat.util.net.NioEndpoint.setSocketOptions(NioEndpoint.java:1089)
at org.apache.tomcat.util.net.NioEndpoint$Acceptor.run(NioEndpoint.java:1314)
at java.lang.Thread.run(Unknown Source)

これを修正する方法についてのアイデアは大歓迎です。

ありがとうございました。

4

1 に答える 1

3

理由は setTrafficClass 呼び出しで、同じ箇条書きを 1 回かみました。Java6 を使用して Tomcat プロセスを実行した場合は、動作するはずです。Windows のネットワーク スタック機能と関係があります。一部のアプリは属性「skipTrafficClass_call=true」を提供しますが、これはアプリケーションの動作の一部です。これは非常に古い問題ですが、Java7 は小さいながらも重要な変更を加えました。

インターネットからの引用:

「これらの問題の最初のものを追跡しました。socketChannel.connect() が呼び出された後に java.nio.channels.SocketChannel.socket().setTrafficClass() を呼び出すと、SocketException がトリガーされます。setTrafficClass() 呼び出しを接続前に移動します。 () 問題を修正します。」「 Java 6 でのテストでは、connect() の後に setTrafficClass() を呼び出しても効果がないことが示されています。Java 7 では、setter が効果がない場合に例外をスローし始めたようです。」

JDC の多くの開発者は、Windows 2000 および XP では ToS ビットが設定されていないことを示すコメントを投稿しています。これは setTrafficClass 実装のバグではなく、レジストリ設定を作成して IP_TOS オプションを有効にする必要があるということです。レジストリ設定は次のとおりです:-

HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Tcpip\Parameters\DisableUserTOSSetting

http://docs.oracle.com/javase/6/docs/api/java/net/Socket.html#setTrafficClass%28int%29

http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4696356

http://tomcat.10.n6.nabble.com/Tomcat-7-Cluster-Issue-td4562937.html

コネクター用の古い Http11Protocol ハンドラーを試すことができます。これは tomcat/conf/server.xml ファイルに記載されています。http(8080) および https(8443) コネクタの両方を変更します。

<!-- protocol: org.apache.coyote.http11.Http11Protocol, same as HTTP/1.1
           org.apache.coyote.http11.Http11NioProtocol
           org.apache.coyote.http11.Http11AprProtocol
-->
<Connector port="8080" protocol="org.apache.coyote.http11.Http11Protocol"
       connectionTimeout="20000" redirectPort="8443" 
       disableUploadTimeout="true" useBodyEncodingForURI="true" />

編集Tomcat 7.0.30+ で問題が修正されたようで、Windows+Java7+Tomcat7+NIO コネクタを使用できます。今後、すべての Java ネットワーク アプリは、接続を開く前にオプションのソケット オプションを設定する必要があります。Java6 はフリー パスを提供しましたが、Java7 は例外をスローします。 http://svn.apache.org/viewvc?view=revision&revision=1358591

于 2013-01-19T14:02:07.627 に答える