2017-07-27 8 views
1

私はHTTP Webリクエスト、レスポンスを使用してjenkinsサーバーからのEXEです。レスポンスはFilestreamを使用してローカルドライブに読み込まれ、保存されます。応答が連続していると、正常にダウンロードしてexeファイルをダウンロードしてインストールできます。400MBHTTPレスポンスの例外を回避/スキップする方法は、ファイルのダウンロード中にバイト数としてC#で追加されます。

問題のシナリオ:時折タイムアウトが発生し、例外がスローされます。レスポンスリーダーは例外も読み取ってファイルに格納します。

例外:

A problem occurred while processing the request. Please check our bug tracker to see if a similar problem has already been reported. If it is already reported, please vote and put a comment on it to let us gauge the impact of the problem. If you think this is a new issue, please file a new issue. When you file an issue, make sure to add the entire stack trace, along with the version of Jenkins and relevant plugins. The users list might be also useful in understanding what has happened. 
Stack trace 
java.io.IOException: java.util.concurrent.TimeoutException: Idle timeout expired: 5000/5000 ms 
    at org.eclipse.jetty.util.SharedBlockingCallback$Blocker.block(SharedBlockingCallback.java:234) 
    at org.eclipse.jetty.server.HttpOutput.write(HttpOutput.java:141) 
    at org.eclipse.jetty.server.HttpOutput.write(HttpOutput.java:355) 
    at org.kohsuke.stapler.Stapler.serveStaticResource(Stapler.java:585) 
    at org.kohsuke.stapler.ResponseImpl.serveFile(ResponseImpl.java:216) 
    at hudson.model.DirectoryBrowserSupport.serveFile(DirectoryBrowserSupport.java:319) 
    at hudson.model.DirectoryBrowserSupport.generateResponse(DirectoryBrowserSupport.java:127) 
    at org.kohsuke.stapler.HttpResponseRenderer$Default.handleHttpResponse(HttpResponseRenderer.java:124) 
    at org.kohsuke.stapler.HttpResponseRenderer$Default.generateResponse(HttpResponseRenderer.java:69) 
    at org.kohsuke.stapler.Function.renderResponse(Function.java:127) 
    at org.kohsuke.stapler.Function.bindAndInvokeAndServeResponse(Function.java:110) 
    at org.kohsuke.stapler.MetaClass$1.doDispatch(MetaClass.java:124) 
    at org.kohsuke.stapler.NameBasedDispatcher.dispatch(NameBasedDispatcher.java:58) 
    at org.kohsuke.stapler.Stapler.tryInvoke(Stapler.java:746) 
    at org.kohsuke.stapler.Stapler.invoke(Stapler.java:876) 
    at org.kohsuke.stapler.MetaClass$10.dispatch(MetaClass.java:362) 
    at org.kohsuke.stapler.Stapler.tryInvoke(Stapler.java:746) 
    at org.kohsuke.stapler.Stapler.invoke(Stapler.java:876) 
    at org.kohsuke.stapler.MetaClass$5.doDispatch(MetaClass.java:236) 
    at org.kohsuke.stapler.NameBasedDispatcher.dispatch(NameBasedDispatcher.java:58) 
    at org.kohsuke.stapler.Stapler.tryInvoke(Stapler.java:746) 
    at org.kohsuke.stapler.Stapler.invoke(Stapler.java:876) 
    at org.kohsuke.stapler.Stapler.invoke(Stapler.java:649) 
    at org.kohsuke.stapler.Stapler.service(Stapler.java:238) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:790) 
    at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:812) 
    at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1669) 
    at hudson.util.PluginServletFilter$1.doFilter(PluginServletFilter.java:135) 
    at org.jenkinsci.plugins.ssegateway.Endpoint$SSEListenChannelFilter.doFilter(Endpoint.java:225) 
    at hudson.util.PluginServletFilter$1.doFilter(PluginServletFilter.java:132) 
    at io.jenkins.blueocean.ResourceCacheControl.doFilter(ResourceCacheControl.java:134) 
    at hudson.util.PluginServletFilter$1.doFilter(PluginServletFilter.java:132) 
    at jenkins.metrics.impl.MetricsFilter.doFilter(MetricsFilter.java:125) 
    at hudson.util.PluginServletFilter$1.doFilter(PluginServletFilter.java:132) 
    at hudson.util.PluginServletFilter.doFilter(PluginServletFilter.java:126) 
    at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1652) 
    at hudson.security.csrf.CrumbFilter.doFilter(CrumbFilter.java:86) 
    at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1652) 
    at hudson.security.ChainedServletFilter$1.doFilter(ChainedServletFilter.java:84) 
    at hudson.security.ChainedServletFilter.doFilter(ChainedServletFilter.java:76) 
    at hudson.security.HudsonFilter.doFilter(HudsonFilter.java:171) 
    at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1652) 
    at org.kohsuke.stapler.compression.CompressionFilter.doFilter(CompressionFilter.java:49) 
    at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1652) 
    at hudson.util.CharacterEncodingFilter.doFilter(CharacterEncodingFilter.java:82) 
    at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1652) 
    at org.kohsuke.stapler.DiagnosticThreadNameFilter.doFilter(DiagnosticThreadNameFilter.java:30) 
    at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1652) 
    at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:585) 
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:143) 
    at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:553) 
    at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:223) 
    at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1127) 
    at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:515) 
    at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:185) 
    at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1061) 
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141) 
    at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:97) 
    at org.eclipse.jetty.server.Server.handle(Server.java:499) 
    at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:311) 
    at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:257) 
    at org.eclipse.jetty.io.AbstractConnection$2.run(AbstractConnection.java:544) 
    at winstone.BoundedExecutorService$1.run(BoundedExecutorService.java:77) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
    at java.lang.Thread.run(Thread.java:745) 
