頻繁に、しかし断続的に「java.net.SocketException.Connection reset」エラーが発生します。Connection reset`のエラーがログに頻繁に現れます。この「Connection reset」エラーが実際にどこから来ているのか、どのようにデバッグすればよいのかがわかりません。
この問題は、送信しようとしているメッセージとは無関係のようです。 なお、このメッセージは 相手による接続リセット ではありません。
この例外の典型的な原因は何か、またどのように進めていけばよいか、ご意見をお聞かせください。
以下に代表的なスタックトレースを示します(com.companyname.mtix.sms
が我々のコンポーネントです)。
以下は代表的なスタックトレースです。
java.net.SocketException: Connection reset
at java.net.SocketInputStream.read(SocketInputStream.java:168)
at java.io.BufferedInputStream.fill(BufferedInputStream.java:218)
at java.io.BufferedInputStream.read(BufferedInputStream.java:235)
at org.apache.commons.httpclient.HttpParser.readRawLine(HttpParser.java:77)
at org.apache.commons.httpclient.HttpParser.readLine(HttpParser.java:105)
at org.apache.commons.httpclient.HttpConnection.readLine(HttpConnection.java:1115)
at org.apache.commons.httpclient.HttpMethodBase.readStatusLine(HttpMethodBase.java:1832)
at org.apache.commons.httpclient.HttpMethodBase.readResponse(HttpMethodBase.java:1590)
at org.apache.commons.httpclient.HttpMethodBase.execute(HttpMethodBase.java:995)
at org.apache.commons.httpclient.HttpMethodDirector.executeWithRetry(HttpMethodDirector.java:397)
at org.apache.commons.httpclient.HttpMethodDirector.executeMethod(HttpMethodDirector.java:170)
at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:396)
at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:324)
at com.companyname.mtix.sms.services.impl.message.SendTextMessage.sendTextMessage(SendTextMessage.java:127)
at com.companyname.mtix.sms.services.MessageServiceImpl.sendTextMessage(MessageServiceImpl.java:125)
at com.companyname.mtix.sms.services.remote.MessageServiceRemoteImpl.sendTextMessage(MessageServiceRemoteImpl.java:43)
at sun.reflect.GeneratedMethodAccessor203.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at org.apache.axis.providers.java.RPCProvider.invokeMethod(RPCProvider.java:397)
at org.apache.axis.providers.java.RPCProvider.processMessage(RPCProvider.java:186)
at org.apache.axis.providers.java.JavaProvider.invoke(JavaProvider.java:323)
at org.apache.axis.strategies.InvocationStrategy.visit(InvocationStrategy.java:32)
at org.apache.axis.SimpleChain.doVisiting(SimpleChain.java:118)
at org.apache.axis.SimpleChain.invoke(SimpleChain.java:83)
at org.apache.axis.handlers.soap.SOAPService.invoke(SOAPService.java:453)
at org.apache.axis.server.AxisServer.invoke(AxisServer.java:281)
at org.apache.axis.transport.http.AxisServlet.doPost(AxisServlet.java:699)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:709)
at org.apache.axis.transport.http.AxisServletBase.service(AxisServletBase.java:327)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
at com.companyname.mtix.sms.http.filters.NoCacheFilter.doFilter(NoCacheFilter.java:63)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
at com.companyname.mtix.sms.http.filters.MessageFilter.doFilter(MessageFilter.java:53)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:61)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:77)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
at org.ajaxanywhere.AAFilter.doFilter(AAFilter.java:46)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:541)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:869)
at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:664)
at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527)
at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:80)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684)
at java.lang.Thread.run(Thread.java:595)
</pre>
このコンポーネントはTomcatで動作するWebアプリケーションで、たまたまSMSメッセージを送信するサードパーティのWebサービスを呼び出しています。例外がスローされたコードの行は、以下のコードスニペットの最後の行です。
String aggregatorResponse = null;
HttpClient httpClient = prepareHttpClient( username, password );
PostMethod postMethod = preparePostMethod( textUrl );
try {
SybaseTextMessageBuilder builder = new SybaseTextMessageBuilder();
URL notifyUrl = buildNotificationUrl( textMessage, codeSetManager );
String smsRequestDocument = builder.buildTextMessage( textMessage, notifyUrl );
LOG.debug( "Sybase MT document created as: \n" + smsRequestDocument );
postMethod.setRequestEntity( new StringRequestEntity( smsRequestDocument ) );
LOG.debug( "commiting SMS to aggregator: " + textMessage.toString() );
int httpStatus = httpClient.executeMethod( postMethod );
SocketExceptionのjavadocには、以下のように書かれています。
TCPエラーなど、基礎となるプロトコルにエラーが発生したことを示すためにスローされます。
あなたのケースでは、接続のサーバー側で接続が閉じられたようです。これは、送信するリクエストに問題があるか、サーバー側に問題がある可能性があります。
デバッグのために、Wiresharkなどのツールを使って実際のネットワークパケットを確認してみてください。また、Webサービスをテストするために、Javaコードに代わるクライアントはありますか?これが成功した場合、Javaコードにバグがある可能性があります。
Commons HTTP Clientを使用している場合は、Common HTTP Client Logging Guideを参照してください。これは、HTTPレベルでリクエストをログに記録する方法を教えてくれます。
Glassfish3サーバーにデプロイされているWebサービスにアクセスしようとするこの問題が発生した場合は、http-thread-pool設定を調整することをお勧めします。 これにより、多くの同時スレッドがWebサービスを呼び出していたときにSocketExceptionsが修正されました。
1。 管理コンソールに移動します。 2。 "Configurations"-> "Server config"-> "Thread pools"-> "http-thread-pool"に移動します。 3。 「最大スレッドプールサイズ」の設定を5から32に変更します。 4。 「ミンスレッドプールサイズ」の設定を2から16に変更。 5。 Glassfishを再起動します。
私はいつもこのエラーを発生させ、それを正常と見なします。
これは、一方の側がすでにハングアップしているときに、一方の側が読み取ろうとするときに発生します。 したがって、プロトコルによっては、問題を指定する場合と指定しない場合があります。 クライアントコードがサーバーにハングアップすることを明確に示している場合、クライアントとサーバーの両方が同時にハングアップする可能性があり、このメッセージは発生しません。
コードを実装する方法は、クライアントがさよならを言わずに電話を切ることです。 その後、サーバーはエラーをキャッチして無視できます。 HTTPのコンテキストでは、プロトコルの1つのレベルでは、接続ごとに1つ以上のリクエストが許可され、もう1つのレベルでは許可されないと思います。
したがって、一方の側がもう一方の側にぶら下がっている可能性があることがわかります。 あなたが受け取っているエラーが海賊的な懸念であるとは思えません、そしてあなたがそれをあなたのログファイルに記入しないようにするためにそれを単に捕まえることができます。
このスレッドは少し古いことは知っていますが、2セントを追加したいと思います。 リリースの直後に同じ「接続リセット」エラーが発生しました。
根本的な原因は、「apache」サーバーが展開のためにダウンしたことです。 サードパーティのトラフィックはすべて「apache」を通過し、ダウンしているため接続のリセットエラーが発生していました。
私もそのエラーを正確に取得していました:「ピアごとの接続リセット」。 例外は、「postForObject()」メソッドを実行するときに、SpringのRESTテンプレートによって提起されていました。 私にとっての問題は、HTTP URLリクエストが長すぎることでした。 したがって、最初に生成されたURLが本来あるべきものかどうかを確認し、サーバーがその長さのリクエストを実際に処理できる場合は、サーバーの構成に移動して、デフォルトで許可されているURLリクエストの長さを上げます。
これで問題は解決しましたが、注意してください。アプリケーションは、URLリクエストの最大長が固定されているため、一部のインターネットブラウザ、特に古いブラウザでは実行されない場合があります。
それが役立つことを願っています。..