[jboss-user] [JBoss jBPM] - org.hibernate.SessionException: Session is closed! error on

chrisrjcox do-not-reply at jboss.com
Mon Mar 10 12:18:52 EDT 2008


Hi,

I have an issue where I signal my token into the <<end-state>> node at the end of a process, then get a message org.hibernate.SessionException: Session is closed!


I have a class which signals a token to move the process from one <<task-node>> to the <<end-state>> node. 

The <<end-state>> node has a action handler which is invoked on node-enter, once the token.signal(); is initiated {TAG 1} (from the <<task-node>> prior), this works fine. However once this action handler is complete {TAG 2}. And the token.signal(); is completed {TAG 3}. The token is now in the <<end-state>> {TAG 4} and the jbpmContext.close(); is completed [TAG 5]. Once the Context is closed and my class is finished (there is no more code to implement) {TAG 6} I receive a 
org.hibernate.SessionException: Session is closed! stacktrace.

Below is a trace from the terminal.

  | 15:24:03,054 INFO  [STDOUT] PartTwoMDB: onMessage: Begining Token token = processInstance.getRootToken();
  | 15:24:03,054 INFO  [STDOUT] PartTwoMDB: onMessage: Completed Token token = processInstance.getRootToken();
  | 15:24:03,054 INFO  [STDOUT] PartTwoMDB: onMessage: Begining token.signal(); {TAG 1}
  | 15:24:03,061 WARN  [ProxyWarnLog] Narrowing proxy to class org.jbpm.graph.node.EndState - this operation breaks ==
  | 15:24:03,068 INFO  [STDOUT] SendMessageToQueueBackForPartOne: execute: Begining jndi = new InitialContext(); THIS IS THE "SendMessageToQueueBackForPartOne" ACTION HANDLER WITHIN THE <<end-state>> {TAG 2}
  | 15:24:03,069 INFO  [STDOUT] SendMessageToQueueBackForPartOne: execute: Completed jndi = new InitialContext();
  | 15:24:03,069 INFO  [STDOUT] SendMessageToQueueBackForPartOne: execute: Begining conFactory = (ConnectionFactory)jndi.lookup('ConnectionFactory');
  | 15:24:03,069 INFO  [STDOUT] SendMessageToQueueBackForPartOne: execute: Completed conFactory = (ConnectionFactory)jndi.lookup('ConnectionFactory');
  | 15:24:03,069 INFO  [STDOUT] SendMessageToQueueBackForPartOne: execute: Begining connection = conFactory.createConnection();
  | 15:24:03,089 INFO  [STDOUT] SendMessageToQueueBackForPartOne: execute: Completed connection = conFactory.createConnection();
  | 15:24:03,089 INFO  [STDOUT] SendMessageToQueueBackForPartOne: execute: Begining session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
  | 15:24:03,089 INFO  [STDOUT] SendMessageToQueueBackForPartOne: execute: Completed session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
  | 15:24:03,089 INFO  [STDOUT] SendMessageToQueueBackForPartOne: execute: Begining Queue queue = (Queue) jndi.lookup('queue/jbpmQueueOne');
  | 15:24:03,089 INFO  [STDOUT] SendMessageToQueueBackForPartOne: execute: Completed Queue queue = (Queue) jndi.lookup('queue/jbpmQueueOne');
  | 15:24:03,090 INFO  [STDOUT] SendMessageToQueueBackForPartOne: execute: Begining producer = session.createProducer(queue);
  | 15:24:03,090 INFO  [STDOUT] SendMessageToQueueBackForPartOne: execute: Completed producer = session.createProducer(queue);
  | 15:24:03,090 INFO  [STDOUT] SendMessageToQueueBackForPartOne: execute: Begining ProcessInstance processInstance = context.getProcessInstance();
  | 15:24:03,090 INFO  [STDOUT] SendMessageToQueueBackForPartOne: execute: Completed ProcessInstance processInstance = context.getProcessInstance();
  | 15:24:03,090 INFO  [STDOUT] SendMessageToQueueBackForPartOne: execute: Begining Token token = context.getProcessInstance().getRootToken();
  | 15:24:03,090 INFO  [STDOUT] SendMessageToQueueBackForPartOne: execute: Completed Token token = context.getProcessInstance().getRootToken();
  | 15:24:03,090 INFO  [STDOUT] SendMessageToQueueBackForPartOne: execute: Begining ContextInstance contextInstance = (ContextInstance) processInstance.getInstance(ContextInstance.class);
  | 15:24:03,090 INFO  [STDOUT] SendMessageToQueueBackForPartOne: execute: Completed ContextInstance contextInstance = (ContextInstance) processInstance.getInstance(ContextInstance.class);
  | 15:24:03,091 INFO  [STDOUT] SendMessageToQueueBackForPartOne: execute: Begining processInstanceIDLong = (Long)contextInstance.getLocalVariable('distributedProcessID', token);
  | 15:24:03,091 INFO  [STDOUT] SendMessageToQueueBackForPartOne: execute: Completed processInstanceIDLong = (Long)contextInstance.getLocalVariable('distributedProcessID', token);
  | 15:24:03,091 INFO  [STDOUT] SendMessageToQueueBackForPartOne: execute: processInstanceIDLong is ****209****
  | 15:24:03,091 INFO  [STDOUT] SendMessageToQueueBackForPartOne: execute: Begining processInstanceID = processInstanceIDLong.longValue();
  | 15:24:03,092 INFO  [STDOUT] SendMessageToQueueBackForPartOne: execute: Completed processInstanceID = processInstanceIDLong.longValue();
  | 15:24:03,092 INFO  [STDOUT] SendMessageToQueueBackForPartOne: execute: Begining bandName = (String)contextInstance.getVariable('bandName', token);
  | 15:24:03,092 INFO  [STDOUT] SendMessageToQueueBackForPartOne: execute: Completed bandName = (String)contextInstance.getVariable('bandName', token);
  | 15:24:03,092 INFO  [STDOUT] SendMessageToQueueBackForPartOne: execute: bandName is ****The Shockers****
  | 15:24:03,092 INFO  [STDOUT] SendMessageToQueueBackForPartOne: execute: Begining DistributedObject distributedObject = new DistributedObject();
  | 15:24:03,092 INFO  [STDOUT] SendMessageToQueueBackForPartOne: execute: Completed DistributedObject distributedObject = new DistributedObject();
  | 15:24:03,093 INFO  [STDOUT] SendMessageToQueueBackForPartOne: execute: Begining distributedObject.processID = processInstanceID;
  | 15:24:03,093 INFO  [STDOUT] SendMessageToQueueBackForPartOne: execute: Completed distributedObject.processID = processInstanceID;
  | 15:24:03,093 INFO  [STDOUT] SendMessageToQueueBackForPartOne: execute: Begining distributedObject.processID = processInstanceID;
  | 15:24:03,093 INFO  [STDOUT] SendMessageToQueueBackForPartOne: execute: Completed distributedObject.processID = processInstanceID;
  | 15:24:03,093 INFO  [STDOUT] SendMessageToQueueBackForPartOne: execute: Begining XStream xstream = new XStream();
  | 15:24:03,103 INFO  [STDOUT] SendMessageToQueueBackForPartOne: execute: Completed XStream xstream = new XStream();
  | 15:24:03,104 INFO  [STDOUT] SendMessageToQueueBackForPartOne: execute: Begining xstream.alias('distributedObject', DistributedObject.class);
  | 15:24:03,104 INFO  [STDOUT] SendMessageToQueueBackForPartOne: execute: Completed xstream.alias('distributedObject', DistributedObject.class);
  | 15:24:03,104 INFO  [STDOUT] SendMessageToQueueBackForPartOne: execute: Begining String xml = xstream.toXML(distributedObject);
  | 15:24:03,105 INFO  [STDOUT] SendMessageToQueueBackForPartOne: execute: Completed String xml = xstream.toXML(distributedObject);
  | 15:24:03,105 INFO  [STDOUT] SendMessageToQueueBackForPartOne: execute: XStreams has converted the distributedObject to the following xml<distributedObject>
  |   <processID>209</processID>
  |   <bandName>The Shockers</bandName>
  | </distributedObject>
  | 15:24:03,105 INFO  [STDOUT] SendMessageToQueueBackForPartOne: execute: Begining textMessage = session.createTextMessage(xml);
  | 15:24:03,105 INFO  [STDOUT] SendMessageToQueueBackForPartOne: execute: Completed textMessage = session.createTextMessage(xml);
  | 15:24:03,106 INFO  [STDOUT] SendMessageToQueueBackForPartOne: execute: Begining producer.send(textMessage);
  | 15:24:03,108 INFO  [STDOUT] SendMessageToQueueBackForPartOne: execute: Completed producer.send(textMessage);
  | 15:24:03,108 INFO  [STDOUT] SendMessageToQueueBackForPartOne: execute/finally: jndi != null: Begining jndi.close();
  | 15:24:03,108 INFO  [STDOUT] SendMessageToQueueBackForPartOne: execute/finally: jndi 1= null: Completed jndi.close();
  | 15:24:03,108 INFO  [STDOUT] *******************SendMessageToQueueBackForPartOne - COMPLETED ************************* HERE THE ACTION HANDLER HAS COMPLETED {TAG 2}
  | 15:24:03,108 INFO  [STDOUT] PartTwoMDB: onMessage: Completed token.signal(); {TAG 3}
  | 15:24:03,108 INFO  [STDOUT] PartTwoMDB: onMessage: Current Node EndState(end-state1) {TAG 4}
  | 15:24:03,108 INFO  [STDOUT] PartTwoMDB: onMessage(): Begining jbpmContext.close();
  | 15:24:03,119 INFO  [STDOUT] PartTwoMDB: onMessage(): Completed jbpmContext.close(); {TAG 5}
  | 15:24:03,121 INFO  [STDOUT] *******************PartTwoMDB - COMPLETED ************************* {TAG 6}
  | 15:24:03,122 WARN  [arjLoggerI18N] [com.arjuna.ats.arjuna.coordinator.TwoPhaseCoordinator_2] TwoPhaseCoordinator.beforeCompletion - failed for com.arjuna.ats.internal.jta.resources.arjunacore.SynchronizationImple at bfad6d
  | org.hibernate.SessionException: Session is closed!
  | 	at org.hibernate.impl.AbstractSessionImpl.errorIfClosed(AbstractSessionImpl.java:49)
  | 

