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 _______________________________________________ jboss-user mailing list jboss-user@lists.jboss.org https://lists.jboss.org/mailman/listinfo/jboss-user