This is an old revision of the document!


The following example shows the code for the simple process component that changes the attribute of the process input.

public class SimpleProcess implements IProcess
{
    public SimpleProcess()
    {
    }
    /**
     * @see com.bas.basserver.executionengine.IProcess#cancel()
     */
    @Override
    public boolean cancel()
    {
        return true;
    }
    /**
     * @see com.bas.basserver.executionengine.IProcess#execute(com.bas.basserver.executionengine.IExecutionEngine,java.lang.Object[])
     */
    @Override
    public Object execute(IExecutionEngine engine, Object[] parameters)
    throws SuspendProcessException, ExecutionException, AccessDeniedException
    {
        // one entity is declared as process input
        if (parameters== null || parameters.length!=1 || !(parameters[0] instanceof IEntity))
        {
            return null;
        }
        // get the parameter
        IEntityentity=(IEntity)parameters[0];
        Object oldValue = null;
        try
        {
            // change "attrName" attribute to "attrValue" in memory
            oldValue = entity.getAttributeValue ("attrName");
            entity.setAttributeValue("attrName","attrValue");
        }
        catch (Exception e)
        {   
        }
        try
        {
        // update entity in persistence
            engine.updateEntity(this, entity,
                new String[]{"attrName"}, 
                new Object [] {oldValue} );
        }
        catch (ServerTimeOutExceptionste)
        {
            throw new SuspendProcessException(ste);
        }
        return null;
    }
    /**
     * @see com.bas.basserver.executionengine.IProcess#resume(com.bas.basserver.executionengine.IExecutionEngine,java.lang.Object)
     */
    @Override
    public Objectresume(IExecutionEngineengine,Objectreply)
    throws SuspendProcessException, ExecutionException, AccessDeniedException
    {
        return null;
    }

The next example shows the code of the process that performs some lengthy calculation and throws SuspendProcessException every now and again:

public class LongProcess implements IProcess
{
    private boolean m_cancelled = false;
    private long m_count;
    public LongProcess()
    {
    }
    /** @see IProcess#cancel()*/
    @Override
    public boolean cancel()
    {
        // set m_cancelled flag. This flag will be checked by execute // and resume methods
        synchronized (this)
        {
            m_cancelled = true;
        }
        return true;
    }
    /**
     * @see IProcess#execute(IExecutionEngine, Object[])
     */
    @Override
    public Object execute(IExecutionEngine engine, Object[] parameters)
    throws SuspendProcessException, ExecutionException
    {
        m_count=0;
        execute(engine);
        return null;
    }
    private void execute(IExecutionEngine engine)
    throws SuspendProcessException
    {
        try
        {
            // get the context in which the process is running
            IExecutionContextmyContext = engine.getExecutionContext(this);
            while (true)
            {
                Thread.sleep(500);
                // finish after 400 iterations
                if (m_count++ >=400)
                    break;
                    // every 4 iterations update our progress
                if (m_count % 4==0)
                {
                    int progress = myContext.getProgress ();
                    if (progress<100)
                        myContext.setProgress (progress + 1);
                }
                // check if we have been cancelled
                synchronized (this)
                {
                    if (m_cancelled)
                        break;
                }
                // every 120 iterations suspend ourselves so that
                // transaction can be committed (though this is 
                // only for illustrational purposes as we are not 
                // doing any transactional operations here such as 
                // changing values of attributes etc)
                if (m_count % 120 == 0)
                {
                    throw new SuspendProcessException (true);
                    // we will be called soon – see resume
                }
            }
        }
        catch (InterruptedException ie)
        {            
        }
    }
    /**
     * @see IProcess#resume(IExecutionEngine,Object)
     */
    @Override
    public Object resume (IExecutionEngine engine, Object reply)
    throws SuspendProcessException, ExecutionException
    {
        // this is called every 120 iterations
        execute (engine);
        return null;
    }
  • Last modified: 2023/04/05 05:57