If i manually move from the <<task-node>> to the <<end-state>> there is no error.

below is the code moving the token.


  | package com.distributed.jbpm.mdb;
  | 
  | import javax.ejb.MessageDriven;
  | import javax.ejb.ActivationConfigProperty;
  | 
  | 
  | import javax.jms.Message;
  | import javax.jms.MessageListener;
  | import javax.jms.TextMessage;
  | 
  | 
  | import org.jbpm.JbpmConfiguration;
  | import org.jbpm.JbpmContext;
  | 
  | import org.jbpm.context.exe.ContextInstance;
  | import org.jbpm.graph.exe.ProcessInstance;
  | import org.jbpm.graph.exe.Token;
  | 
  | import com.thoughtworks.xstream.XStream;
  | 
  | 
  | 
  | @MessageDriven(activationConfig =
  | 	{
  | 		@ActivationConfigProperty(propertyName="acknowledgeMode", propertyValue = "Auto-acknowledge"),
  | 		@ActivationConfigProperty(propertyName="destinationType", propertyValue="javax.jms.Queue"),
  | 		@ActivationConfigProperty(propertyName="destination", propertyValue="/queue/jbpmQueueTwo")
  | 	})
  | 
  | public class PartTwoMDB implements MessageListener
  | {
  | 	static JbpmConfiguration jbpmConfiguration = JbpmConfiguration.getInstance();
  | 	
  | 	long distributedProcessInstanceID;
  | 	
  | 	
  | 	
  | 	public void onMessage(Message inMessage)
  | 	{
  | 		System.out.println("PartTwoMDB: onMessage: Started");
  | 		TextMessage textMessage = null;
  | 		try
  | 		{
  | 			if(inMessage instanceof TextMessage)
  | 			{
  | 				textMessage = (TextMessage) inMessage;
  | 				System.out.println("PartTwoMDB: onMessage: Message received: "+ textMessage.getText());
  | 				
  | 				System.out.println("PartTwoMDB: onMessage: Begining XStream xstream = new XStream();");
  | 				XStream xstream = new XStream();
  | 				System.out.println("PartTwoMDB: onMessage: Completed XStream xstream = new XStream();");
  | 				
  | 				System.out.println("PartTwoMDB: onMessage: Begining xstream.alias('distributedObject', DistributedObject.class);");
  | 				xstream.alias("distributedObject", DistributedObject.class);
  | 				System.out.println("PartTwoMDB: onMessage: Completed xstream.alias('distributedObject', DistributedObject.class);");
  | 				
  | 				System.out.println("PartTwoMDB: onMessage: Begining String xml = textMessage.getText();");
  | 				String xml = textMessage.getText();
  | 				System.out.println("PartTwoMDB: onMessage: Completed String xml = textMessage.getText();");
  | 				
  | 				System.out.println("PartTwoMDB: onMessage: Begining DistributedObject distributedObject = (DistributedObject)xstream.fromXML(xml);");
  | 				DistributedObject distributedObject = (DistributedObject)xstream.fromXML(xml);
  | 				System.out.println("PartTwoMDB: onMessage: Completed DistributedObject distributedObject = (DistributedObject)xstream.fromXML(xml);");
  | 				System.out.println("PartTwoMDB: onMessage: distributedObject: "+ distributedObject.processID);
  | 				
  | 				
  | 				
  | 				System.out.println("PartTwoMDB: onMessage: Begining JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext();");
  | 				JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext();
  | 				System.out.println("PartTwoMDB: onMessage: Completed JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext();");
  | 				try
  | 				{
  | 					
  | 					
  | 					System.out.println("PartTwoMDB: onMessage: Begining ProcessInstance processInstance = jbpmContext.newProcessInstance('processTwo');");
  | 					ProcessInstance processInstance = jbpmContext.newProcessInstance("processTwo");
  | 					System.out.println("PartTwoMDB: onMessage: Completed ProcessInstance processInstance = jbpmContext.newProcessInstance('processTwo');");
  | 					
  | 					System.out.println("PartTwoMDB: onMessage: Current Node " + processInstance.getRootToken().getNode());
  | 					System.out.println("PartTwoMDB: onMessage: Current running process " + processInstance.getId());
  | 					
  | 					System.out.println("PartTwoMDB: onMessage: Begining ContextInstance contextInstance = (ContextInstance) processInstance.getInstance(ContextInstance.class);");
  | 					ContextInstance contextInstance = (ContextInstance) processInstance.getInstance(ContextInstance.class);
  | 					System.out.println("PartTwoMDB: onMessage: Completed ContextInstance contextInstance = (ContextInstance) processInstance.getInstance(ContextInstance.class);");
  | 					
  | 					distributedProcessInstanceID = distributedObject.processID;
  | 					
  | 					System.out.println("PartTwoMDB: onMessage: Begining contextInstance.setVariable('distributedProcessID', distributedProcessInstanceID);");
  | 					contextInstance.setVariable("distributedProcessID", distributedProcessInstanceID);
  | 					System.out.println("PartTwoMDB: onMessage: Completed contextInstance.setVariable('distributedProcessID', distributedProcessInstanceID);");
  | 					
  | 					System.out.println("PartTwoMDB: onMessage: Begining contextInstance.setVariable('bandName', 'The Shockers');");
  | 					contextInstance.setVariable("bandName", "The Shockers");
  | 					System.out.println("PartTwoMDB: onMessage: Completed contextInstance.setVariable('bandName', 'The Shockers');");
  | 					
  | 					System.out.println("PartTwoMDB: onMessage: Begining Token token = processInstance.getRootToken();");
  | 					Token token = processInstance.getRootToken();
  | 					System.out.println("PartTwoMDB: onMessage: Completed Token token = processInstance.getRootToken();");
  | 					
  | 					System.out.println("PartTwoMDB: onMessage: Begining token.signal();");
  | 					token.signal();
  | 					System.out.println("PartTwoMDB: onMessage: Completed token.signal();");
  | 					
  | 					System.out.println("PartTwoMDB: onMessage: Current Node " + processInstance.getRootToken().getNode());
  | 					
  | 					
  | 					
  | 					
  | 				}
  | 				finally
  | 				{
  | 					System.out.println("PartTwoMDB: onMessage(): Begining jbpmContext.close();");
  | 					jbpmContext.close();
  | 					System.out.println("PartTwoMDB: onMessage(): Completed jbpmContext.close();");
  | 					System.out.println("*******************PartTwoMDB - COMPLETED *************************");
  | 				}
  | 				
  | 			}
  | 			else
  | 			{
  | 				System.out.println("PartTwoMDB: onMessage(): Message of wrong type: " + inMessage.getClass().getName());
  | 			}
  | 		}
  | 		catch (Throwable t)
  | 		{
  | 			System.out.println("PartTwoMDB: Throwable cought");
  | 			t.printStackTrace();
  | 		}
  | 		
  | 	}
  | }
  | 


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

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



More information about the jboss-user mailing list