[TEEDA-375] ダウンロードを IE でキャンセルした際の対応について Created: 2007-09-14  Updated: 2007-09-19  Resolved: 2007-09-19

Status: Resolved
Project: Teeda
Component/s: None
Affects Version/s: None
Fix Version/s: 1.0.11

Type: Task Priority: Major
Reporter: shot Assignee: shot
Resolution: Fixed Votes: 0
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)



 Comments   
Comment by shot [ 2007-09-19 ]

ユーザキャンセル時に対して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();
Generated at Tue Mar 19 19:03:36 JST 2024 using Jira 9.13.0#9130001-sha1:94297e63fec900085df7b42441d17146fe025bb5.