5 Replies Latest reply on Jun 6, 2007 3:15 AM by Ronald van Kuijk

    Problem with more than 1 user

    Roberto Alonso Ramos Zapata Newbie

      I don't know if is a configuration problem, or whats going on but, Im working with JBPM 3.1.4 starters kit.

      This is whats happening:
      Im login from 2 different client computers. They login find, but when one of them starts a process the other one stops working. What I mean by stops working is that he can't start a process or a task, o even see a list of pending task, its like is doesn't have access to the database until de other one finish his task.

      I'm not posting any code cause I'm using the homebean and taskbean from de jbpm.webapp package.

        • 1. Re: Problem with more than 1 user
          Ronald van Kuijk Master

          - Logging in with same user?
          - Errors on the second server? Or just empty tasklists or errors when starting a process or .....

          Please be more specific

          • 2. Re: Problem with more than 1 user
            Roberto Alonso Ramos Zapata Newbie

            I solve the problem (kind of).
            The thing is that for some reason, in my application I have to close the context (jbpmContext.close()), differring from what they do in the jbpm.webapp example, maybe you can give me a hint in why is that.

            Answering the question you post to get more details, it happens with the same user, or with different users.
            And it doesn't give me any error, it just hangs.

            Here is the modification I did to make it work

            This is the original startProcess

            {
             long processDefinitionId = JsfHelper.getId("processDefinitionId");
             ProcessDefinition processDefinition = graphSession.loadProcessDefinition(processDefinitionId);
            
             ProcessInstance processInstance = new ProcessInstance(processDefinition);
            
            
             TaskInstance taskInstance = processInstance.getTaskMgmtInstance().createStartTaskInstance();
            
             jbpmContext.save(processInstance);
             // Fill the task backing bean with useful information
             this.task.initialize(taskInstance);
            
             return "task"
            }
            


            This is the startProcess modified

            {
            JbpmContext jbpmContext = JbpmConfiguration.getInstance().getCurrentJbpmContext();
             if(jbpmContext == null){
             jbpmContext = JbpmConfiguration.getInstance().createJbpmContext();
             }
            
             long processDefinitionId = JsfHelper.getId("processDefinitionId");
             ProcessDefinition processDefinition = graphSession.loadProcessDefinition(processDefinitionId);
            
             ProcessInstance processInstance = new ProcessInstance(processDefinition);
            
             TaskInstance taskInstance = processInstance.getTaskMgmtInstance().createStartTaskInstance();
            
             jbpmContext.save(processInstance);
            
             // Fill the task backing bean with useful information
             this.task.initialize(taskInstance);
            
             jbpmContext.close();
            
             return taskInstance.getName();//This is for something on my navigation
            }
            


            • 3. Re: Problem with more than 1 user
              Ronald van Kuijk Master

              Coud be that the webapp does some closing in a jsf phase. It cannot work without closing it. So.....

              • 4. Re: Problem with more than 1 user
                Roberto Alonso Ramos Zapata Newbie

                Im not very familiarize with the use of filters in the web.xml, but probably it has something to do with this:

                <filter-name>JbpmContextFilter</filter-name>
                <filter-class>org.jbpm.web.JbpmContextFilter</filter-class>

                <filter-mapping>
                <filter-name>JbpmContextFilter</filter-name>
                <url-pattern>/*</url-pattern>
                </filter-mapping>

                In the class that the mention there (org.jbpm.web.JbpmContextFilter), in the doFilter method, at the end they use the jbpmContext.close();, which I believe is executing everytime a jsp is run, because of the mapping /*

                the complete class is the following:

                package org.jbpm.web;
                
                import java.io.IOException;
                import java.io.Serializable;
                import java.security.Principal;
                
                import javax.servlet.Filter;
                import javax.servlet.FilterChain;
                import javax.servlet.FilterConfig;
                import javax.servlet.ServletException;
                import javax.servlet.ServletRequest;
                import javax.servlet.ServletResponse;
                import javax.servlet.http.HttpServletRequest;
                
                import org.jbpm.JbpmConfiguration;
                import org.jbpm.JbpmContext;
                
                public class JbpmContextFilter implements Filter, Serializable {
                
                 private static final long serialVersionUID = 1L;
                
                 String jbpmConfigurationResource = null;
                 String jbpmContextName = null;
                 boolean isAuthenticationEnabled = true;
                
                 public void init(FilterConfig filterConfig) throws ServletException {
                 // get the jbpm configuration resource
                 this.jbpmConfigurationResource = filterConfig.getInitParameter("jbpm.configuration.resource");
                
                 // get the jbpm context to be used from the jbpm configuration
                 this.jbpmContextName = filterConfig.getInitParameter("jbpm.context.name");
                 if (jbpmContextName==null) {
                 jbpmContextName = JbpmContext.DEFAULT_JBPM_CONTEXT_NAME;
                 }
                
                 // see if authentication is turned off
                 String isAuthenticationEnabledText = filterConfig.getInitParameter("authentication");
                 if ( (isAuthenticationEnabledText!=null)
                 && ("disabled".equalsIgnoreCase(isAuthenticationEnabledText))
                 ) {
                 isAuthenticationEnabled = false;
                 }
                 }
                
                 public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
                 String actorId = null;
                
                 // see if we can get the authenticated swimlaneActorId
                 if (servletRequest instanceof HttpServletRequest) {
                 HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
                 Principal userPrincipal = httpServletRequest.getUserPrincipal();
                 if (userPrincipal != null) {
                 actorId = userPrincipal.getName();
                 }
                 }
                
                 JbpmContext jbpmContext = getJbpmConfiguration().createJbpmContext(jbpmContextName);
                 try {
                 if (isAuthenticationEnabled) {
                 jbpmContext.setActorId(actorId);
                 }
                 filterChain.doFilter(servletRequest, servletResponse);
                 } finally {
                 jbpmContext.close();
                 }
                 }
                
                 protected JbpmConfiguration getJbpmConfiguration() {
                 return JbpmConfiguration.getInstance(jbpmConfigurationResource);
                 }
                
                 public void destroy() {
                 }
                }
                


                Could I be right?