[jboss-user] [JBoss jBPM] - Using Context and Command

asrickard do-not-reply at jboss.com
Thu Jul 30 09:39:16 EDT 2009


I've been trying to work out how to use context functions and the Command system, and need some suggestions/assistance.

I have a conversation-scoped Seam component "workflowProcessManager" in which I have a list of running processes which is refreshed when the user clicks a commandLink.  In the same component I have a function to suspend a ProcessInstance.


  | 
  | @Name("workflowProcessManager")
  | @Scope(ScopeType.CONVERSATION)
  | public class WorkflowProcessManager {
  | 
  | private JbpmContext context;
  | private CommandServiceImpl csi;
  | private Boolean showActiveOnly = true;
  | 
  | @DataModel private List<ProcessDefinition> processDefinitions = new Vector<ProcessDefinition>(0);
  | @DataModelSelection("processDefinitions") @Out(required=false) private ProcessDefinition currentProcessDefinition;
  | 
  | @DataModel private List<ProcessInstance> runningProcesses = new Vector<ProcessInstance>(0);
  | @DataModelSelection("runningProcesses") @Out(required=false) private ProcessInstance currentRunningProcess;
  | 
  | public void init() {
  | 	context = JbpmConfiguration.getInstance().createJbpmContext();
  | 	populateProcessDefinitionList();
  | 	csi = new CommandServiceImpl(context.getJbpmConfiguration());
  | }
  | 
  | public void showProcessesForProcessDefinition(ProcessDefinition pd) {
  | 	GetProcessInstancesCommand gpic = new GetProcessInstancesCommand();
  | 	
  | 	if (this.showActiveOnly) 
  | 		gpic.setOnlyRunning(true);
  | 	else
  | 		gpic.setOnlyRunning(false);
  | 	gpic.setProcessName(pd.getName());
  | 	
  | 	runningProcesses = (List<ProcessInstance>) csi.execute(gpic);
  | 	System.out.println("ShowProcessesForProcessDefinition: runningProcesses contains " + runningProcesses.size() + " entries.");
  | }
  | 
  | public void suspendProcessInstance(Integer id) {
  | 	System.out.println("Suspending process instance " + id);
  | 	ProcessInstance pi = context.getProcessInstance(id);
  | 
  | 	pi.suspend();
  | 
  | 	System.out.println("Saving process instance " + id);
  | 	context.save(pi);
  | 
  | 	//Session session = context.getSession();
  | 	//session.flush();
  | 
  | 	if (pi.isSuspended()) System.out.println("Process instance is suspended = true");
  | 	else  System.out.println("Process instance is suspended = false");
  | 
  | 	System.out.println("Refreshing processes for definition " + this.currentProcessDefinition.getName());
  | 	showProcessesForProcessDefinition(this.currentProcessDefinition);
  | 		
  | 	for (ProcessInstance p : this.runningProcesses) {
  | 		if (p.isSuspended()) System.out.println("Process instance " + p.getId() + " is suspended = true");
  | 		else  System.out.println("Process instance " + p.getId() + " is suspended = false");
  | 	}
  | }
  | 
  | 	public Boolean getShowActiveOnly() {
  | 		return this.showActiveOnly;
  | 	}
  | 	public void setShowActiveOnly(Boolean showActiveOnly) {
  | 		this.showActiveOnly = showActiveOnly;
  | 	}
  | 	
  | 	@SuppressWarnings("unchecked")
  | 	private void populateProcessDefinitionList() {
  | 		processDefinitions = context.getGraphSession().findAllProcessDefinitions();
  | 	}
  | 
  | }
  | 