Caused by: java.util.concurrent.TimeoutException: Idle timeout expired: 5000/5000 ms 
    at org.eclipse.jetty.io.IdleTimeout.checkIdleTimeout(IdleTimeout.java:161) 
    at org.eclipse.jetty.io.IdleTimeout$1.run(IdleTimeout.java:50) 
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) 
    at java.util.concurrent.FutureTask.run(FutureTask.java:266) 
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180) 
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293) 
    ... 3 more 

私は残りのバイトのために再度ダウンロードを再開できるように、例外のバイトを読み込む回避する方法。ここ

私のロジックです:

try 
    { 
     long iFileSize = 0; 
     int iBufferSize = 1024; 
     iBufferSize *= 1000; 
     long iExistLen = 0; 
     if (System.IO.File.Exists(path)) 
     { 
      System.IO.FileInfo fINfo = 
       new System.IO.FileInfo(path); 
      iExistLen = fINfo.Length; 
     } 
     if (iExistLen > 0) 
      saveFileStream = new System.IO.FileStream(path, 
       System.IO.FileMode.Append, System.IO.FileAccess.Write, 
       System.IO.FileShare.None); 
     else 
      saveFileStream = new System.IO.FileStream(path, 
       System.IO.FileMode.Create, System.IO.FileAccess.Write, 
       System.IO.FileShare.None); 
      HttpWebRequest hwRq1 =(HttpWebRequest)System.Net.HttpWebRequest.Create(urlAddress); 
      hwRq1.AddRange((int)iExistLen); 

      using (HttpWebResponse hwRes=(System.Net.HttpWebResponse)hwRq1.GetResponse()) 
     { 
      using (System.IO.Stream smRespStream = hwRes.GetResponseStream()) 
      { 
       smRespStream.ReadTimeout = 60000; 

       iFileSize = hwRes.ContentLength; 

       int iByteSize; 
       byte[] downBuffer = new byte[iBufferSize]; 

       while ((iByteSize = smRespStream.Read(downBuffer, 0,  downBuffer.Length)) > 0) 
       { 
        saveFileStream.Write(downBuffer, 0, iByteSize); 
        Console.WriteLine(iExistLen.ToString()); 
       } 

       saveFileStream.Close(); 
       smRespStream.Close(); 

       if (iByteSize == 0 && !FileSizeCheck(path, softwareWithSize.Value)) 
        return new Tuple<string, bool>("Zero byte received", false); 
      } 
     } 

答えて

0

エラーがあったことを実現するために来るにはどうすればよいですか?できない場合、つまり、ジェンキンからのストリームはエコーバイトだけで、その後にエラーが続き、ソケットクローズが続きます。変更しない適切なアスキーの存在を確認する必要があります。おそらく "java.io.IOException"を検索してから5000バイトを巻き戻し、その時点でファイルを切り取り、そこからファイルを再開します。

これは本当にうまくいくそれは、コンテンツのダウンロードストリームにエラーメッセージバイトを送信することをお勧めすると思った開発者の話を聞いたのは初めてです。誤ってプログラムされたプロキシサーバーのようなミドルウェアのジャンクによって挿入されていないと確信していますか?

+0

元のファイルとエラーファイルのバイナリ比較器を使用して例外を取得しました – guru

+0

エラーが発生したことをプログラムで検出する方法はありません。すべてのファイルの末尾を調べる必要があります。ダウンロードしてASCIIエラーテキストを探し、それを取り除く –

関連する問題