[jboss-user] [EJB 3.0] - Transaction is not active after rollback

X490812 do-not-reply at jboss.com
Fri Aug 10 19:02:02 EDT 2007


The issue is that I have a stateless EJB using CMT with the following problem:
a function X, having default transaction attribute (required)  has a loop and calls another function Y with a transaction attribute of REQUIRES_NEW. Function Y does a SessionContext.setRollbackOnly. First itration calls Function Y, does rollback and exits. Second iteration of loop, function Y is called and I get the following; the error occurs during the getConnection() call in the JBPMDao.removeEndedProcesses(pidVec) function (see below)


anonymous wrote : org.jboss.util.NestedSQLException: Transaction is not active: tx=TransactionImpl:XidImpl[FormatId=257, GlobalId=ro-0029aits/49, BranchQual=, localId=49]; - nested throwable: (javax.resource.ResourceException: Transaction is not active: tx=TransactionImpl:XidImpl[FormatId=257, GlobalId=ro-0029aits/49, BranchQual=, localId=49])


Here is the code

  | /**
  | 	 * Method: cleanupEndedProcesses
  | 	 * Purpose: Called from a servlet to cleanup runtime data for ended processinstances
  | 	 * @param processId
  | 	 */
  | 	public void cleanupEndedProcesses(String processId)
  | 	{
  | 
  | 		JbpmDAO jbpmDAO = null;
  | 		Vector<String> pidVec = new Vector<String>();
  | 		List<String> tmpList;
  | 		int cnt = 0;
  | 		int BATCHSIZE = 500;
  | 		int endNdx = 0;
  | 
  | 		try {
  | 			logger.debug("cleanupEndedProcesses:: start");
  | 			jbpmDAO = new JbpmDAO();
  | 			pidVec = jbpmDAO.getEndedProcesses(processId);
  | 			while (pidVec.size() > 0)
  | 			{
  | 				endNdx = pidVec.size() > BATCHSIZE? BATCHSIZE:pidVec.size();
  | 				tmpList = new ArrayList<String>(pidVec.subList(0, endNdx));
  | 				batchRemoveEndedProcesses(tmpList, jbpmDAO);
  | 				cnt += endNdx;
  | 				pidVec.removeAll(tmpList);
  | 			}
  | 		}
  | 		catch (Exception e) {
  | 			throw new WorkflowException(e);
  | 		}
  | 		logger.debug("cleanupEndedProcesses:: pids removed = " + cnt);
  | 		
  | 	}
  | 
  | 
  | 	/**
  | 	 * Method: batchRemoveEndedProcesses
  | 	 * Purpose: separated out so that we could batch deletes
  | 	 * @param pidVec
  | 	 * @param jbpmDAO
  | 	 */
  | 	@TransactionAttribute(javax.ejb.TransactionAttributeType.REQUIRES_NEW)
  | 	private void batchRemoveEndedProcesses(List<String> pidVec, JbpmDAO jbpmDAO)
  | 	{
  | 		try {
  | 		jbpmDAO.removeEndedProcesses(pidVec);
  | 		context.setRollbackOnly();
  | 		}
  | 		catch (Exception e) {
  | 			throw new WorkflowException(e);
  | 		}
  | 	}
  | 


  | public void removeEndedProcesses(List<String> pidVec)
  | 	{
  | 		String strQuery = DELETE_JBPM_PROCESSINSTANCES;
  | 		Connection con = null;
  | 		PreparedStatement pstmt = null;
  | 
  | 		try {
  | 			con = getJbpmDataSource().getConnection();
  | 			String strInClause = constructInClause(pidVec);
  | 			strQuery = strQuery.replaceAll(":list", strInClause);
  | 			pstmt = con.prepareStatement(strQuery);
  | 			bindVarsToInClause(pidVec, 1, pstmt);
  | 			pstmt.executeUpdate();
  | 		}
  | 		catch (SQLException e) {
  | 			throw new LoggableEJBException(e);
  | 		}
  | 		finally {
  | 			try {
  | 				if (pstmt != null)
  | 					pstmt.close();
  | 				if (con != null)
  | 					con.close();
  | 			}
  | 			catch (SQLException e) {
  | 				throw new LoggableEJBException(e);
  | 			}
  | 		}
  | 		
  | 	}
  | 

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

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



More information about the jboss-user mailing list