1 2 Previous Next 17 Replies Latest reply on Jun 12, 2008 6:47 PM by System Administrator

    conversation ended, timed out or was processing another request

    System Administrator Expert

      need to get official JBoss explanation and status on this.  I've run into this error on two different Seam 2.0.0.GA apps now.


      I believe there's a JIRA to fix this for 2.1.0.  It may require a coordinated Richfaces release from what Pete Muir had stated in the recent past.


      Also, is support for this type of error/problem covered by the EAP developer support contract?  From what I understand,
      EAP 4.3
      supports Seam 1.2.1.GA.


      So if we have a developer support contract with JBOss, will help on this problem be covered or not (i'm not sure if it's specific to 1.x or 2.x).


      here's the code snippet from the xhtml that is causing this problem:


      <h:form id="locationform">
                                              <b style="font-size: 14px"><u><h:outputText id="techLocname" value="#{techDeployToUser.techLocationName}"></h:outputText></u></b>
                                              <h:inputText id="userlocationno"     value="#{techDeployToUser.locNo}"  valueChangeListener="#{techDeployToUser.validateUserLocation}" maxlength="4" size="26">
                                          <a4j:support event="onblur"              oncomplete="return clearUserLocMsg();"  reRender="userQueueTable, userLocMsg, techLocMsg, userlocname, assignButtonA4JForm, techQueueTable"/>        
                                          <input type="hidden"                             name="inputlocno" value="#{techDeployToUser.locNo}"/>
                                          </h:inputText><br></br>
      
                                  <rich:suggestionbox id="suggestionboxid"   width="182" height="80"   ajaxSingle="true" limitToList="false" border="5"  for="userlocationno"   suggestionAction="#{techDeployToUser.autoSuggestLocNosList}" var="locNosList"  fetchValue="#{locNosList.locationNo}">
                                                      <h:column>
                                                              <b> <h:outputText id="sellocno" value="#{locNosList.locationNo}"></h:outputText> </b>
                                      </h:column>
                                              </rich:suggestionbox>
                      </h:form> 



      components.xml snippet:


         <core:manager concurrent-request-timeout="500" 
                       conversation-timeout="120000" 
                       conversation-id-parameter="cid"/>



      I know increasing the concurrent-request-timeout to 10000 helps but it's only a workaround and not sure if it's recommended overall as it may have other problems associated with it.

        • 1. Re: conversation ended, timed out or was processing another request
          Pete Muir Master

          Arbi Sookazian wrote on Mar 12, 2008 12:45 AM:


          I believe there's a JIRA to fix this for 2.1.0.  It may require a coordinated Richfaces release from what Pete Muir had stated in the recent past.



          Sounds like this issue, yes.


          Also, is support for this type of error/problem covered by the EAP developer support contract?  From what I understand,
          EAP 4.3
          supports Seam 1.2.1.GA.

          So if we have a developer support contract with JBOss, will help on this problem be covered or not (i'm not sure if it's specific to 1.x or 2.x).


          Ask through support channels.



          I know increasing the concurrent-request-timeout to 10000 helps but it's only a workaround and not sure if it's recommended overall as it may have other problems associated with it.


          This can only be decided on an app by app basis (does it cause other problems, increasing this timeout?).


          Otherwise, make sure you don't do any heavy work in non-async methods called using AJAX.

          • 2. Re: conversation ended, timed out or was processing another request
            System Administrator Expert

            I was able to reproduce the error after commenting out the a4j:support line/tag.  So it has nothing to do with the onblur event firing as specified in the JIRA.


            It may be related to the rich:suggestionbox component.  I will increase the concurrent-request-timeout in components.xml in the meantime...


            Is this problem happening with other users and other a4j:support events as well?  or is it mostly onblur?


            need to know the impact/scope of this problem in terms of number of richfaces components that will create this error.  thx.

            • 3. Re: conversation ended, timed out or was processing another request
              Damian Harvey Apprentice

              If you read the forum post the is associated with that JIRA there is a long discussion about all of this. I have an ajax4JSF/Richfaces heavy app and haven't had any problems since I increased the concurrent-request-timeout to 10000. If it's considered a work-around then it's certainly one work-around that will definitely be in my production app.


              Even after commenting out your a4j:support tag you might still cause this from your a4j:suggestionBox. Before you increase the request-timeout try adding in attributes such as requestDelay, minChars and giving it the same eventsQueue as the a4j:support tag.


              Generally speaking I try to avoid the onblur event. Mostly because it fires the ajax request when nothing has changed. Try onchange instead.


              If you haven't already done so, read section 5.4.2 of the Richfaces Docs.


              Cheers,


              Damian.

              • 4. Re: conversation ended, timed out or was processing another request
                System Administrator Expert

                well I have tried 10000 and the error still happens (but not as frequently).


                and most SEAM apps use Richfaces pretty extensively, so I'm wondering why the default value is 500 ms?

                • 5. Re: conversation ended, timed out or was processing another request
                  Damian Harvey Apprentice

                  If you have done all of these steps and you're still getting it then try timing/profiling your backing method. If it's heavy I'd follow Pete's suggestion and poll for the result rather than wait for it.


                  Cheers,


                  Damian.

                  • 6. Re: conversation ended, timed out or was processing another request
                    System Administrator Expert

                    I read section 6.9. Concurrent calls to conversational components in the Seam ref doc.  That was pretty helpful in explaining why it happens.


                    determining the number of ms for concurrent-request-timeout may depend on the environment the Seam app is deployed in.

                    • 7. Re: conversation ended, timed out or was processing another request
                      Christian Bauer Master

                      I haven't been following this thread BUT:


                      If you specify an eventsQueue for all Richfaces and Ajax4JSF events, you no longer have asynchronous requests hitting the server. All events generated on the client should be send to the server in a serial fashion. Hence, you should not see any concurrent conversation access timeouts. IF you did this and you can still reproduce the issue reliably, open a JIRA issue with Richfaces and attach your testcase.


                      The requestDelay and ignoreDupResponse attributes are options that change how the queue is handled. We already have two feature requests we want here:


                      - a global option that defines a queue for all events generated on a page, in other words, a switch that executes all Richfaces/A4JSF events synchronously on a page


                      - an ignoreDupRequests attribute that kicks out duplicate requests in the queue if requestDelay has not been reached and a new event of the same type occurs


                      The concurrent request timeout on the server is a protection Seam offers you. By definition, conversation state on the server is accessed concurrently if you deal with asynchronous JavaScript requests. So you need to synchronize at some point to deal with these race conditions. Seam offers a simple lock plus timeout mechanism, and you can change the timeout value globally. That's it.


                      The only other choice you have is to avoid concurrent (asynchronous) requests on the client, which is what the eventsQueue is supposed to do, and tune on that end.


                      There is no general solution here, it all depends what your UI is doing and what actions your server needs to execute to satisfy the events produced on the UI.






                      • 8. Re: conversation ended, timed out or was processing another request
                        System Administrator Expert

                        thanks for the thorough reply, Christian.  from a best practices perspective, I got my answer (why it happens and what to do about it).


                        I will take your recommendation into account and try it out in our Seam projects here.


                        thanks again!

                        • 9. Re: conversation ended, timed out or was processing another request
                          System Administrator Expert

                          referring to the two feature requests, what version are those targeted for and what are the JIRA's for those?  thx.

                          • 10. Re: conversation ended, timed out or was processing another request
                            Christian Bauer Master

                            Well, search the JIRA database and put the links here.

                            • 11. Re: conversation ended, timed out or was processing another request
                              System Administrator Expert

                              attempted fix by adding

                              eventsQueue="myqueue"

                              to the rich:suggestionbox tag as specified by Bauer.  I still was able to reproduce the error/behavior.


                              Then I also added

                              requestDelay=1000

                              and
                              ignoreDupResponses="true"

                              .


                              I was not able to reproduce the error/behavior with these settings however, 1000ms is too slow for this component.  Any time setting lower than this and I can reproduce the error consistently.


                              work-around deemed unacceptable and rejected.


                              I updated the following 
                              thread
                              on Richfaces forum.  Not sure if they have a JIRA on this or not but it sounds like there may be a fix as Ilya is recommending to original poster in thread to upgrade to later GA of RF.


                              What version of Richfaces with Seam 2.1.0 have?  Will Seam 2.1.x (or later GA) be part of EAP 5?


                              I have a feeling Ilya will recommend upgrading to a newer GA version of Richfaces which may have a fix for this and we simply can't do that as we are on EAP 4.3 with Seam 2.0.0.GA.


                              Is anybody experiencing this problem?  It's often times difficult to determine if the root-cause is in Seam or Richfaces (or both).


                              thx.


                              • 12. Re: conversation ended, timed out or was processing another request
                                Pete Muir Master

                                Arbi Sookazian wrote on Mar 26, 2008 11:58 PM:


                                What version of Richfaces with Seam 2.1.0 have?


                                RichFaces 3.2.x



                                Will Seam 2.1.x (or later GA) be part of EAP 5?

                                You need to discuss product, (rather than project) roadmap with sales, sorry.

                                • 13. Re: conversation ended, timed out or was processing another request
                                  System Administrator Expert

                                  I am getting the conversation ended, timed out or was processing another request error again in a different use case.


                                  The error occurs after I select a value in drop-down.  It is happening erratically as I can sometimes reproduce it for the same value selected and sometimes not.  I have tried using the eventsQueue and ignoreDupResponses as below to no avail.  I have a breakpoint set in the first line of the SFSB method and when the error occurs, the method does not get executed.


                                  Any ideas on how to fix this?  thx.


                                  <!DOCTYPE composition PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
                                                        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
                                                        
                                  
                                                        
                                  <ui:composition xmlns="http://www.w3.org/1999/xhtml"
                                                  xmlns:s="http://jboss.com/products/seam/taglib"
                                                  xmlns:ui="http://java.sun.com/jsf/facelets"
                                                  xmlns:f="http://java.sun.com/jsf/core"
                                                  xmlns:h="http://java.sun.com/jsf/html"
                                                  xmlns:rich="http://richfaces.org/rich"
                                                              xmlns:a4j="http://richfaces.org/a4j"                
                                                  template="layout/template.xhtml">
                                          
                                  <ui:define name="body">
                                               
                                  
                                  
                                  <!-- <h:messages globalOnly="true" styleClass="message" />   -->
                                                                          <script type="text/javascript">
                                                                                          //<![CDATA[
                                                                                          
                                                                                          var totalAssignments = 0;
                                                                                          
                                                                                          function onLoadKeepFocusOnTech()
                                                                                          {
                                                                                                  document.getElementById('form1:seltech').focus();                                                               
                                                                                                  return true;
                                                                                          }
                                                                                          
                                                                                          function confirmMode(modeString, argBarCode)
                                                                                          {
                                                                                                  var returnVal = false;
                                                                                                  var confirmStr = "Do you wish to "+modeString;
                                                                                                  var answer;
                                                                                                   if ("Remove" == modeString)
                                                                                                   {
                                                                                                          confirmStr = confirmStr + " Barcode "+ argBarCode + " ?";
                                                                                                          answer=window.confirm(confirmStr);
                                                                                                          if (answer==true)
                                                                                                          {
                                                                                                                  document.getElementById('form1:seltech').disabled = true;
                                                                                                                  totalAssignments = totalAssignments - 1;
                                                                                                                  if (totalAssignments == 0)
                                                                                                                  {
                                                                                                                          document.getElementById('form1:barcode').value="";
                                                                                                                          document.getElementById('form1:displayMessageLabel').value="";
                                                                                                                  }
                                                                                                                  return true;
                                                                                                                  // returnVal = true;
                                                                                                          } 
                                                                                                          else 
                                                                                                          { 
                                                                                                                  returnVal = false;
                                                                                                          }
                                                                                                  }
                                                                                                  else
                                                                                                  {
                                                                                                          confirmStr = confirmStr + " ? ";
                                                                                                          answer=window.confirm(confirmStr);
                                                                                                          if (answer==true)
                                                                                                          {
                                                                                                                  returnVal = true;
                                                                                                          } 
                                                                                                          else 
                                                                                                          { 
                                                                                                                  returnVal = false;
                                                                                                          }                                                       
                                                                                                  }
                                                                                                  return returnVal;
                                                                                          }       
                                                                                          
                                                                                          function checkNum(x)
                                                                                          {
                                                                                           
                                                                                            var s_len=x.length ;
                                                                                            var s_charcode = 0;
                                                                                              for (var s_i=0;s_i<s_len;s_i++)
                                                                                              {
                                                                                               s_charcode = x.charCodeAt(s_i);
                                                                                               if(!((s_charcode>=48 && s_charcode<=57)))
                                                                                                {
                                                                                                   alert("Only Numeric Values are Allowed");
                                                                                                   x='';
                                                                                                   x.focus();
                                                                                                  return false;
                                                                                                }
                                                                                              }
                                                                                              return true;
                                                                                          }                                       
                                                                                          
                                                                                          function changePointer(onOff) {
                                                                                                  
                                                                                                  if (onOff == true) {
                                                                                                          document.body.style.cursor = "wait";
                                                                                                  }
                                                                                                  else {
                                                                                                          document.body.style.cursor = "default";
                                                                                                  }
                                                                                          }                                                                               
                                                                                          
                                                                                  //]]>
                                                                                  </script> 
                                                                  
                                                                  
                                                                          <body bgcolor="white" onload="return onLoadKeepFocusOnTech();">
                                                                          
                                                                                  <h:panelGrid width="100%" styleClass="shimsHeader">
                                                                                          Assign Inventory to Technician
                                                                                  </h:panelGrid>
                                                                                  <br></br><br></br>
                                                                          
                                                                                  <a4j:status id="status" onstart="changePointer(true)" onstop="changePointer(false)"/>
                                                                                                  
                                                                                  <rich:panel>
                                                                                     <h:form id="form1">                                                                            
                                                                                                  <h:panelGrid id="firstpanel" columns="2">
                                                                                                            <h:panelGrid styleClass="shimsLabel" style="width: 200px">
                                                                                                                          Select Technician
                                                                                                            </h:panelGrid>
                                                                                                            <h:column>
                                                                                                                          <!-- <h:selectOneMenu             id="seltech"    immediate="true" value="#{assignInvToTech.selectedTech}" disabled="#{assignInvToTech.techSelectDisabled}">   --> 
                                                                                                                          <!-- <h:selectOneMenu             id="seltech"    value="#{assignInvToTech.selectedTech}" disabled="#{assignInvToTech.techSelectDisabled}">   -->
                                                                                                                          <h:selectOneMenu             id="seltech"    value="#{assignInvToTech.selectedTech}">
                                                                                                                                  <f:selectItems               id="techList"   value="#{assignInvToTech.techniciansList}"/>
                                                                                                                          <!-- <a4j:support                 event="onchange" action="#{assignInvToTech.processValueChange}" ajaxSingle="true" reRender="btnassigntotech, addBtn, seltech"/>   -->
                                                                                                                          <!-- <a4j:support                 event="onchange" action="#{assignInvToTech.processValueChange}" reRender="btnassigntotech, addBtn, seltech"/>   -->
                                                                                                                          <a4j:support                 event="onchange" action="#{assignInvToTech.processValueChange}" eventsQueue="test1" ignoreDupResponses="true"/>
                                                                                                                  </h:selectOneMenu>
                                                                                                            </h:column>
                                                                                                            
                                                                                                            <h:panelGrid styleClass="shimsLabel" style="width: 200px">
                                                                                                                          Enter Barcode
                                                                                                            </h:panelGrid>
                                                                                                            
                                                                                                            <h:column>
                                                                                                                  <h:panelGrid columns="2">
                                                                                                                          <h:inputText id="barcode" value="#{tbHardware.coxBarcode}" maxlength="5" size="10">
                                                                                                                                  <s:validate/>                             
                                                                                                                                  <a4j:support event="onblur" ajaxSingle="true"/>                                                                           
                                                                                                                          </h:inputText>                                                              
                                                                                                                          <a4j:commandButton id="addBtn" value="Add" ajaxSingle="true" action="#{assignInvToTech.addBarCodeToTech}" disabled="#{assignInvToTech.addBtnDisabled}" reRender="form2, btnassigntotech" style="width: 53px"/>
                                                                                                                   </h:panelGrid>
                                                                                                            </h:column>                                                                                             
                                                                                                  </h:panelGrid>
                                                                                                                                                                  
                                                                                                  <rich:messages layout="list" styleClass="errors"/>
                                                                                                                                                                                                                                  
                                                                                          </h:form>                                                                 
                                                                                  </rich:panel>
                                                                                          
                                                                                          
                                                                                  <rich:panel>
                                                                                  <br></br><br></br>
                                                                                                                                          
                                                                                  <a4j:form id ="form2" ajaxSubmit="true" reRender="barcode,myimg, formbtns, hardwaretable, norecsfoundmsg">
                                                                                          <!-- <rich:dataTable id="hardwaretable" value="#{assignInvToTech.finalHardwareTableList}" var="list">   -->                 
                                                                                          <rich:dataTable id="hardwaretable" value="#{finalHardwareTableList}" style="width: 100%;" var="list">
                                                                                                          <rich:column>
                                                                                                                  <f:facet name="header"><h:outputText value="Barcode"/></f:facet>
                                                                                                                  <h:outputText value="#{list[0].coxBarcode}"/>
                                                                                                          </rich:column>
                                                                                                          
                                                                                                          <rich:column>
                                                                                                                  <f:facet name="header"><h:outputText value="Purchaser"/></f:facet>
                                                                                                                  <h:outputText value="#{list[4].ownerTypeDesc}"/>
                                                                                                          </rich:column>    
                                                                                                                                                                                          
                                                                                                          <rich:column>
                                                                                                                  <f:facet name="header"><h:outputText value="Manufacturer"/></f:facet>
                                                                                                                  <h:outputText value="#{list[2].hardwareVendorDesc}"/>
                                                                                                          </rich:column>
                                                                                                          
                                                                                                          <rich:column>
                                                                                                                  <f:facet name="header"><h:outputText value="Type"/></f:facet>
                                                                                                                  <h:outputText value="#{list[3].hardwareTypeDesc}"/>
                                                                                                          </rich:column>
                                                                                                          
                                                                                                          <rich:column>
                                                                                                                  <f:facet name="header"><h:outputText value="Model"/></f:facet>
                                                                                                                  <h:outputText value="#{list[1].hardwareModel}"/>
                                                                                                          </rich:column>
                                                                                                          
                                                                                                          <!-- this may need to be refactored in the future to account for multiple notes with a rich:dataList or repeater component --> 
                                                                                                          <rich:column>
                                                                                                                  <f:facet name="header"><h:outputText value="Notes"/></f:facet>
                                                                                                                  <h:outputText value="#{list[0].tbHardwareNotes.toArray()[0].hardwareNote}"/>
                                                                                                          </rich:column>
                                                                                                          
                                                                                                          <rich:column>
                                                                                                                  <f:facet name="header"><h:outputText value="Remove"/></f:facet>                                                                                                       
                                                                                                                          <h:selectBooleanCheckbox>                                         
                                                                                                                                  <!-- <a4j:support event="onclick" action="#{assignInvToTech.removeBarCode}" onclick="return confirmMode('Remove', '#{list[0].coxBarcode}');" reRender="form2, btnassigntotech"/>   -->
                                                                                                                                  <a4j:support event="onclick" action="#{assignInvToTech.removeBarCode}" reRender="form2, btnassigntotech"/>
                                                                                                                                  <!-- refactor hidden input to use DataModelSelectionIndex or page param instead... -->                                                                                                                                                            
                                                                                                                                  <!-- <input type="hidden" name="paramBarCode" value="#{list[0].coxBarcode}"/>   -->
                                                                                                                          </h:selectBooleanCheckbox>                                                                                                                                                                                
                                                                                                          </rich:column>            
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          
                                                                                          </rich:dataTable>
                                                                                          <br/><br/>
                                                                                          <h:commandButton id="btnassigntotech"        value="Assign to Technician"    action="#{assignInvToTech.populateHardwareAndHistory}"  disabled="#{assignInvToTech.assignToTechBtnDisabled}"   onclick="return confirmMode('Assign To Technicians','');"/>
                                                                                          <h:commandButton id="cancel"                         value="Cancel"                                  action="#{assignInvToTech.cancel}"                                              disabled="false"                                                                onclick="return confirmMode('Cancel','');"/>
                                                                                          
                                                                                  </a4j:form>       
                                                                                  <br></br>    
                                  
                                                                                  </rich:panel>
                                                                      </body>       
                                  </ui:define> 
                                  </ui:composition> 

                                  1 2 Previous Next