And the guts of the page:

  | 	    <rich:panel>
  | 	        <f:facet name="header">Process List</f:facet>
  | 
  | 	    	<h:panelGrid columns="2" columnClasses="twoColumnTopAligned">
  | 				<h:panelGroup>
  | 			        <rich:dataTable value="#{processDefinitions}" var="processDefinition"
  | 			        	onRowMouseOver="this.style.backgroundColor='#EAEAEA';this.style.cursor='pointer'"
  | 						onRowMouseOut="this.style.backgroundColor='#{a4jSkin.tableBackgroundColor}'">
  | 						<rich:column>
  | 							<f:facet name="header">Process Name</f:facet>
  | 							<h:outputText value="#{processDefinition.name}"/>
  | 						</rich:column>
  | 						
  | 						<rich:column>
  | 							<f:facet name="header">Description</f:facet>
  | 							<h:outputText value="#{processDefinition.description}"/>
  | 						</rich:column>
  | 
  | 						<a:support event="onRowClick" reRender="instanceTable"
  | 			       			action="#{workflowProcessManager.showProcessesForProcessDefinition(processDefinition)}">
  | 			    		</a:support>
  | 					</rich:dataTable>
  | 					
  | 					<s:decorate id="showActiveOnlyField" template="/layout/edit.xhtml">
  | 						<ui:define name="label">Show only active processes</ui:define>
  | 						<h:selectBooleanCheckbox id="showActiveOnly" value="#{workflowProcessManager.showActiveOnly}" />
  | 					</s:decorate>
  | 				</h:panelGroup>
  | 
  | 		        <rich:dataTable id="instanceTable" value="#{runningProcesses}" var="processInstance">
  | 					<rich:column>
  | 						<f:facet name="header">Id</f:facet>
  | 						<h:outputText value="#{processInstance.id}"/>
  | 					</rich:column>
  | 					<rich:column>
  | 						<f:facet name="header">Version</f:facet>
  | 						<h:outputText value="#{processInstance.version}"/>
  | 					</rich:column>
  | 					
  | 					<rich:column>
  | 						<f:facet name="header">Status</f:facet>
  | 						<h:outputText value="Finished" rendered="#{processInstance.hasEnded()}"/>
  | 						<h:outputText value="Paused" rendered="#{processInstance.suspended}"/>
  | 						<h:outputText value="Running" rendered="#{!(processInstance.hasEnded() or processInstance.suspended)}"/>
  | 					</rich:column>
  | 	
  | 					<rich:column>
  | 						<f:facet name="header">Current Node</f:facet>
  | 						<h:outputText value="#{processInstance.rootToken.name}"/>
  | 					</rich:column>
  | 	
  | 					<rich:column>
  | 						<f:facet name="header">Actions</f:facet>
  | 						<a:commandLink id="pauseProcessInstance"
  | 					        action="#{workflowProcessManager.suspendProcessInstance(processInstance.id)}"
  | 					        reRender="instanceTable"
  | 					        value="Pause">
  | 				        	<s:conversationId />
  | 		        		</a:commandLink>
  | 		        		#{' '}
  | 						<a:commandLink id="resumeProcessInstance"
  | 					        action="#{workflowProcessManager.resumeProcessInstance(processInstance.id)}"
  | 					        reRender="instanceTable"
  | 					        value="Restart">
  | 				        	<s:conversationId />
  | 		        		</a:commandLink>
  | 		        		#{' '}
  | 						<a:commandLink id="signalProcessInstances"
  | 					        action="#{workflowProcessManager.signalProcessInstance(processInstance.id)}"
  | 					        reRender="instanceTable"
  | 					        value="Signal">
  | 				        	<s:conversationId />
  | 		        		</a:commandLink>
  | 		        	</rich:column>
  | 				</rich:dataTable>
  | 		
  | 			</h:panelGrid>
  | 		
  | 	    </rich:panel>
  | 

The problem I experience is that the list of running ProcessInstances is not refreshed correctly, unless I add in the hibernate session flush() (commented out in the code above).

The command service starts up a separate JbpmContext, which I believe is not seeing the results of the suspend() call, and so refreshes the .

Should I be looking for a problem somewhere in the configuration, and if so where?  Or am I using the Jbpm features incorrectly somehow?  Or do I need to manually flush like this?

Any pointers from more experienced people will be much appreciated...

View the original post : http://www.jboss.org/index.html?module=bb&op=viewtopic&p=4246996#4246996

Reply to the post : http://www.jboss.org/index.html?module=bb&op=posting&mode=reply&p=4246996



More information about the jboss-user mailing list