Example for Transaction Demarcation and Batching
package imagescript.atg.db;
import atg.repository.*;
import atg.dtm.*;
import javax.transaction.*;
import java.util.Enumeration;
import java.util.Iterator;
import java.util.ArrayList;
/**
* @copyright Copyright (c) 2001
* @company Art Technology Group
* @author Stuart Jones
* @version 1.0 ATG Training Supplemental Files
*/
// Just a place holder for your work
class Change
{
public Change() {}
}
public class TransactionDemo extends atg.nucleus.GenericService
{
public TransactionDemo()
{
}
TransactionManager mTransactionManager;
public void setTransactionManager(TransactionManager pTransactionManager)
{mTransactionManager = pTransactionManager;}
public TransactionManager getTransactionManager()
{return mTransactionManager;}
int getBatchSize()
{
return 100;// Whatever you want
}
// Returns false on error
boolean processChange(Change c)
{
boolean bResult = false;
try
{
// Do database interaction
//...
//...
// if we get here we are ok
bResult = true;
}
catch(Exception e)
{
error(e);
}
return bResult;
}
int processChanges(ArrayList changes)
{
// initialize
int numProcessed = 0;
int numCommited = 0;
int batchSize = getBatchSize();
TransactionDemarcation td = new TransactionDemarcation();
TransactionManager mgr = getTransactionManager();
try
{
td.begin(mgr);
// process each change
for (Iterator i = changes.iterator(); i.hasNext(); )
{
Change c = (Change)i.next();
// process the change
if(!processChange(c))
{
rollback();
return numCommited;
}
// commit the batch as appropriate
numProcessed++;
if (batchSize > 0 && numProcessed % batchSize == 0)
{
td.end();
numCommited = numProcessed;
td.begin(mgr);
}
}
}
catch (TransactionDemarcationException tde)
{
error(tde);
rollback();
}
finally
{
try
{
td.end();
numCommited = numProcessed;
}
catch (TransactionDemarcationException tde)
{
error(tde);
rollback();
}
}
return numCommited;
}
//-------------------------------------
/**
* Mark the current transaction to be rolled
* back, logging any checked exceptions
**/
void rollback()
{
if (isLoggingDebug())
logDebug("rollback()");
try
{
TransactionManager mgr = getTransactionManager();
if (mgr != null)
mgr.setRollbackOnly();
}
catch (SystemException se)
{
error(se);
}
}
private final void error(Throwable pThrowable)
{
if (isLoggingError())
logError(pThrowable);
}
}
|