org.apachewicket.protocol.http.WebRequestCycleProcessor
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()
Re: org.apachewicket.protocol.http.WebRequestCycleProcessor
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= +
Re: org.apachewicket.protocol.http.WebRequestCycleProcessor
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.comwrote: 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) {
Re: org.apachewicket.protocol.http.WebRequestCycleProcessor
Could you please send me a link that how i can achieve this over wicket ? On Wed, Nov 11, 2009 at 1:18 AM, Igor Vaynberg igor.vaynb...@gmail.comwrote: 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); } //
Re: org.apachewicket.protocol.http.WebRequestCycleProcessor
search this list, google it. this has been answered on this list multiple times. -igor On Tue, Nov 10, 2009 at 3:22 PM, Pamir Erdem pamir.er...@gmail.com wrote: Could you please send me a link that how i can achieve this over wicket ? On Wed, Nov 11, 2009 at 1:18 AM, Igor Vaynberg igor.vaynb...@gmail.comwrote: 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
Re: org.apachewicket.protocol.http.WebRequestCycleProcessor
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.comwrote: 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