[ 
https://issues.apache.org/jira/browse/ISIS-2119?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Daniel Keir Haywood resolved ISIS-2119.
---------------------------------------
    Resolution: Fixed

> Increase timeout to avoid occasional exceptions when download Blobs
> -------------------------------------------------------------------
>
>                 Key: ISIS-2119
>                 URL: https://issues.apache.org/jira/browse/ISIS-2119
>             Project: Isis
>          Issue Type: Bug
>    Affects Versions: 1.17.0
>            Reporter: Daniel Keir Haywood
>            Assignee: Daniel Keir Haywood
>            Priority: Minor
>             Fix For: 1.18.0
>
>
> On a slow connection, can get occasional exceptions when downloading a 
> blob... that the behaviour cannot be found on the entity:
> {code}
> org.apache.wicket.behavior.InvalidBehaviorIdException
> Cannot find behavior with id '2' on component 
> 'org.apache.isis.viewer.wicket.ui.components.scalars.reference.ReferencePanel:theme:entityPageContainer:entity:rows:1:rowContents:2:col:rows:1:rowContents:1:col:tabGroups:1:panel:tabPanel:rows:1:rowContents:1:col:fieldSets:1:memberGroup:properties:1:property'
>  in page '[Page class = 
> org.apache.isis.viewer.wicket.ui.pages.entity.EntityPage, id = 10, render 
> count = 1]'. Perhaps the behavior did not properly implement 
> getStatelessHint() and returned 'true' to indicate that it is stateless 
> instead of returning 'false' to indicate that it is stateful.
> org.apache.wicket.Behaviors#getBehaviorById(Behaviors.java:316)
> org.apache.wicket.Component#getBehaviorById(Component.java:4596)
> org.apache.wicket.core.request.handler.ListenerInterfaceRequestHandler#invokeListener(ListenerInterfaceRequestHandler.java:247)
> org.apache.wicket.core.request.handler.ListenerInterfaceRequestHandler#respond(ListenerInterfaceRequestHandler.java:234)
> org.apache.wicket.request.cycle.RequestCycle$HandlerExecutor#respond(RequestCycle.java:895)
> org.apache.wicket.request.RequestHandlerStack#execute(RequestHandlerStack.java:64)
> org.apache.wicket.request.cycle.RequestCycle#execute(RequestCycle.java:265)
> org.apache.wicket.request.cycle.RequestCycle#processRequest(RequestCycle.java:222)
> org.apache.wicket.request.cycle.RequestCycle#processRequestAndDetach(RequestCycle.java:293)
> org.apache.wicket.protocol.http.WicketFilter#processRequestCycle(WicketFilter.java:261)
> org.apache.wicket.protocol.http.WicketFilter#processRequest(WicketFilter.java:203)
> org.apache.wicket.protocol.http.WicketFilter#doFilter(WicketFilter.java:284)
> org.eclipse.jetty.servlet.ServletHandler$CachedChain#doFilter(ServletHandler.java:1621)
> org.apache.isis.core.webapp.diagnostics.IsisLogOnExceptionFilter#doFilter(IsisLogOnExceptionFilter.java:52)
> org.eclipse.jetty.servlet.ServletHandler$CachedChain#doFilter(ServletHandler.java:1621)
> org.togglz.servlet.TogglzFilter#doFilter(TogglzFilter.java:100)
> org.eclipse.jetty.servlet.ServletHandler$CachedChain#doFilter(ServletHandler.java:1621)
> org.apache.shiro.web.servlet.AbstractShiroFilter#executeChain(AbstractShiroFilter.java:449)
> org.apache.shiro.web.servlet.AbstractShiroFilter$1#call(AbstractShiroFilter.java:365)
> org.apache.shiro.subject.support.SubjectCallable#doCall(SubjectCallable.java:90)
> org.apache.shiro.subject.support.SubjectCallable#call(SubjectCallable.java:83)
> org.apache.shiro.subject.support.DelegatingSubject#execute(DelegatingSubject.java:383)
> org.apache.shiro.web.servlet.AbstractShiroFilter#doFilterInternal(AbstractShiroFilter.java:362)
> org.apache.shiro.web.servlet.OncePerRequestFilter#doFilter(OncePerRequestFilter.java:125)
> org.eclipse.jetty.servlet.ServletHandler$CachedChain#doFilter(ServletHandler.java:1613)
> org.eclipse.jetty.servlet.ServletHandler#doHandle(ServletHandler.java:541)
> org.eclipse.jetty.server.handler.ScopedHandler#handle(ScopedHandler.java:143)
> org.eclipse.jetty.security.SecurityHandler#handle(SecurityHandler.java:548)
> org.eclipse.jetty.server.handler.HandlerWrapper#handle(HandlerWrapper.java:132)
> org.eclipse.jetty.server.handler.ScopedHandler#nextHandle(ScopedHandler.java:190)
> org.eclipse.jetty.server.session.SessionHandler#doHandle(SessionHandler.java:1593)
> org.eclipse.jetty.server.handler.ScopedHandler#nextHandle(ScopedHandler.java:188)
> org.eclipse.jetty.server.handler.ContextHandler#doHandle(ContextHandler.java:1239)
> org.eclipse.jetty.server.handler.ScopedHandler#nextScope(ScopedHandler.java:168)
> org.eclipse.jetty.servlet.ServletHandler#doScope(ServletHandler.java:481)
> org.eclipse.jetty.server.session.SessionHandler#doScope(SessionHandler.java:1562)
> org.eclipse.jetty.server.handler.ScopedHandler#nextScope(ScopedHandler.java:166)
> org.eclipse.jetty.server.handler.ContextHandler#doScope(ContextHandler.java:1141)
> org.eclipse.jetty.server.handler.ScopedHandler#handle(ScopedHandler.java:141)
> org.eclipse.jetty.server.handler.HandlerWrapper#handle(HandlerWrapper.java:132)
> org.eclipse.jetty.server.Server#handle(Server.java:564)
> org.eclipse.jetty.server.HttpChannel#handle(HttpChannel.java:320)
> org.eclipse.jetty.server.HttpConnection#onFillable(HttpConnection.java:251)
> org.eclipse.jetty.io.AbstractConnection$ReadCallback#succeeded(AbstractConnection.java:279)
> org.eclipse.jetty.io.FillInterest#fillable(FillInterest.java:110)
> org.eclipse.jetty.io.ChannelEndPoint$2#run(ChannelEndPoint.java:124)
> org.eclipse.jetty.util.thread.Invocable#invokePreferred(Invocable.java:122)
> org.eclipse.jetty.util.thread.strategy.ExecutingExecutionStrategy#invoke(ExecutingExecutionStrategy.java:58)
> org.eclipse.jetty.util.thread.strategy.ExecuteProduceConsume#produceConsume(ExecuteProduceConsume.java:201)
> org.eclipse.jetty.util.thread.strategy.ExecuteProduceConsume#run(ExecuteProduceConsume.java:133)
> org.eclipse.jetty.util.thread.QueuedThreadPool#runJob(QueuedThreadPool.java:672)
> org.eclipse.jetty.util.thread.QueuedThreadPool$2#run(QueuedThreadPool.java:590)
> java.lang.Thread#run(Thread.java:748)
> {code}
>   There's not a lot to go on.
> Inspecting the returned payload though, I discovered at the end:
> {code}
> <evaluate><![CDATA[(function(){setTimeout("window.location.href='./orders.Order:7975?24-1.IBehaviorListener.0-'",
>  10);})();]]></evaluate>
> {code}
> which gave me the clue.  The relevant code is in 
> ActionResultResponseHandlingStrategy:
> {code}
>     SCHEDULE_HANDLER {
>         @Override
>         public void handleResults(
>                 final ActionResultResponse resultResponse,
>                 final IsisSessionFactory isisSessionFactory) {
>             final RequestCycle requestCycle = RequestCycle.get();
>             AjaxRequestTarget target = 
> requestCycle.find(AjaxRequestTarget.class);
>             if (target == null) {
>                 // non-Ajax request => just stream the Lob to the browser
>                 // or if this is a no-arg action, there also will be no 
> parent for the component
>                 
> requestCycle.scheduleRequestHandlerAfterCurrent(resultResponse.getHandler());
>             } else {
>                 // otherwise,
>                 // Ajax request => respond with a redirect to be able to 
> stream the Lob to the client
>                 ResourceStreamRequestHandler scheduledHandler = 
> (ResourceStreamRequestHandler) resultResponse.getHandler();
>                 StreamAfterAjaxResponseBehavior streamingBehavior = new 
> StreamAfterAjaxResponseBehavior(scheduledHandler);
>                 final Page page = target.getPage();
>                 page.add(streamingBehavior);
>                 String callbackUrl = 
> streamingBehavior.getCallbackUrl().toString();
>                 target.appendJavaScript("setTimeout(\"window.location.href='" 
> + callbackUrl + "'\", 10);");
>             }
>         }
>     },
> {code}
> What's happening here is that response from the ajax call to invoke the 
> button is the fragments to rebuild the page ... it's not possible to also 
> return the BLOB.  So the Ajax instead sets a timeout to download that Blob as 
> a separate web call.
> Experimenting with this code, if the behaviour is stripped off (everything 
> after the "?") then the download doesn't occur; so this is needed.
> Since I've seen the problem mostly with large docs and on a slow connection, 
> my guess is that this is some sort of race condition.  Since we can wait a 
> bit more than 10ms, my suggestion is to increase the timeout to 250ms.
> ~~~
> If this fails, then another idea might be to strip off any of the &hint-xxx 
> query args also.



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

Reply via email to