[jboss-user] [JBoss jBPM] - invalid reference, performance, db access, etc...

jstachera do-not-reply at jboss.com
Fri Dec 1 06:58:51 EST 2006


I am working on web application and I found some problems with JbpmContext. There are some issues that I am not fully aware:

1. If I do not close the context no changes will be saved to the database.
2. If for example I will get some reference to jbpm object:


  | TaskInstance taskInstance = context.getTaskInstance(wid);
  | 
   
   and for some reason I close the context then from that time on the reference to taskInstance is invalid end every attempt to call some method leads to exception -> "context was closed" - or smth like that.

Therefore, when I create my TaskInstance Bean (actually JbpmWorkItem) in the constructor I initialize all the fields that are used by getters methods of the bean.


  | public class JbpmWorkItem implements IWorkItem  {
  | 	static Log log = new Log();
  |  	/**
  | 	 *  session
  | 	 */
  | 	JbpmDefSession session;
  | 	/**
  | 	 *  work item id
  | 	 */
  | 	long workItemId;
  | 	/**
  | 	 *  process instance id
  | 	 */
  | 	long processInstanceId;
  | 	/**
  | 	 *  process definition id
  | 	 */
  | 	long processDefinitionId;
  | 	/**
  | 	 *  CurrentProcessObjectName
  | 	 */
  | 	String currentProcessObjectName;
  | 	
  | 	
  | 	/*
  | 	 * Task instance - actuall jbpm work item (task to do)
  | 	 */
  | 	
  | 	/** Cons
  | 	 * @param session - def session
  | 	 * @param wid - work item id
  | 	 * @throws JbpmAtflowException 
  | 	 */
  | 	public JbpmWorkItem(DefSession session, long wid) throws Exception {
  | 		this.session = (JbpmDefSession)session;
  | 		this.workItemId	= wid;
  |                 /* getContext() creates new context for logged user*/
  | 		JbpmContext context = this.session.getContext();
  | 		try {
  | 			TaskInstance taskInstance = context.getTaskInstance(wid);
  | 			processInstanceId = taskInstance.getToken().getProcessInstance().getId();
  | 			processDefinitionId = taskInstance.getToken().getProcessInstance().getProcessDefinition().getId();
  | 			currentProcessObjectName = taskInstance.getToken().getNode().getName();
  | 		}
  | 		catch (Exception e) {
  | 			log.error("Could not create work item: " + wid + ", actor: " + session.getLoggedOnUser().getName());
  | 			throw new JbpmAtflowException("Could not create work item: " + wid + ", actor: " + session.getLoggedOnUser().getName(), e);
  | 		}
  | 		finally {
  | 			context.close();
  | 		}
  | 	}
  | 

and here is the question is it correct way ?
My purpose of doing that was to minimize the number of accesses to the database. Since If I put the code with creating new context and closing it in every getter method just to access jbpm object it will probably decrease the performance. 

Am I right ? or Is Jbpm doing some caching so not every call to jbpm object method leads to database access to get the data  ?

BR,
Jurek

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

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



More information about the jboss-user mailing list