[jboss-user] [jBPM] - Re: New process instance created but no task insert in db
Sandra Renaud
do-not-reply at jboss.com
Tue Jun 25 02:54:54 EDT 2013
Sandra Renaud [https://community.jboss.org/people/joploya] created the discussion
"Re: New process instance created but no task insert in db"
To view the discussion, visit: https://community.jboss.org/message/824694#824694
--------------------------------------------------------------
Hello Demian,
Thank you for your answer. Sur I will give my code. I use the localTaskService.
This is the producer for knowledgeSession :
@Stateless
@LocalBean
public class KnowledgeSessionProducer implements Serializable{
private static final long serialVersionUID = -4494168896880405667L;
private Logger log = LoggerFactory.getLogger(KnowledgeSessionProducer.class);
private KnowledgeRuntimeLogger logger;
private StatefulKnowledgeSession ksession;
@PersistenceUnit(unitName = "org.jbpm.task")
private EntityManagerFactory emf;
private @Inject RecoveryDao recoveryDao;
public @PostConstruct void init(){
log.debug("init of KnowledgeSessionProducer ...");
// By Setting the jbpm.usergroup.callback property with the call
// back class full name, task service will use this to validate the
// user/group exists and its permissions are ok.
InputStream usergroupsin = KnowledgeSessionProducer.class.getResourceAsStream( "/jbpm.usergroup.callback.properties" );
if(usergroupsin != null) {
Properties callbackproperties = new Properties();
try {
callbackproperties.load(usergroupsin);
UserGroupCallbackManager.getInstance().setCallbackFromProperties(callbackproperties);
log.debug("Task service registered usergroup callback ...");
} catch (Exception e) {
log.debug("Task service unable to register usergroup callback ...");
}
}
if(UserGroupCallbackManager.getInstance().existsCallback()){
System.out.println("userGroupCallBack exists ! :)");
}else{
System.out.println("userGroupCallBack don't exist ! :(");
}
TaskService taskService = new TaskService(emf, SystemEventListenerFactory.getSystemEventListener());
taskService.setUserinfo(new AMSUserInfoImpl());
TaskServiceSession taskSession = taskService.createSession();
// Add users
@SuppressWarnings("rawtypes")
Map vars = new HashMap();
InputStream usersin = KnowledgeSessionProducer.class.getResourceAsStream( "/LoadUsers.mvel" );
if(usersin != null) {
Reader reader = new InputStreamReader( usersin );
@SuppressWarnings("unchecked")
Map<String, User> users = ( Map<String, User> ) TaskService.eval( reader, vars );
log.debug("Users to load in db : ...");
for ( User user : users.values() ) {
taskSession.addUser( user );
log.debug(" - "+user);
}
}
InputStream groupsin = KnowledgeSessionProducer.class.getResourceAsStream( "/LoadGroups.mvel" );
if(groupsin != null) {
Reader reader = new InputStreamReader( groupsin );
@SuppressWarnings("unchecked")
Map<String, Group> groups = ( Map<String, Group> ) TaskService.eval( reader, vars );
log.debug("Groups to load in db : ...");
for ( Group group : groups.values() ) {
taskSession.addGroup( group );
log.debug(" - "+group);
}
}
taskSession.dispose();
log.debug("Task service started correctly!");
log.debug("Task service running ...");
}
@Produces
@ApplicationScoped
public StatefulKnowledgeSession produceKnowledgeSession(){
log.debug("produce the KnowledgeSession ...");
//Create the knowledgeBase
/*This factory is used to build the knowledge base resources that are held collectively in KnowledgePackages.*/
KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
//Add all processes to the knowledgeBuilder
List<Resource> resources = getProcessDefinitionList();
for (Resource resource : resources) {
kbuilder.add(resource, ResourceType.BPMN2);
}
/*Create a new KnowledgeBase from the knowledge packages that have been added to this builder.
* An exception is thrown if there are any errors.*/
// assertFalse( kbuilder.hasErrors() );
if ( kbuilder.hasErrors() ) {
log.error( kbuilder.getErrors().toString() );
}
KnowledgeBase kbase = kbuilder.newKnowledgeBase();
Environment env = KnowledgeBaseFactory.newEnvironment();
env.set( EnvironmentName.ENTITY_MANAGER_FACTORY, emf );
if(kbase != null){
System.out.println("knowledge base NOT null");
for(org.drools.definition.process.Process p :kbase.getProcesses()){
System.out.println(" - process "+p.getName()+" ["+p.getId()+"]");
}
}
//TODO
/*
* recover a persistent knowledge session or instanciate a new one
*/
int sessionId = recoveryDao.getPersistentKnowledgeSession();
if(sessionId < 0){
ksession = JPAKnowledgeService.newStatefulKnowledgeSession(kbase, null, env);
KnowledgeSessionRecovery kSessionRecovery = new KnowledgeSessionRecovery(ksession.getId());
recoveryDao.savePersistentKnowledgeSession(kSessionRecovery);
}else{
ksession = JPAKnowledgeService.loadStatefulKnowledgeSession(sessionId, kbase, null, env);
}
/*Create a new StatefulKnowledgeSession using the default session configuration.
* Don't forget to dispose() session when you are done.
* Long term out of the box persistence of runtime state with JPA is possible with Drools & jBPM.
*
* StatefulKnowledgeSession is the most common way to interact with the engine.
* A StatefulKnowledgeSession allows the application to establish an iterative conversation with the engine,
* where the state of the session is kept across invocations.*/
// StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
System.out.println(" !!!! DEBUG SESSION PERSISTENCE : new session with id : "+ksession.getId()+" !!!!");
logger = KnowledgeRuntimeLoggerFactory.newThreadedFileLogger(ksession, "loggerFile", 1000);
KnowledgeRuntimeLoggerFactory.newConsoleLogger(ksession);
/*A work item manager is responsible for finding the right work item handler when a work item should be executed
* and should be notified when this work item has been completed (or aborted).
*
* Register the given handler for all work items of the given type of work
* This part is done in the LocalHumanTaskService*/
WorkItemHandler wihHT = new HumanTaskHandler();
ksession.getWorkItemManager().registerWorkItemHandler("Human Task", wihHT );
// ksession.getEnvironment().set(EnvironmentName.ENTITY_MANAGER_FACTORY, emf);
/*
* Register WorkItem Handler for Email
*/
// EmailWorkItemHandler emailHandler = new EmailWorkItemHandler();
// ksession.getWorkItemManager().registerWorkItemHandler("Email", emailHandler);
return ksession;
}
public KnowledgeRuntimeLogger getLogger(){
return this.logger;
}
@PreDestroy
public void end(){
ksession.dispose();
log.debug("ksession disposed");
}
private List<Resource> getProcessDefinitionList(){
List<Resource> resourceList = new ArrayList<>();
resourceList.add(ResourceFactory.newClassPathResource("workflows/com.st.ams.flows.datacorrections.bpmn2"));
resourceList.add(ResourceFactory.newClassPathResource("workflows/com.st.ams.flows.newfinishedgood.bpmn2"));
resourceList.add(ResourceFactory.newClassPathResource("workflows/com.st.ams.flows.newproductline.bpmn2"));
resourceList.add(ResourceFactory.newClassPathResource("workflows/com.st.ams.flows.nfep.bpmn2"));
resourceList.add(ResourceFactory.newClassPathResource("workflows/com.st.ams.flows.newcpbeforem29commontrunk.bpmn2"));
resourceList.add(ResourceFactory.newClassPathResource("workflows/com.st.ams.flows.newcpbeforem29.bpmn2"));
/**
* TODO
* add all other process here
*/
return resourceList;
}
}
and here the method in a class where I put all functions to interact with the engine :
/**
* Start a new processInstance of an existing Process
* and set the variables of this instance
* @param processId, map of variables
* @return ProcessInstance created
*/
public ProcessInstance startProcess(String processId, Map<String, Object> parameters){
ProcessInstance p = kSession.startProcess(processId,parameters);
return p;
}
/**
* Return the WorkflowProcessInstance associated to a Task
* This instance allow to access the map of variables
* @return WorkflowProcessInstance managed
*/
public WorkflowProcessInstance getWorkflowProcessInstance(long processInstanceId){
return (WorkflowProcessInstance)kSession.getProcessInstance(processInstanceId);
}
/**
* This method allow to access object store in
* process instance variables
* @return an object link to the processInstance
*/
public Object getProcessVariable(final Long processInstanceId, Long taskId, String key){
Object retObj = null;
WorkflowProcessInstance wpi = (WorkflowProcessInstance)kSession.getProcessInstance(processInstanceId);
if((wpi == null) || (wpi.getVariable(key) == null)){
System.out.println("workflow process instance is null :-(");
Map<String, Object> variables = kSession.execute(new GenericCommand<Map<String, Object>>() {
public Map<String, Object> execute(Context context) {
StatefulKnowledgeSession ksession = ((KnowledgeCommandContext) context).getStatefulKnowledgesession();
org.jbpm.process.instance.ProcessInstance processInstance = (org.jbpm.process.instance.ProcessInstance) ksession.getProcessInstance(processInstanceId);
VariableScopeInstance variableScope = (VariableScopeInstance) processInstance.getContextInstance(VariableScope.VARIABLE_SCOPE);
Map<String, Object> variables = variableScope.getVariables();
return variables;
}
});
System.out.println("variables size : "+variables.size());
for(String str : variables.keySet()){
System.out.println(" - "+str);
}
retObj = variables.get(key);
}else{
System.out.println("workflow process instance is NOT null :-)");
retObj = wpi.getVariable(key);
}
if(retObj == null){
System.out.println(" get variable return null ::-(");
}else{
System.out.println(" get variable return "+retObj.toString()+" |-)");
}
return retObj;
}
Thanks again.
--------------------------------------------------------------
Reply to this message by going to Community
[https://community.jboss.org/message/824694#824694]
Start a new discussion in jBPM at Community
[https://community.jboss.org/choose-container!input.jspa?contentType=1&containerType=14&container=2034]
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.jboss.org/pipermail/jboss-user/attachments/20130625/c7e18172/attachment-0001.html
More information about the jboss-user
mailing list