well, its either we lock on the page, or you have to make sure all
your code is threadsafe.

yes, this can be a problem for a lot of concurrent ajax requests, you
just have to make sure your responses are fast. eg if you have a
time-consuming operation do it in a background thread and make ajax
calls poll instead of block.

-igor

On Tue, Nov 10, 2009 at 2:09 PM, Pamir Erdem <pamir.er...@gmail.com> wrote:
> Hi
>
> There are parts in web which make ajax calls. In this situtation on request
> blocks the piece of code till it returns a value. Do you recommend anything
> about ajax calls in a web page?
>
> Thanks
> Pamir
> On Tue, Nov 10, 2009 at 9:28 PM, Igor Vaynberg <igor.vaynb...@gmail.com>wrote:
>
>> can you submit a quickstart that reproduces this?
>>
>> the lock on session only blocks concurrent requests from the browser,
>> which is usually not a big deal because most users operate one window
>> at a time.
>>
>> also we do not get the same results in our wicket-threadtest project.
>>
>> -igor
>>
>> On Tue, Nov 10, 2009 at 10:17 AM, Pamir Erdem <pamir.er...@gmail.com>
>> wrote:
>> > From wicket source code WebRequestCycleProcessor has a lock on session.
>> > (Look at the source code below).
>> > From a profiler we can easily observe that %57 of the time is spent on
>> this
>> > function especially on lock region.
>> > Is there any way to speed it up  this source code ?
>> >
>> >
>> >  /**
>> >  * @see
>> >
>> org.apache.wicket.request.IRequestCycleProcessor#resolve(org.apache.wicket.RequestCycle,
>> >  *      org.apache.wicket.request.RequestParameters)
>> >  */
>> >  public IRequestTarget resolve(final RequestCycle requestCycle,
>> >   final RequestParameters requestParameters)
>> >  {
>> >  IRequestCodingStrategy requestCodingStrategy =
>> requestCycle.getProcessor()
>> >    .getRequestCodingStrategy();
>> >
>> >  final String path = requestParameters.getPath();
>> >  IRequestTarget target = null;
>> >
>> >  // See whether this request points to a bookmarkable page
>> >  if (requestParameters.getBookmarkablePageClass() != null)
>> >  {
>> >   target = resolveBookmarkablePage(requestCycle, requestParameters);
>> >  }
>> >  // See whether this request points to a rendered page
>> >  else if (requestParameters.getComponentPath() != null)
>> >  {
>> >   // marks whether or not we will be processing this request
>> >   boolean processRequest = true;
>> >   synchronized (requestCycle.getSession())
>> >   {
>> >    // we need to check if this request has been flagged as
>> >    // process-only-if-path-is-active and if so make sure this
>> >    // condition is met
>> >    if (requestParameters.isOnlyProcessIfPathActive())
>> >    {
>> >     // this request has indeed been flagged as
>> >     // process-only-if-path-is-active
>> >
>> >     Session session = Session.get();
>> >     IPageMap pageMap =
>> > session.pageMapForName(requestParameters.getPageMapName(),
>> >       false);
>> >     if (pageMap == null)
>> >     {
>> >      // requested pagemap no longer exists - ignore this
>> >      // request
>> >      processRequest = false;
>> >     }
>> >     else if (pageMap instanceof AccessStackPageMap)
>> >     {
>> >      AccessStackPageMap accessStackPageMap = (AccessStackPageMap)pageMap;
>> >      if (accessStackPageMap.getAccessStack().size() > 0)
>> >      {
>> >       final Access access = (Access)accessStackPageMap.getAccessStack()
>> >         .peek();
>> >
>> >       final int pageId = Integer
>> >         .parseInt(Strings.firstPathComponent(requestParameters
>> >           .getComponentPath(), Component.PATH_SEPARATOR));
>> >
>> >       if (pageId != access.getId())
>> >       {
>> >        // the page is no longer the active page
>> >        // - ignore this request
>> >        processRequest = false;
>> >       }
>> >       else
>> >       {
>> >        final int version = requestParameters.getVersionNumber();
>> >        if (version != Page.LATEST_VERSION &&
>> >          version != access.getVersion())
>> >        {
>> >         // version is no longer the active version -
>> >         // ignore this request
>> >         processRequest = false;
>> >        }
>> >       }
>> >      }
>> >     }
>> >     else
>> >     {
>> >      // TODO also this should work..
>> >     }
>> >    }
>> >   }
>> >   if (processRequest)
>> >   {
>> >    try
>> >    {
>> >     target = resolveRenderedPage(requestCycle, requestParameters);
>> >    }
>> >    catch (IgnoreAjaxRequestException e)
>> >    {
>> >     target = EmptyAjaxRequestTarget.getInstance();
>> >    }
>> >   }
>> >   else
>> >   {
>> >    throw new PageExpiredException("Request cannot be processed");
>> >   }
>> >  }
>> >  // See whether this request points to a shared resource
>> >  else if (requestParameters.getResourceKey() != null)
>> >  {
>> >   target = resolveSharedResource(requestCycle, requestParameters);
>> >  }
>> >  // See whether this request points to the home page
>> >  else if (Strings.isEmpty(path) || ("/".equals(path)))
>> >  {
>> >   target = resolveHomePageTarget(requestCycle, requestParameters);
>> >  }
>> >
>> >  // NOTE we are doing the mount check as the last item, so that it will
>> >  // only be executed when everything else fails. This enables URLs like
>> >  // /foo/bar/?wicket:bookmarkablePage=my.Page to be resolved, where
>> >  // is either a valid mount or a non-valid mount. I (Eelco) am not
>> >  // absolutely sure this is a great way to go, but it seems to have been
>> >  // established as the default way of doing things. If we ever want to
>> >  // tighten the algorithm up, it should be combined by going back to
>> >  // unmounted paths so that requests with Wicket parameters like
>> >  // 'bookmarkablePage' are always created and resolved in the same
>> >  // fashion. There is a test for this in UrlMountingTest.
>> >  if (target == null)
>> >  {
>> >   // still null? check for a mount
>> >   target = requestCodingStrategy.targetForRequest(requestParameters);
>> >
>> >   if (target == null && requestParameters.getComponentPath() != null)
>> >   {
>> >    // If the target is still null and there was a component path
>> >    // then the Page could not be located in the session
>> >    throw new PageExpiredException(
>> >      "Cannot find the rendered page in session [pagemap=" +
>> >        requestParameters.getPageMapName() + ",componentPath=" +
>> >        requestParameters.getComponentPath() + ",versionNumber=" +
>> >        requestParameters.getVersionNumber() + "]");
>> >   }
>> >  }
>> >  else
>> >  {
>> >   // a target was found, but not by looking up a mount. check whether
>> >   // this is allowed
>> >   if (Application.get().getSecuritySettings().getEnforceMounts() &&
>> >     requestCodingStrategy.pathForTarget(target) != null)
>> >   {
>> >    String msg = "Direct access not allowed for mounted targets";
>> >    // the target was mounted, but we got here via another path
>> >    // : deny the request
>> >    log.error(msg + " [request=" + requestCycle.getRequest() + ",target="
>> +
>> > target +
>> >      ",session=" + Session.get() + "]");
>> >    throw new
>> > AbortWithWebErrorCodeException(HttpServletResponse.SC_FORBIDDEN, msg);
>> >   }
>> >  }
>> >
>> >  // (WICKET-1356) in case no target was found, return null here.
>> > RequestCycle will deal with it
>> >  // possible letting wicket filter to pass the request down the filter
>> > chain
>> >  /*
>> >  if (target == null)
>> >  {
>> >   // if we get here, we have no recognized Wicket target, and thus
>> >   // regard this as a external (non-wicket) resource request on
>> >   // this server
>> >   return resolveExternalResource(requestCycle);
>> >  }
>> >  */
>> >
>> >  return target;
>> >  }
>> >
>> >
>> > --
>> > Pamir Erdem
>> >
>>
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: users-unsubscr...@wicket.apache.org
>> For additional commands, e-mail: users-h...@wicket.apache.org
>>
>>
>
>
> --
> Pamir Erdem
>

---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscr...@wicket.apache.org
For additional commands, e-mail: users-h...@wicket.apache.org

Reply via email to