[JBoss jBPM] - Re: jBPM versus MS Workflow
by kukeltje
Uhm.... my personal comments
- .NET 3.5 is stable, just like jBPM 3.2.3 is stable... or JDK 1.5.0_02 is stable. If you would have said .NET is stable, then it is a different thing (4 releases in?). The jBPM API has not changed that much in the last 2 years, so I'd say it is quite stable.
>From your statement I cannot determine where persistence and thread synchronization (aren't they two only partly related things?) are more robust in MS Workflow then in jBPM. The latter uses Hibernate which is really robust. The relation with Rich Clients is totally unclear to me, since jBPM can be used in stand-alone, pure web or rich client implementations. If you could elaborate a little more, I can try to comment.
Comparing the MS Workflow 'platform' to jBPM is imo comparing apples to grapes (not even oranges). I think you should include SEAM, JBossTools etc... to have a real comparison (I do not know the details of MS Workflow)
So even with my basic knowledge of MS Workflow, I have to say you statement of 'superiour' is a bold statement and needs more detailed arguments (yes, I'm biased, but I get the feeling you are to ;-) )
View the original post : http://www.jboss.com/index.html?module=bb&op=viewtopic&p=4166022#4166022
Reply to the post : http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&p=4166022
16 years, 4 months
[JBoss jBPM] - Re: Difference pooled-actors and swimlanes
by kukeltje
anonymous wrote : Where should the user be selected?
In your own webapp or some other way (rules engine, whatever)
anonymous wrote : "originally assigned"?
The one that is selected e.g. by your webapp above
anonymous wrote : Sorry, but this part is also not easy to understand. So at any time I have to assign an individual actor explicitly to a task? I mean, my application is still doing what I expect by not assigning the user explicitly.
|
That is because you have to think differently. Look at some of the testcases in the source about taskmanagement and much will be clearer.
- Task is created and assigned to pooled actors
- Task is visible in pooled tasklist
- Task is done by one person e.g. in 1 day
- Task should not be visible in pooled tasklist since someone is working on it
- Therefor assign to actor, but leave the pooled actors also assigned
- If User gets sick, make actor 'null' and task is visible again in pooled tasklist
View the original post : http://www.jboss.com/index.html?module=bb&op=viewtopic&p=4166011#4166011
Reply to the post : http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&p=4166011
16 years, 4 months
[JBoss jBPM] - How does jBPM handle persistance
by grin1dan
Hello All...I am looking for a little guidance on determining exactly how jBPM handles persistance. I found a decent excerpt but I wonder if anyone could tell me a little more about what the "JbpmContext" is:
Database and transactions
The basic jBPM workings do not require any persistency, it is an optional step to make process definitions and instances persistent. This is done by surrounding the jBPM operations with the retrieval of a "JbpmContext" and using its methods to persist the entities.
A JbpmContext requires closing, which will close the services managed by the context, among which the "PersistenceService", and upon closing this service, the database transaction will be committed, or rolled back if JbpmContext.setRollbackOnly() was called. (The PersistenceService by default starts a transaction when the database connection is first retrieved).
So it is upon us (of course) to call JbpmContext.setRollbackOnly() in case an exception occurs, where we don't want things to persist.
If we want to do things in the same database transaction as jBPM, we can do this inside the same JbpmContext retrieve/close block, by getting the connection using JbpmContext.getConnection() or the hibernate session using JbpmContext.getSession().
View the original post : http://www.jboss.com/index.html?module=bb&op=viewtopic&p=4165964#4165964
Reply to the post : http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&p=4165964
16 years, 4 months
[JBoss jBPM] - jBPM versus MS Workflow
by grin1dan
Hello All...I have done a bit of research on both jBPM and MS Workflow to evaluate which is the better choice for an upcoming project. I am posting my conclusion here and I would appreciate it if you could comment on it, perhaps take on or the other position and make some arguments for the position. Thanks.
jBPM versus MS Workflow Conclusion
MS Workflow is a superior product to jBPM for several reasons. The .NET 3.5 framework is stable (more than the jBPM API) and allows ease of build as opposed to the continual reevaluation of the underlying java platform for jBPM. Persistance and thread synchronization can be handled in a more robust, elegant manner (rich client implementation) and the MS Workflow product can be used as a platform to build applications as opposed to simply capturing a state model.
View the original post : http://www.jboss.com/index.html?module=bb&op=viewtopic&p=4165908#4165908
Reply to the post : http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&p=4165908
16 years, 4 months
[JBoss jBPM] - Calling processInstance.end() when the the process is waitin
by pbrewer_uk
I'm using Jboss Seam 2.0.1.GA with jbpm 3.2.3.GA.
I have a simple process that has a process-state in it. Sometimes, I need to cancel the parent process instance, which should also cancel the child (process-state) process instance, if the child happens to be open.
Once the child process is in the wait state if I find the parent process instance and call the end() method then I get an error.
The error is complaining that the getVariable method is returning null, which is fair enough as presumably its just been cancelled. But why that code even being evaluated?
To me the process appears to be continuing execution instead of ending it immediately. Is this the correct behaviour or am I doing something unexpected? Any help with this would be much appreciated. Full details below.
Thanks in advance,
Pete.
Code used to cancel the parent process
| public void cancel() {
| Query query = getJbpmContext().getSession().getNamedQuery("processInstanceId.findByNameUnended") ;
| query.setParameter("name", "parentCancel") ;
|
| for (Long pid : (List<Long>)query.list()) {
| log.info("Ending process #0", pid) ;
| ProcessInstance processInstance = getJbpmContext().getProcessInstanceForUpdate(pid) ;
| processInstance.end() ;
| }
|
|
| }
|
Here are the definitions:
parent:
| <?xml version="1.0" encoding="UTF-8"?>
| <process-definition xmlns="urn:jbpm.org:jpdl-3.2"
| xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
| xsi:schemaLocation="urn:jbpm.org:jpdl-3.2 http://jbpm.org/xsd/jpdl-3.2.xsd"
| name="parentCancel" >
|
| <start-state name="start">
| <transition to="waitForSomething"></transition>
| </start-state>
|
| <process-state name="waitForSomething">
| <sub-process name="childCancel"/>
| <variable name="waitForSomethingOutcome" access="write" mapped-name="outcome" />
| <transition to="checkOutcome"></transition>
| </process-state>
|
| <decision name="checkOutcome" expression="#{processStateCancelTest.getVariable('waitForSomethingOutcome')}">
| <transition to="success" name="successOutcome"></transition>
| <transition to="fail" name="failOutcome"></transition>
| </decision>
| <end-state name="fail">
| </end-state>
| <end-state name="success">
| </end-state>
| </process-definition>
|
child
| <?xml version="1.0" encoding="UTF-8"?>
| <process-definition xmlns="urn:jbpm.org:jpdl-3.2"
| xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
| xsi:schemaLocation="urn:jbpm.org:jpdl-3.2 http://jbpm.org/xsd/jpdl-3.2.xsd"
| name="childCancel" >
|
| <start-state name="start">
| <transition to="waitingNode"></transition>
| </start-state>
|
|
| <state name="waitingNode">
| <transition to="done" name="success">
| <action expression="#{processStateCancelTest.setVariable('outcome', 'successOutcome')}" />
| </transition>
| <transition to="done" name="failure">
| <action expression="#{processStateCancelTest.setVariable('outcome', 'failOutcome')}" />
| </transition>
| </state>
|
| <end-state name="done">
| </end-state>
| </process-definition>
|
Here is the full log stack trace when end is called:
| 15:24:11,682 INFO [uk.co.iblocks.ProcessStateCancelTest] Ending process 2267 (parentCancel)
| 15:24:11,726 INFO [uk.co.iblocks.ProcessStateCancelTest] process-end on ProcessDefinition(childCancel) (process definition ProcessDefinition(childCancel))
| 15:24:11,768 INFO [uk.co.iblocks.ProcessStateCancelTest] before-signal on ProcessState(waitForSomething) (process definition ProcessDefinition(parentCancel))
| 15:24:11,803 INFO [uk.co.iblocks.ProcessStateCancelTest] node-leave on ProcessState(waitForSomething) (process definition ProcessDefinition(parentCancel))
| 15:24:11,836 INFO [uk.co.iblocks.ProcessStateCancelTest] node-enter on Decision(checkOutcome) (process definition ProcessDefinition(parentCancel))
| 15:24:11,844 WARN [uk.co.iblocks.ProcessStateCancelTest] Cannot access waitForSomethingOutcome in process parentCancel
| 15:24:11,847 DEBUG [uk.co.iblocks.ProcessStateCancelTest] Process parentCancel, returing variable waitForSomethingOutcome=null
| 15:24:11,863 FATAL [javax.enterprise.resource.webcontainer.jsf.application] /processTest.xhtml @51,165 action="#{processStateCancelTest.cancel('parentCancel')}": org.jbpm.JbpmException: decision expression '#{processStateCancelTest.getVariable('waitForSomethingOutcome')}' returned null
| javax.faces.el.EvaluationException: /processTest.xhtml @51,165 action="#{processStateCancelTest.cancel('parentCancel')}": org.jbpm.JbpmException: decision expression '#{processStateCancelTest.getVariable('waitForSomethingOutcome')}' returned null
| at org.jbpm.graph.node.Decision.execute(Decision.java:97)
| at org.jbpm.graph.def.Node.enter(Node.java:318)
| at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
| at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
| at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
| at java.lang.reflect.Method.invoke(Method.java:597)
| at org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.java:173)
| at org.jbpm.graph.def.Node_$$_javassist_171.enter(Node_$$_javassist_171.java)
| at org.jbpm.graph.def.Transition.take(Transition.java:151)
| at org.jbpm.graph.def.Node.leave(Node.java:393)
| at org.jbpm.graph.node.ProcessState.leave(ProcessState.java:224)
| at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
| at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
| at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
| at java.lang.reflect.Method.invoke(Method.java:597)
| at org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.java:173)
| at org.jbpm.graph.def.Node_$$_javassist_171.leave(Node_$$_javassist_171.java)
| at org.jbpm.graph.exe.Token.signal(Token.java:192)
| at org.jbpm.graph.exe.Token.signal(Token.java:168)
| at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
| at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
| at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
| at java.lang.reflect.Method.invoke(Method.java:597)
| at org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.java:179)
| at org.jbpm.graph.exe.Token_$$_javassist_107.signal(Token_$$_javassist_107.java)
| at org.jbpm.graph.exe.ProcessInstance.end(ProcessInstance.java:322)
| at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
| at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
| at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
| at java.lang.reflect.Method.invoke(Method.java:597)
| at org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.java:173)
| at org.jbpm.graph.exe.ProcessInstance_$$_javassist_176.end(ProcessInstance_$$_javassist_176.java)
| at org.jbpm.graph.exe.Token.notifyParentOfTokenEnd(Token.java:329)
| at org.jbpm.graph.exe.Token.end(Token.java:301)
| at org.jbpm.graph.exe.Token.end(Token.java:251)
| at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
| at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
| at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
| at java.lang.reflect.Method.invoke(Method.java:597)
| at org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.java:173)
| at org.jbpm.graph.exe.Token_$$_javassist_107.end(Token_$$_javassist_107.java)
| at org.jbpm.graph.exe.ProcessInstance.end(ProcessInstance.java:302)
| at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
| at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
| at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
| at java.lang.reflect.Method.invoke(Method.java:597)
| at org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.java:173)
| at org.jbpm.graph.exe.ProcessInstance_$$_javassist_176.end(ProcessInstance_$$_javassist_176.java)
| at org.jbpm.graph.exe.Token.end(Token.java:283)
| at org.jbpm.graph.exe.Token.end(Token.java:251)
| at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
| at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
| at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
| at java.lang.reflect.Method.invoke(Method.java:597)
| at org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.java:173)
| at org.jbpm.graph.exe.Token_$$_javassist_107.end(Token_$$_javassist_107.java)
| at org.jbpm.graph.exe.ProcessInstance.end(ProcessInstance.java:302)
| at uk.co.iblocks.midas.workflow.ProcessStateCancelTest.cancel(ProcessStateCancelTest.java:37)
| at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
| at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
| at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
| at java.lang.reflect.Method.invoke(Method.java:597)
| at org.jboss.seam.util.Reflections.invoke(Reflections.java:21)
| at org.jboss.seam.intercept.RootInvocationContext.proceed(RootInvocationContext.java:31)
| at org.jboss.seam.intercept.SeamInvocationContext.proceed(SeamInvocationContext.java:56)
| at org.jboss.seam.transaction.RollbackInterceptor.aroundInvoke(RollbackInterceptor.java:31)
| at org.jboss.seam.intercept.SeamInvocationContext.proceed(SeamInvocationContext.java:68)
| at org.jboss.seam.transaction.TransactionInterceptor$1.work(TransactionInterceptor.java:38)
| at org.jboss.seam.util.Work.workInTransaction(Work.java:40)
| at org.jboss.seam.transaction.TransactionInterceptor.aroundInvoke(TransactionInterceptor.java:32)
| at org.jboss.seam.intercept.SeamInvocationContext.proceed(SeamInvocationContext.java:68)
| at org.jboss.seam.core.MethodContextInterceptor.aroundInvoke(MethodContextInterceptor.java:42)
| at org.jboss.seam.intercept.SeamInvocationContext.proceed(SeamInvocationContext.java:68)
| at org.jboss.seam.intercept.RootInterceptor.invoke(RootInterceptor.java:107)
| at org.jboss.seam.intercept.JavaBeanInterceptor.interceptInvocation(JavaBeanInterceptor.java:166)
| at org.jboss.seam.intercept.JavaBeanInterceptor.invoke(JavaBeanInterceptor.java:102)
| at uk.co.iblocks.midas.workflow.ProcessStateCancelTest_$$_javassist_12.cancel(ProcessStateCancelTest_$$_javassist_12.java)
| at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
| at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
| at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
| at java.lang.reflect.Method.invoke(Method.java:597)
| at org.jboss.el.util.ReflectionUtil.invokeMethod(ReflectionUtil.java:329)
| at org.jboss.el.util.ReflectionUtil.invokeMethod(ReflectionUtil.java:274)
| at org.jboss.el.parser.AstMethodSuffix.getValue(AstMethodSuffix.java:59)
| at org.jboss.el.parser.AstMethodSuffix.invoke(AstMethodSuffix.java:65)
| at org.jboss.el.parser.AstValue.invoke(AstValue.java:96)
| at org.jboss.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:276)
| at com.sun.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:68)
| at com.sun.facelets.el.LegacyMethodBinding.invoke(LegacyMethodBinding.java:69)
|
View the original post : http://www.jboss.com/index.html?module=bb&op=viewtopic&p=4165907#4165907
Reply to the post : http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&p=4165907
16 years, 4 months