java.net.SocketException'ıma ne sebep oluyor? Bağlantı sıfırlandı mı?

Sık ama aralıklı java.net.SocketException görüyoruz: Bağlantı sıfırlandı hatalarını günlüklerimizde görüyoruz. Bağlantı sıfırlama hatasının gerçekte nereden geldiğinden ve hata ayıklama konusunda nasıl bir yol izleyeceğimizden emin değiliz.

Sorunun göndermeye çalıştığımız mesajlarla ilgisi yok gibi görünüyor. Mesajın değil bağlantı eş tarafından sıfırlandı olduğunu unutmayın.

Bu istisnanın tipik nedenlerinin neler olabileceği ve nasıl ilerleyebileceğimiz konusunda herhangi bir öneriniz var mı?

İşte temsili bir yığın izi (com.companyname.mtix.sms bizim bileşenimizdir):

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>

Bileşenimiz, Tomcat altında çalışan ve SMS mesajları gönderen üçüncü taraf bir Web hizmetini çağıran bir web uygulamasıdır. Kodumuzda istisnanın atıldığı satır, aşağıdaki kod parçasının son satırıdır.

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 );
Çözüm

SocketException'ın javadoc'unda şu şekilde belirtilmiştir

TCP hatası gibi temel protokolde bir hata olduğunu belirtmek için atılır

Sizin durumunuzda bağlantı, bağlantının sunucu ucu tarafından kapatılmış gibi görünüyor. Bu, gönderdiğiniz istekle ilgili bir sorun veya onların ucundaki bir sorun olabilir.

Hata ayıklamaya yardımcı olması için gerçek ağ paketlerini görüntülemek üzere Wireshark gibi bir araç kullanabilirsiniz. Ayrıca, web hizmetini test etmek için kullanabileceğiniz Java kodunuza alternatif bir istemci var mı? Bu başarılı olduysa, Java kodunda bir hata olduğunu gösterebilir.

Commons HTTP İstemcisini kullandığınız için Common HTTP İstemcisi Günlük Kaydı Kılavuzu'na bir göz atın. Bu size isteği HTTP düzeyinde nasıl günlüğe kaydedeceğinizi söyleyecektir.

Yorumlar (6)

Bu hata, istemci soket üzerinden yanıt döndürülmeden önce soket bağlantısını kapattığında sunucu tarafında oluşur. Bir web uygulaması senaryosunda bunların hepsi tehlikeli değildir, çünkü manuel olarak oluşturulabilirler. Örneğin, yanıt alınmadan önce tarayıcıdan çıkılması gibi.

Yorumlar (1)

İstisna, soketin beklenmedik bir şekilde diğer taraftan kapatıldığı anlamına gelir. Bir web hizmeti çağırdığınız için bunun olmaması gerekir - büyük olasılıkla web hizmetindeki bir hatayı tetikleyen bir istek gönderiyorsunuzdur.

Bu durumlarda tüm isteği günlüğe kaydetmeyi deneyin ve olağandışı bir şey fark edip etmediğinize bakın. Aksi takdirde, web hizmeti sağlayıcısıyla iletişime geçin ve günlüğe kaydedilen sorunlu isteğinizi onlara gönderin.

Yorumlar (1)