• Type: Task
    • Resolution: Fixed
    • Priority: Major
    • 1.0.11
    • Affects Version/s: None
    • Component/s: None
    • None

      下記はTeeda側でキャンセル時にチェックドな例外を投げたり、
      ClientAbortExceptionを握りつぶすなどの対処が必要かもしれない.

      Seasar-user:10949

      CSVファイルのダウンロードで「開く、保存、キャンセル」画面でキャンセルしたとこ

      下のログにあるような「ClientAbortException」となる現象た発生しております。

      CSVファイルのダウンロードは、Actionクラスで
      public Class doHoge() {
      // レスポンスにダウンロード用のヘッダー設定を行い
      response.setContentLength((int) size);
      response.setContentType("text/csv");
      response.setHeader("Content-Disposition","inline;filename=\"" + fileName + "
      \"");

      //内容を書き出して
      OutputStream out = response.getOutputStream();
      int c;
      while ((c = in.read()) != -1)

      { out.write(c); }

      out.close();
      in.close();
      // 終了したことをJSFに通知する。
      page.getFacesContext().responseComplete();
      return null;
      }
      として実現しています。
      ログを見る限りは、Actionクラス終了後の出来事のようなのです。
      「ClientAbortException」を無視するような対応が必要だと思うのですが・・・

      別の目的でIntercepterを作成しています。この中で、
      件のエラーを無視するコードを下のように記述すれば対応できるのでしょうか?
      try

      { Object ret = invocation.proceed(); // 本来の対象メソッドの実行部分 }

      catch (ClientAbortException e)

      { // 無視 }

      よろしくお願いします。

      エラーのログです。
      DEBUG 2007-09-13 01:07:21,609 [http-8080-Processor25] [ESSR0043]kh.web.MenuAct
      ion$$EnhancedByS2AOP$$bde56dが呼び出した対象が不正です。理由はClientAbortExcep
      tion: java.net.SocketException: Connection reset by peer: socket write error
      org.seasar.framework.exception.InvocationTargetRuntimeException: [ESSR0043]kh.
      web.MenuAction$$EnhancedByS2AOP$$bde56dが呼び出した対象が不正です。理由はClien
      tAbortException: java.net.SocketException: Connection reset by peer: socket w
      rite error
      at org.seasar.framework.util.MethodUtil.invoke(MethodUtil.java:58)
      at org.seasar.framework.beans.impl.BeanDescImpl.invoke(BeanDescImpl.java:213)
      at org.seasar.teeda.extension.html.impl.HtmlComponentInvokerImpl.invoke(HtmlC
      omponentInvokerImpl.java:159)
      at org.seasar.teeda.extension.html.impl.HtmlActionListener.processAction(Html
      ActionListener.java:62)
      at javax.faces.component.UICommand.broadcast(UICommand.java:149)
      at org.seasar.teeda.extension.component.html.THtmlCommandButton.broadcast(THt
      mlCommandButton.java:53)
      at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:192)
      at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:117)
      at org.seasar.teeda.core.lifecycle.impl.InvokeApplicationPhase.executePhase(I
      nvokeApplicationPhase.java:29)
      at org.seasar.teeda.core.lifecycle.AbstractPhase.execute(AbstractPhase.java:5
      5)
      at org.seasar.teeda.core.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:9
      4)
      at javax.faces.webapp.FacesServlet.service(FacesServlet.java:92)
      at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(Applicati
      onFilterChain.java:269)
      at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilter
      Chain.java:188)
      at org.seasar.framework.container.hotdeploy.HotdeployFilter.doFilter(Hotdeplo
      yFilter.java:63)
      at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(Applicati
      onFilterChain.java:215)
      at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilter
      Chain.java:188)
      at org.seasar.framework.container.filter.S2ContainerFilter.doFilter(S2Contain
      erFilter.java:63)
      at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(Applicati
      onFilterChain.java:215)
      at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilter
      Chain.java:188)
      at org.seasar.extension.filter.EncodingFilter.doFilter(EncodingFilter.java:62
      )
      at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(Applicati
      onFilterChain.java:215)
      at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilter
      Chain.java:188)
      at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.
      java:210)
      at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.
      java:174)
      at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:1
      27)
      at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:1
      17)
      at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.ja
      va:108)
      at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:151
      )
      at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:870)
      at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.proces
      sConnection(Http11BaseProtocol.java:665)
      at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.j
      ava:528)
      at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollower
      WorkerThread.java:81)
      at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.j
      ava:685)
      at java.lang.Thread.run(Thread.java:595)

          [TEEDA-375] ダウンロードを IE でキャンセルした際の対応について

          shot added a comment -

          ユーザキャンセル時に対してUtilを準備しました.
          teedaCustomize.diconに宣言的にユーザキャンセルとみなす
          例外を指定します.

          	<component class="org.seasar.teeda.core.util.DefaultCancelHandler">
          		<initMethod name="addCancellableException">
          			<arg>@java.net.SocketException@class&lt;/arg>
          		</initMethod>
          	</component>
          

          キャンセルかどうかの判定にはorg.seasar.teeda.core.util.CancelUtilを
          使います.Teedaに依存するのが嫌であれば、適当なコンポーネントを作ってください.
          (今後準備する予定はあります)

          		OutputStream os = null;
          		try {
          			os = response.getOutputStream();
          			os.write(FileUtil.getBytes(file));
          		} catch (IOException e) {
          			Throwable cause = e.getCause();
          			if (!CancelUtil.isCancelled(cause)) {
          				throw new AppFacesException("E0000002");
          			} else {
          				System.out.println("user cancelled....");
          			}
          		} finally {
          			try {
          				os.close();
          			} catch (final IOException e) {
          			}
          		}
          		this.facesContext.responseComplete();
          

          shot added a comment - ユーザキャンセル時に対してUtilを準備しました. teedaCustomize.diconに宣言的にユーザキャンセルとみなす 例外を指定します. <component class= "org.seasar.teeda.core.util.DefaultCancelHandler" > <initMethod name= "addCancellableException" > <arg>@java.net.SocketException@ class& lt;/arg> </initMethod> </component> キャンセルかどうかの判定にはorg.seasar.teeda.core.util.CancelUtilを 使います.Teedaに依存するのが嫌であれば、適当なコンポーネントを作ってください. (今後準備する予定はあります) OutputStream os = null ; try { os = response.getOutputStream(); os.write(FileUtil.getBytes(file)); } catch (IOException e) { Throwable cause = e.getCause(); if (!CancelUtil.isCancelled(cause)) { throw new AppFacesException( "E0000002" ); } else { System .out.println( "user cancelled...." ); } } finally { try { os.close(); } catch ( final IOException e) { } } this .facesContext.responseComplete();

            Assignee:
            shot
            Reporter:
            shot
            Votes:
            0 Vote for this issue
            Watchers:
            Start watching this issue

              Created:
              Updated:
              Resolved: