Losing variables of scope BUSINESS_PROCESS
jetztmoginimmer Sep 21, 2009 6:01 PMI am trying to implement the Google image labeler using Seam (2.2.0 GA/JBoss: 5.1.0 GA).
- The entity
gameSession
(see below) holds the context for a game session. - The stateless component
gameSessionBean
(see below) manages the gameSession. - The workflow is defined as jbpm business process (see below).
Unfortunately, I am losing the (game) business process variable while executing the business process.
- The process starts with the node
start round
and I can access #{gameSessionBean.startRound()} to start the round. Everyting seems to be alright according to the Eclipse debugger. - The process forks to two players. Both need to pass their own task node (
label image
), that can again access gameSessionBean without problems. Having labeled the image, the processing path joins again. - However, in the transition
end round
after the jbpm join node, I cannot access gameSessionBean anymore. It is NULLed out. Why?
I tried solutions that are proposed in the Web:
* @BypassInterceptors for the entity * Using explicit @Out(scope = ScopeType.BUSINESS_PROCESS, required = false)
What can I do to have a variable that is permanently scoped to the instance of a business process? Even the APPLICATION scope is not available during the execution of #{gameSessionBean.endRound()}. Is this a bug???
This post may be related to:
- http://seamframework.org/Community/OutjectedScopeTypeBUSINESSPROCESSJBPMVariableScopeTaskOrProcess
- http://lists.jboss.org/pipermail/jboss-user/2007-June/062449.html
Code snippets:
@Entity @Name("gameSession") @Scope(ScopeType.BUSINESS_PROCESS) public class GameSession implements Serializable { @GeneratedValue @Id private Integer id; [...] }
@Name("gameSessionBean") @Scope(ScopeType.STATELESS) public class GameSessionBean implements Serializable { @In(create = true) @Out public GameSession gameSession; @CreateProcess(definition="") private String startBusinessProcess(String string) { return "game" } @EndTask @StartTask public String startTask() { return "game"; } }
<?xml version="1.0" encoding="UTF-8"?> <process-definition name="gameImageLabeler"> <start-state name="start"> <transition to="start round" name="start game"></transition> </start-state> <task-node name="[p1] label image"> <task name="labelImage" description="Player A"> <assignment actor-id="#{gameSessionBean.getPlayerId(0)}" /> </task> <transition to="join1" name="[p1] wait for p2"></transition> </task-node> <task-node name="[p2] label image"> <task name="labelImage" description="Player B"> <assignment actor-id="#{gameSessionBean.getPlayerId(1)}" /> </task> <transition to="join1" name="[p2] wait for p1"></transition> </task-node> <fork name="fork1"> <transition to="[p1] label image" name="[p1] label image"></transition> <transition to="[p2] label image" name="[p2] label image"> <action></action> </transition> </fork> <join name="join1"> <transition to="new or end" name="end round"> <action name="end round" expression="#{gameSessionBean.endRound()}"></action> </transition> </join> <node name="start round"> <transition to="fork1" name="init round"> <action name="init round" expression="#{gameSessionBean.startRound()}"></action> </transition> </node> <decision name="new or end" expression="#{(gameSessionBean.hasNextRound()) ? 'to init round' : 'end game session'}"> <transition to="done" name="end game session"></transition> <transition to="start round" name="to init round"></transition> </decision> <end-state name="done" /> </process-definition>