Uploaded image for project: 'Teeda'
  1. Teeda
  2. TEEDA-375

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

    Details

    • Type: Task
    • Status: Resolved
    • Priority: Major
    • Resolution: Fixed
    • Affects Version/s: None
    • Fix Version/s: 1.0.11
    • Component/s: None
    • Labels:
      None

      Description

      下記は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)

        Activity

        Hide
        shot shot added a comment -

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

        	<component class="org.seasar.teeda.core.util.DefaultCancelHandler">
        		<initMethod name="addCancellableException">
        			<arg>@java.net.SocketException@class</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();
        
        Show
        shot shot added a comment - ユーザキャンセル時に対してUtilを準備しました. teedaCustomize.diconに宣言的にユーザキャンセルとみなす 例外を指定します. <component class= "org.seasar.teeda.core.util.DefaultCancelHandler" > <initMethod name= "addCancellableException" > <arg>@java.net.SocketException@class</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();

          People

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

            Dates

            • Created:
              Updated:
              Resolved:

              Development